pax_global_header00006660000000000000000000000064122151307450014512gustar00rootroot0000000000000052 comment=1e2f1d160336be07411775c476bfed3c7673263f Catch-1e2f1d160336be07411775c476bfed3c7673263f/000077500000000000000000000000001221513074500173155ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/.gitignore000066400000000000000000000011651221513074500213100ustar00rootroot00000000000000*.build *.pbxuser *.mode1v3 *.ncb *.suo Debug Release *.user *.xcuserstate .DS_Store xcuserdata CatchSelfTest.xcscheme Breakpoints.xcbkptlist projects/VS2010/TestCatch/_UpgradeReport_Files/ projects/VS2010/TestCatch/TestCatch/TestCatch.vcxproj.filters projects/VisualStudio/TestCatch/UpgradeLog.XML UpgradeLog.XML projects/XCode4/iOSTest/Build/Intermediates/PrecompiledHeaders projects/XCode4/iOSTest/Build/Products/Debug-iphonesimulator/iOSTest.app.dSYM/Contents/Resources/DWARF projects/XCode4/iOSTest/Build projects/XCode4/CatchSelfTest/DerivedData projects/XCode4/OCTest/DerivedData *.pyc projects/XCode4/iOSTest/DerivedData Catch-1e2f1d160336be07411775c476bfed3c7673263f/LICENSE_1_0.txt000066400000000000000000000025211221513074500215770ustar00rootroot00000000000000Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Catch-1e2f1d160336be07411775c476bfed3c7673263f/README.md000066400000000000000000000020301221513074500205670ustar00rootroot00000000000000![catch logo](catch-logo-small.png) *v1.0 build 10 (master branch)* # New release with significant changes [Please see this page for details - including some breaking changes](docs/whats-changed.md) ## What's the Catch? Catch stands for C++ Automated Test Cases in Headers and is a multi-paradigm automated test framework for C++ and Objective-C (and, maybe, C). It is implemented entirely in a set of header files, but is packaged up as a single header for extra convenience. ## How to use it This documentation comprises these three parts: * [Why do we need yet another C++ Test Framework?](docs/why-catch.md) * [Tutorial](docs/tutorial.md) - getting started * [Reference section](docs/reference-index.md) - all the details The documentation will continue until morale improves ## More * Issues and bugs can be raised on the [Issue tracker on GitHub](https://github.com/philsquared/Catch/issues) * For discussion or questions please use [the dedicated Google Groups forum](https://groups.google.com/forum/?fromgroups#!forum/catch-forum) Catch-1e2f1d160336be07411775c476bfed3c7673263f/catch-logo-small.png000066400000000000000000001444161221513074500231630ustar00rootroot00000000000000PNG  IHDRX"%7 DiCCPICC ProfileH wTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg` pHYs  niTXtXML:com.adobe.xmp Acorn version 3.5.1 5 72 72 *@IDATxtEń9YQȢiULI@E FT(H|A.Sy'83ޮ>}+uuw>=3p ayZ`UV74-{(W4tyq![ [ [ [ [ [@lefHO>E@qOp_Merz>+h3%/>CݨuADK;_Qv79 $[ [ [ [`[ X"5ar`u?]AB#OP2eUw/T?'Yad d d d ,k kw/VkJ7 'y_+[TxtJg$C@@@@EuyZjiM#(W B ]~ND(BllllledYF*/}UX?4>PJ ˯W}SL@@@rlNuW@+Av  ٵu4Y`yd d d d d ̻4{OA "S y5+X9QS`@z?Lѿgr>[ [ [ [`y[ XsZٿ XW`S { &C d "UUicͅEp@EvAgЯJT1rɐwd 7Z X7b.rj] tnbӵ1bs0$*6] QOõu)T.|fB'od[!|N2wt+C@@@r@(Gx'%upNi0L/x׵ /IYH`ŷ) UMwLlJPɷdVYz9NLpax8AA ^'5V_E`|`'Ѱ,ཕlv̯ g g@@Z`=?"iQ&bo3sHHW zCB1H^ ro* ~ S `d^t,ȵ$allllldY/P˺@_+)o;@ wT@uk<%7,\+![v)Mj=Xj3j#;b X-n:˅, DVPLp+AZX5;U{ ,4a`|Rtxmy ោKFȐ----bpuD]ǻ"]IF~+vzJg*y\ P|ʲsA߹T,V@@@4-iڣs^.av~ɻ4J"'D!X=Cׯ:""bMH@|tR ^?"d:B)ׅ:RO"J$  M?^8sQ*QxBTzzg-N@@@"@q^|_>J8@S9o%]w tH]Yh!lbC8"h醍; TE?C@@@"@}SkwV R] ;`CiwL yzʲ-6dv@H@~| NlllllС" Bp+lsQ[u"=DTb!?j HYLA,|.~C)6/wZxsk[ v@WȢ|ѕoDn^w FVagŠW4Jإ;W$C@@@@9ꛢL! C]WݡZ,]% MķM$% ͵X9"0 ?U.@llll,LҼRvNvZJ+8M, H[|57ɨIedXZ阂I]wh^9XV58R\-]\q@şݖ*(8 9WVA?_9Zw~+aya_-tU!:ׁ6JNZ XcS&AM;n-2*xARE?N 'G0bתxn)g8QLO$ƒҗAllllŰT*d.+ ]!|x5gZ"]ssY͓?FHo $}R t$82$[ [ [ [ [iA,/ӂ'%;;ݥ6%.x_&%-om?K/f=/~4*\2/$:A\4Bl*&,_62_:DNp΁C&tDq[`׉/+>&v\G>(|2<]=?mvZ~GPutSEP9$_9flyy걏25VWf }= [9`c$!<*˫.^ 6En-t@YwN5v <^*S۩ @F'.\K_@ڂ#-wFfn&ݫTB<> H dMkO.~^:@4!0]++\' ?/[va?lHX|U*X;V)~D:]*@xQQ3t![ [ [`^,=u-(C$2$\y ' _.ijxV@tgvяo'$P@/(;57v-^ ?'k 2SyWGDE-_CwWxȯשyӄ'J@+쑓llv,P[|;L `T9+-HFB] vg(?RNP%xJ>Tv5᷇Ů6 rOU&WAUB.lR0-"',ؙ'*uܒ/&s\gcw[u-`/rUT\7"o؋BgV~ Eׁ !)$(߆^e .T$r"B&_8fwP>Bxo!gՊeJEtE}NzɗvS%WY3k!OY4 b3/'нNިbNsUH)QPO_6)LD'gL[|ءkpPH@MHy$Q@'nw VG $An``iG'.gKC0ji"_M8RxyT Vr+g`ةh+1QMܻ:l_ ᓂz1kp*E@d8KO yu %/{qPUّzp;P tAM'"ec.gڊe~ӳynpnvg eE<.8/{r%"йQ|]r΂+逼 y#AM]USB_QHx[@,!%>*cZt!nۑ.&r`W&Y` x9e7&M— 7MO ykDkAfhG[Y|q&`{jBtX[Mx>@:2 kV̯@ ?#LADvă wq*{BԒ|cXO_EK9[ [` ݫ)sI <^|PYԌXpпneQsO'fX`EOb7#ǫG9U7XLbU! iP/ gtjU )hZvNxw l7 q/-^ Jɐ--0'ґ xx5RVar[c.@zLΕ(]M yFꀢBe?^N'pb:h2,?ߎ㛂 +_A |[dVնb"S!辔~D `K*$d ,\ph18Dq鄹UFK"@q~L^1L޻%@i &9<@;`޽z }[ʿ^v+t:~ ~"Wȭ +Y貞' 84^_O/N)MoW} Kޭb׉9 @tYm¢Դҫ-ޯg *ojV[%/Vi!Vb_)EQT9 \Jc'tl ӯg>P8^ӾJg}'8^'LHpC/d^Av:fYd d ,5 ?D?_"K(PCՙn4 ޫA )>}PQi;zo/vLp*``o>Wn<]$ _J@D A%s?Tx"Jn}@3d d ,] twP4_uf#d\4bYZ7h   p&6q{'m/'M:;* K$ķ 6JR;k%@o:M;S)hI'KSRg 9Ku~t&m}?0| (;^@YY)?us݆K]`bۂ8TЯ(LdS[w,*AQՒW(@w`! 7P ~.\H &%J[鲻J ,PdX`<^×79-г ;)]+$z D gq'WtG!SHM 0V7(5>X|@s7;@lvelX$?lՂEi463yRQv:gp&Ҟ隸؎omH$*mG*i\00#ϑAfP/bi~`7d8,b!}#dkAz-ek>s Rpt31'z.䏯2=?vȧAzY`͖$vy 4<&^MIB0)yסl,v&E*-ܢQzu_W&k;.[ OMo/6PN5`C ӽ cwd!;T ^hJ(^D s`OKGmsv>F\IZc{D'e.u#Ylˤ>MT<ڡv&=M*A_ :eKum;HޯRiJ*.2 |N>[!OVT SPye :mglYY*}d.(;\j@9YZM*k"Pg}YJxYzuez-Y@igIsӄL( ^[q$ɈW\E?ؕNST |Cn&'{ʻ5쏝D 4ūOD2Yi$t2d ̳v ᪌+Jy& gXn%sp pYj~zqYkL;KJ7rJ8/ʯi m-)H͗>B`̴C&BΈá V).!?#0s ?CGvHo _(.P ,G͜S oq`j5μ@S>d X}Opz:1+ ayY%gOHGZݧ:, r+ģŴ;i2@`EPɹL| z .]W<]  oQ2N]TnlEb4c{!sչ hE1.s,`_t5!&f0̵Xx*?  ٩`.x2S D_2?:d2uQVf$HִG zȇ}C&AlX)IJ^Xg_)M \'ӽKetZ߃BX/ce:~=H0Tu)q a%eJ7b(}:h8Z{Egje UiWO1Ur~!LT^qDo*$B&A/=tB ?#P@9m.% x7`J`1>9#aqehuCg.yu,vUA8|GiKAˉ +kWZ5Ȭ ?\E+gl.9 |ϞKUX:KTɢZw;p݂߯hŸ.0~\.dXFRWO/;kb;RF :şIm$tT#lJBd\ݢ;0i׵. .>?Pya-d-X`llՁF4O!,n h$bM%>LFT. J.kDx7nka ;o\#BU}.ZKV]'>\U6W煌W!mz8PC/"Z51ʫ&+O(NTݪ?0 x]Mdcb?(U _ W_=;r&H&QW/nA/|> vhH|\j pL"ٶ7#EsoIאQMV&+Bȟd^)u`=2d d ,GDqc~^KZNzNUWӯ٪\}E Z8xA]Ut[~KQZXۯ_݅TyVtؗIHDs!W3aQ'22g1hEP3V|#+R^9"K{pC!;(dO\ =q7'[zcYד]X \kĺa_74MHZKŪ'g^]!:dnv&6hֆ8t?9 U$]xN|Sזv $`>XNN|NP+@7:DE)X6Btd'%Bnc=BBA@0BiYGu`JYp4uNhYe=4+Xل Eb)/-Jז{M:AZLO M-סk/Ʌ(2@$-"w#U}m9Yp$JS`B e{G o!,wlכၯ%;}̣H+ڶ}a| Fe!e \#zq&/a hbW>vj?9s%uh3.wq;')A]}p e_aQWGohP<<-d&!C7&!{JLW$^s@t7W~wq`+| 艼yAA ]ͯ (=J2d @]uܻY~J*. `JR莡T*g~nL%H;J)v2i4~7QX4|]8^E?QƯ 2@X vV~؎6W|pS.I - /B+tC>| ('xm|)ϐ-ж<7qeN4l,(כ )IVk(T~uCKy;EU K%̃^`CZ0/]U8__ bhHo]]"GT\ =ߦjy'bvSgP NO_?u1ߌz~&!vOvOĞ Y)"R@ x\nus.+Ѽ?]|3ԻʟuBy|eUA0\T2B:a3\, ?M'!vnX_.z ٍ*8Ud8lv4@IR" LaH#ς\A0m_Plb;ћ8Ud!:!_ݠQM+wV2W`8)A!QTߩτf=.Wn*Pw ZrjL~=vX,'n9_=^J L@DQ!IwUSp&h#57:eVm&:>(NP B"BQ&6 3$ۏ#WO4*Q֩TeHlJdUc0_ ;-ϙ@G%BALTִ$},͗oi<֒9~cBaLx³?Qdw%)z?7U}6*3 UL`5ȩp1iHמB4% AKXݫS3t:^Acğa @*.P,n|SȟK_UWRTN -$L j:x Hr";ꔀ;s[e>)3%;Ղ{N% :?@xOYx|Fn?(2D |ps:qp|V>*QQ2x䁐 pYܧ3ՌI^QX&8̳LL 7|8Txhg^а2釛e!ڥGϫӄЁv]ufѶwxBdӟQrO$y;ږU+_'>+kGh=HMn}M8Pz`]{GafP>5Nx@ܬ5Ti+2{2 8WE`a 'F(dNNmWGAh[cB4bBj-*1E5gs)`:stܟ/œ9[j'v)<3'4.~Ttى/9+ =ڑJ넔Fmf`H R,$肏_<RN y.ZGr+6߉jjޭ3un*9CJ7a cYp.&aAO0UDݴ ]֖L48Ϻ+πVPuR@۔Ø5Oz 4+{ 4('vM]&\]'_iƓE /yPyU To>_h8)E?1^'ߗ~Yi1HmCA+K>Czbqg1euFT6ү|cՄ/ ~rJ/'8wwn1» #RuUR@?0m+g,8Vs@w~~[3QVr_'~4OQoy&l{ LtB2 VҺBG۫w z=` J<âPJˬ'' bb]CO>d)+szХ=: 4w^l*\(o#$}镹vֆaפ[RKϾ*OPmŸM\fj?>_|ndgɟBld ;]m=V, 3WV2]~OIo2JAyeNJ !QۤhˇӶ{t/d9ǥSO3}J롯sp-c@6Sv ʉ#1mYꀟ<8|_!ee9EOA{vWچ'kۋ扢L39!uRzo!j'=YӛʯV~wI)g/hGzxatI|[TcBtKw#߇׆W )o8Q:H.,Ud7{+][x;!Q[*S\pfԣ-<2|^m"R{ntQ; & ^N>jHͤ?;ii{ѕ:L?kǪbe6'@7YG\"^4Ωc1,HSӡLuɖ( uSW!d, 8(|Kt. z,cAl%ʞǶ-dRa+mEʆ{pBX&-0|yȏ/ _^pk:}bb"\(ok3eXE7b'_|x *tHߪU[k ć4ڠTqo-TB *dg YE٩A?s_`yk4 T푓W˦Oܟ(@IDAT2Ne}m~˭u]RW7HOE%/=X./l2S}e>Y]`3kl[a}(y^OG߱xl8z0](}?Up760 ϩ3gA EsmU|i`MLKcGET-J/0~*;R]$0Lw@Aid'/k45ߙWzyd4X6Pp:Ly*:3d3A{+<<}?UޯѿiMab739X<ˊOWY8;h/ut^lm7\LE_&EG&M&>?Y"rvx&ѡXL6oNsݨ'+M)/YjNp*\XRؓC70 V[;Z_%`u/d;ɰmc y"j{2|fkqPwەׂ$ eeSgM:6|"K{i@v;ʤRBxV7-')~4=>QGrTF&u$cJ7zO<[GZ)ϑÄ+t)!.6u̱aqN=h{v'ѡYm=1ZI_Ms=)Ժ#Y\o-C~MbHθ>DheRC38Gݓa& mV\6.oaK[ױh{C: 8}=kd׵] ؙ3~ikY#|U ݗux gh4۟)m!gk}6JbdS9cMm(> P$?K  S`nIsG)icdyyltX}"`ޓR?YMH,Ym3]-xr*7мˤ!ۢ sߖ1@a6' n)g*Nݮnjv+bsg?m{]yJ;ƐNωq_8/1m!<:}F)`|*[؄m{啌JoYٳK92;/ys |dm ~n,^xݙ6@F۵ -mL2YxA!K9MQ'_{S;lZ8&uxaTyON(s}1T(;b7}c9}-E< uf%>~/u}1E?W$G`cAor?ƥys]:~Rljke˪_(}|tU; X&h۟?ru$2]=tn-8x_91R&񏢿F:KuC&eir% o@O Ÿ zX2ū)`x2Q'AirsU]YGqmcTZжhwaDW^16;>E'@Q6[؇'zvÙOIjUpο,.{v*n7*xSB椲~ ~ %,`Uk:<mYwcO ^{zF]mb«B~t%_$g2=(%MQ%HYyѽDCuv'A[[0PO`#yZ.Sa;mr!eum&'ٴ^qߴlk1>n"WWm 9?#8Xs\RK.Ҫ|^(8iѷ<8[o_"|p!M2. \_4{2/pU;_vJ:w[Ew maA*o&Hю.̒ -_epz2FϴeSG@%(bG%ZApo#Y-dS/?`vS'LDt.g>-O_-^߰}u=0IE,Gͮ4~oE,ȋUڏc[큭 /^ PxpwB]-݊h8`3(o)~j~/q Az?U? N=G7{95B6(+l^ɟ"}R]eZS عz/Q\v G)ж͸DZY!LGaL@/VGMmLC'8d_5z0y:Nu&-,`LW ?J^oF6d^n?8o}FjJo+$XAI}AAt'cim<(kf6[.w`۝-7 ۥDJ>< 0xmZQb^^ûY~֤ Vm>H[EAymgk4;B4]& )[ L8α(@CHO,x:Sg8?( ?ݫ{J۷x6L>zW$y<]C uHcdi;۸tVL"n<;s]u@M;^/@Y{^]M>}X*@7!Y*7MJ>uʳsuK*Oqfq X:D17p]e/iuB >lV@{$v~[\.$%ؾl3 N-VL!VBHtC bvQub`jFZ~<@lt wd'\!ׄ 's^ ke+sSeMsHAd}|#8P,x4ÙL @2EVYg3|}*tDIs}T{^ΗPcZ`Sv>]z\)2Ucg| WVV*m8hDYtR h dFV_5\6 U IA/B'+՟P@as;ɚ~Ptu7n?m-#jÑLf`a+v`ڴLǓ,T :'͟,D͙yZD63Ij6B.%$1OMNH>!B|-=y|}L~jUQASu'K_8TqE$a(k@3]Vx^]-OQz롄|U9Wfxxn%J{GJk$VY2 Yrd{W?Yx`f@9\h SK~ GJ; F`?Z$/oH@vBdxBiRf!\iN-,CwoT.-uZyӫ7!Th ŰC0 MQA Mejo+#dAsQB S#Lt7=%~̷菤gn$OP /'R ]d^r݅N'>4{ZE L#nR;szI[ x^ؑb5e^Ki%[mD~-x؏~[xe7Osۋ1x>]M>bc 4+/%jwgw<rd;"xjqe]6ᘛ *j|>$|2r].}7}OUwLW ?e~2|0![crc+${YЙzaX'c{Eľ|:`:2\ֻ*V{+ff<"Cl-o~[5Ȣ/w(NL| ~ż դ_%><.]tE_n1l^ 8JU`V/3 ͭe/,CTG}뻾x\˸_:c!FP7v[MOGbij_m/Po PܟQ^!3u-MĖ ԼQmv UT+UT^(#tY+$k2$?(Sy1։a͸G`_.5'Uԓ[]n <}2?Y9 e[lQ&(Գ>X)Q_A7v9#vE+T~Lx93VrxhbUw\ֻ*Yep$Be K'YGqƎ*9ir*}hnt 90hyeNX &!vv{i@6v|*bM<אqhԚ,Z*~I^446zraY9LMۿx+$B ]lBv)vI#><. Nek3[;N5|яXP]vm㣲6nN^]sL~o8)#~4CӨˆTEXbn#9MLlud$zǹOCY\aD+\2y6-v m`Uu^+ )ammVȐqhpv!sQP1x*O teh0D˻~m!AQmyز tBԫ'`(ZǸ 74zux)G>*zZ팛>Qwi5A fvOY}/%w,50G䌨Yi}ڹ?|9K;F$ne`mVx3qTUϨM=yDprեD "e̾:X6W1!1hpȯwZU6,Rn6]EVлi^]6u{5"anexaʋ}L6cx-8X~{h$eEt ll4W7ӅI9yv*[N]D+!9b2Gթ,((2we:x!Vt&a P.KȪ0hh{h\g U;}/KA@Uw[9YOȡ[&-nF)3օ1ws`H&!*?xVݚ/ŤL%N_--ӴX6..+:M-#d(`OSY@?-ȣsg-FU=q_; 2Fo³@iY88>ZU'.T 68z"Se:jVЬӶBx2yjItb1;L(/N< > 1';|0/@axz={g/b=7`}I)` d,ƕɃՎ*m L2tMx ?GNkMjʧĆ U'bۡ0']VWp;h"ZvY=Ui YψU0<4QˁD+ !9g=Om]rp#-J 9P~*,1Y7,Pэ=f۴Ѝ6M ( U&% xeB]V?/ٲF\oUgU )U5Wc]ׄpUug޽|2WM` s=;@.QƕڼAU2VA|XvΡDwF+:T~, (UBX4^ E8je*[TYWXeCypm! y XF={ O/H?U *@ z/6 D^8WtN(S^]glsX' g8h{/UvJcɧ JRfwgO\VR빔u接oSU|gT=o z˴k1v[CwYiUP;ѠI(Ƿon8 bu+;[/_)Ev I;LZe@'&Qm( HY0>.g(Pq m9vr RyuuY@ft>IFGݳJXvnsa().XmXֿ%^uDKԷ !!c ߏECʖ%M?VgFcev5?c48 ?7Lv٤QEJ|5B Ri2dKŻQ<x;i$B&A)[ RWr rWFIA6 ,OTtk5+`'cu.s ϽuYiO";>ulR7Y5FO`Htlƈd rɇG7tғQkDJi>&|F/鵡Ӯls8Pȃ̫QL+ىYG aE>:s'S` :T0/rZm cGYjYu^q_(_',.|i߱o'5y.Sv$npg^g_\?TS ~_jg-`.nDxgj>ir<[@ OSQQ\YnsM-`{]ZeyӗNxxܰ'z!$yޡP~$qxNMZKjjBoU y&|z}/d"aw,eyK42Ͳ4Zt3V0uyr$mW:nj+}ǵOk2 6'en8Q)Z/P?؄m>o.dM`~.re`Ǡ,kF;bl: `#eXbYqY7"-Q,lc2'[Se Eߘ@~vGf or` 4NUwiRJ`h_eqHO@2B6NJ)^{rU'3?uۨ ykvgY9=>-{\kei,zv7k&g]H}-"BvRᓄؽl- :yWewݻHU%3 7>)c`(6R3WEذasY _<&HUr{OGӇv զ]785[4ea2̻73=1Ą7k).g0qD6*(mv %YJY6 euhksgeW_I?sҳ}]z>4F^W{JsBs4aur^ޞwxݽ}F.ֶ*-,w$F'2_3`FTThCQr[\ֻ*33! hRzɬn ~hLMu/MRJǶkO|󊿜]J>}UTBWiuX ʎ!ds1Ӗ?Dn5M#ee/ i؎KI5.ah:2,dױd|T4mǟ&|`mT-U0 h>Q!0Ĕ5 hxBͺYan*S\8IOf . &'ؽ\VO9`K7=/z]V'V9wbew$ᜨIm>c_~6>,kGA73dl^tXs R]us}n2*0b離q`4l=sPva;l}e٫O_P%@ Dh[Ilϊ>V+b.bFۄJAU"-9PW^z%%<\(Z^U#g"SF;{|^u7vl>guo,I@.B'L|ҏUUj{hwMx895I+p /;X@W`԰(,{W㡬˲-?TBmRVd ϭnwj's4.^U[, ULk/whL[J/oΖ1wUgmН^S2 g\|= /xҼWIˋKЗ'J? Yȧ!mB+M>]Gi<;*pe˭[u^ 6*ܮDȫyhpY-U/r@ʂ7(׃4f~-{wA[S o]RnCff^?-3ix\\qCp>qC\L>|H QD~vQc%HQEchH*0b "/(P9{s9\K7s?B"ccM19A,PXئofY'wrݙ?!i5X}ky.I 6ω7,OocU*ҟFe4jv^WjEFUry0=%q%9?Tjc|>T#q/7ajf8T|4 grVw g-DG-/>E "1â>>G!B^-l__fȋʥ36p=8ZRF:^W9e=ZQL}iauY},P#T얥 9,:uqrĽiv?r-zJ2o$+M<ִs98q뻹 4M,91+˙&,, 0O<ʤMXNP\bXTVaѼsѦR&Ь׹&fiեnp]ߙ~px1~OE87کz|W2jwTx`{>Wƕ]st)\8: iLsdV+cZ鼃xrݛuϜXx 0Ӏ=!P1) '/B0Non&uFN2eB@t /fǀ/$-;\ S'dR;k9(5/iŷ!fFaRszܿ.oC]=I?)zm' )/Y: q 5iOem7gYNGc]msM٨{.Du94A])ys/LW ^hy>U:ؔ&7V$֒ጥqGwW{m  ޴yGv?TgQ0hSf<=#ZWg$2#>E;-&\ 3xJ& ,1`P9̹k ֘]rΫUw%bpN:oQ ^uI2=g쐖/\{<:w͚7Ńqg+\;HR8~qxId \-yiǺ'b&>1xlJwkeC-LX4crFI ]΅E4ö w&x7pKcM,YZu8gUv?qn@"^#b~"@-Yw>rx9hc}b36v19᳄x]2er~Ldp%琂|: I J1 ߧ%&x 'o( z0Gs=T&cc R?^tIԲۯ㬎b< UlN wQUp8c.B0F֪mr6m08mmnIO}yU9sJikГؠ8&:'凞hi8N/RwQ\U9 ~i"enK5.&M/34Swk;,wl,]r}Y_^/9Fy5O/.2W?jeL٥/ҷ?P_2LXw\9eZ 2<0r}b`3 Pɰ-n+<"wy,fYB[m+v-N&vk1(&cu\2T5$\6[PeբȹĠOy<aEqz6H0dYH1~woɺ 2%g,64 zlZiw/ӳ{UwZ:}~Š$?tp!'ޒh]; Wָ⭔ݤ%it,y#M+a]AsNP϶ũRvϏ% êJʰs5Yww{3!XӰ!btq)]=F}Ō:'\,ڌ^},ԋ !|MphfY[e(<>% 5^Yy/4eDcZɘ8]#qQW - ;Jm 3.i_ʉ] g`pŸ&ek{Հ 7R\7M];.v#&g/uRz=3N|;ufj(4޽jڏ)5X˚6'/=ce/pPgE^9^݁B)r}/ZٞiOu ӝQ,OKZ0\l`S6\6G^l"|^RoΏm9Ʈ8Qn~INqy[=h ̂(>n^y'0vhKm7z7iyNNLm,/Jq=.xR=-,/hQa8a]5¹L;IDAT6^2:Z\䗰^6n|;wƕ 7IΧr7.rVu;+Tz%/Q*Xd>~M`>dG g $,Ή(H*f9Meo.h8+׃pטHOD¯QTb=г[6xTI. I$uC./&󃍫Kd}]6 ^h:6@JFeg[Y:sT܁\(!N1o3[{T"Wqų@`&xJw4صz:K|oKyI?X }U0k̮u)ZuOp;)h0~ 4?os/KʟڲN?h{{Ķ@$Gv\A>j;_nxLwQ2>IqE ,u6isu*R(n[VOJqb$ rX[6UBoA}1_T$Òq:LD9ׁI1d{TgKm#Q(5)rQ0Ii#Ń>v< {`/$uٵy TnN҄~ļ!cސýАObӕo BMO8svd~73bqOxN:P8!E;N&'n;%쳔W1=R*?Z ({lV)]rf+LI Kro.pA'tt:E:a[QzFOJN軄UƍG 𖴈U0]; 0aD[^L>[ۊ޴͝ʻynk̶daG]캷HxO!QX(mJg.u2޹ +L,eo|)q_G2R)=z.gO4mώ6.,K--1{jַ.nb[ϑ YǁZ~rY^\(}vU$4+];l'O>~~f<ϕz3)?\fqrG;רry۹)~˙^u ~>殁 k0؃׉sx+>+1-g>L]Le?inkޚu/` o/>JP}߃,q#wlWrQXatiUn0(or &L7?GVl ܖu]>9ɪJFyU֡ulwlO'QOUӾ~}zH}Fnӆn2SkհQqGzϲ7]?^vWGdMpN<^/SYne\: Kc3^<:r6 ¹'N2 ZS|,ۭNi<Ƚ/X̗[T}Lq3ɹmN~ej/ {g{ "PEb&qu]K J̔1z wVㅝw?q,ۣ-ޙpV(\pX*Y֩e^hBNWn{ڱwymn4q-%?\o''bvt~r>4׹b.9D*jw;ʃ Z'ןqz@2>_=NڲtAx'EY(ܗ ވɀR9Me[wo->DΝe[u]0w=k ti)b@mкcdݿ'um7u%oT/+?)u@cRGyW.cU^a]֍?_Wc[b9+~s3Tm{wk^fY4(ҍw BnwV=n\Xxbvq'jai-f.:;+Įs:Z'&'zS~;_<6.퀡E}Oۨ\P]Γ+2GOYOj#m/ήd \_6շO%9ⴛ򪮞'f<.s>p=F;o#S6t>0e"<REx>k!6nI {VrXXy>2&mׯ${Mm:LyWmd&ۦ-~s{h:q> tV{2<>ə>mhs:o &=T81[bG2I&}t':uQ~O_]I9(?G.2oEyNz_ }F9//.Hgs jXguO?BxKsX>NzSnd}긒6|bԵ|__5 ^v?_̘Kc&.uߔߧ9 񜀮)22,e5ڥl,v^xaK2yR־lKwx,@h8K.}2*Lx+7J:|En "a󋴷z\J3)? gOVmEҕ7:=V{< aMҟ-ȃUߣ\&hEځeN$̌_tal_'~|< $""4M]!Μq4ڤ$1)vMiGByS9j*;5eƳ.SGh=A|O+=${L.ӳt0F[#\gJNbLYJz ;:uL0mWgY|k6tҟgr юᝤ,G9G?\|7UTq;)s? 2~F׎BegpRbo1?Z2q?)ʏ!gpyS^(?ۑ̦:D c(:ҋf-?6c Lg O@.&$|A{\UL挳.6(ww9Ұ//I)R +}H֖,0Wȅ2.y |ƺnEkɒWqr'%ڗ?E1 c>Yikb*_`T 6W$q>TD4n[S۔aIp_?5)m|_&1gO[/r>"x[q+uE:τ_*We{&s2멋h#Ba9r3#|Oפn,* caʠ/~$=b1Gx>WbxO3Vr,/xobqwUY#|jtBK1R/m9nw P'gK;$_p ЕHLԍ:3S`O1 1.9*` fgU,%0u0Go,*cʝqI*p e9q:Mo9Q's>JLYCԉqJG.q)IeCZc=Hщ^hK6X3bʇ1GI>LACU1cm6D{H9u輅.bMFI ,PEcq$DB[zUsvqxG1ܕU'ڝ0G|+$a_L $6ӊX7n^d8e`)1)QWgb^>ޕx7nb}}uIGR_ӕc)re#KĴ*!E%O랯:+caA J  vqgD` d!(:*kPN9z/(L:]JUΟ'xW>&c 5炨 # h1Gq[}0'݉cǏ.r6e@ܻo\/eti\}Z/<Xus*ڇQJ8Q e/a$ym$~ۈ]>u; ,F5a`rR@;Z4#l"@̓{i3~d{BˏaB˔Ft Ht`M21cc%z~\|eptu9Z@Ojbm=UzL4HAֲ}g;L̖db;-AK.b?'O噩7ҬZ8-P{,6Ey%/bL7(4i|tѯߥ0EPbQܭķ\!jb>&Ur_y h+p8: |XWp<8d㊷; 76##@KKRzWhJA&̒IJ*|ⓥob1+U&C+׎+nN=y]y ?&t) ҩ ~!CdqGTjJ%F $y[ ϨAgPв$EC@ͽ`YR%0x JxB/$Չip19&9]E7~)7ta~U#>WՌE90O JƐW;m-e}l{Oͅz1k ,mK~y⑯ķFq\.hGx+1wy١:_|LYskIʹ7~ A = #j ,9e87amg>^Z]2#ߜ!'2Ղ79]-\BB&w*&B!oNSǰt$)T Fբ @{VT2=;wX~e ȓ@G0/):Yv2Veǂ%!+B]gӽPOSir\/*C@;q0?-zu/I|@ 0cȝr&PZ`9A\e~ ?I΁@ 8oj0~ r@` j=򢱝]Ļ;orߪt?~D`@ z6cZ4E# yWތ*o'-y{WKɃ@ wBєl񫸻ix+ob;Rٰ:Dq0プEz@ X*se|i|0BCNܳg)&>Au9YqX#qat({,@ 0x2 XnGbCL 0;dJP2n[7ŏ۰Ba *(JpT$@ YG  5dAq~".(XQȐb牋ViI'ċg,x<72 !o_LC-@ 0x!2AxGP|s8&@9o'H.cI䗑4%;.ֆ.@ 04ߑH45@|jj`!rQA"q%Vb9;WV 6/'i"^(>@ ho5Mp"˥ M -@`v`\ӷ/曁ZOby?p!7{ @ Wx"r`(, )]C<ϟ"#X1:%g0/; qL8ɎU)z!?_ch @``!!/*\,4,$60x6sȳ#㪿().(+g1p'a$okB>+v{@ sWIyMHxOq=[{EZywª #*[7n\Wy¸+eyüVU!!'@`XP]lr-E|O1o%>V ÅrøC@ Lo ۊ!v0رBqa`6^Tc>[_ +.Uc]x|QӺO5Hly;DWc|@ rZ`ˠб!RҰ3%0cnȵԆ^@ˆ2N!/Ia@ 넁6 *=gSt7W+ULU.W) ('bG@K@ 0AF TEZC+-;R}TۈlH- Wݱ^*>BկIq @@  D ȼ+袶RN_|?1w^%)vf阯pհ"͇Ňɰaǁ@ 00F³`(ɈXpA[8x/PU *%z"<>Q zJ|09oDP @-J$c%?U;(zO~=kUrjFSy\yo._+ rA@ @-'K}cAK%wCqIA )ͲF h}ϓHcǪ @ k:s0T)~SUT(.  CC Cc^ *U" i6MV$(@`2 ˝dh@Io"go%.]`PaT֕!$+r vGp@ &@ v^XCk&_wz 2'cÏ~92H(OPRg @ 06d #@%R4x Ct 9q4FwŧO)\0$lق @ #VN_`6֭UVT=EWżUUz1*^#>G.շɏX)"gaT O kv-ZBڵVQ9'. {$aY甆W+F;TV 'cIfUU"@ 0m6ȗ.l۰R \Vܭ/`̲QUSRuхtEb od>O,8S<}}ѯ<(@ XjZj ږ 'o?Ka>N\no?SmwC@ a`ZHlXɶ}Ma.?OTfb Ż7-7٘;̘.;1DRKq@ *a`PdêܱW?Y]Y٭e$#~Fѥb,[3_,Ge 8Dn|ӯK|@ a`@]GZ/?Po dH\ vѕĘ:K1{vS @  B elLQRZVK} X58ti8Ur#cwj:@ Xi -*ccssylKeXaԠ)~ēoCܙ=_uE:( cj:@ k[XFr^r&b #kЎϻ E ^~1ؙ_.1PŘ9[)@  F %j\!p;l\׉*L۰[u{S特$HΔ%#-) @  *WzB|x/&< d|p׎ΡܩW_!'~!w(̑ Љ@ @ 00c3l@_+8J[MJ;noO}QQi)#KavO$JP @ 0ZV'rjyxǜ]+39ǀ1|#2D"Ob= @  kBmV0J'GOذ*S$OHvء> @ @X+ V*VVU9oQuD%OAA@ @ 0Eܼ3~*3oXrzGu76O_ݟè@ @`kBeȤK2b"?qsxWv0(3+x񛫆¤ @ e@ @gʆIGkűw3 cOGлА@ 9f) -A*fQstkzϊ_W Uk\#c @ 05j M%Ƹ*w&U{VĻܗc\],= @ C vj4lQTgl.yjTe*~;V㠭L@ #eP2&J 2`yxdV.Qe#6"MP @  ]~mN\_¸F oUݵd"cbiJ~ @ @ 3bkHnJqu;qW 80.FP @ 0tq5U+tqW9øbc\uav< @ 9E(s~j;WI`ĎJVT~& /uAǁ`L@ !;XEdCRIbWXh׊'jo+@ @`%!0ᰒp"e?PU2HV Jص@ @`!ՠ2vS WCbשo\ eg⿗1uTgA@  E`Xqdǂ]$`W?S9[V!(@ XjtrwVCC|3qyפ !S1uV@ "V%Dg׈ݧ&ݠ _bJ(@ P?qoo:&IENDB`Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/000077500000000000000000000000001221513074500202455ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/assertions.md000066400000000000000000000047031221513074500227650ustar00rootroot00000000000000# Assertion Macros Most test frameworks have a large collection of assertion macros to capture all possible conditional forms (_EQUALS, _NOTEQUALS, _GREATER_THAN etc). Catch is different. Because it decomposes natural C-style conditional expressions most of these forms are reduced to one or two that you will use all the time. That said there are a rich set of auxilliary macros as well. We'll describe all of these here. Most of these macros come in two forms: ## Natural Expressions The REQUIRE family of macros tests an expression and aborts the test case if it fails. The CHECK family are equivalent but execution continues in the same test case even if the assertion fails. This is useful if you have a series of essentially orthoginal assertions and it is useful to see all the results rather than stopping at the first failure. **REQUIRE(** _expression_ **)** and **CHECK(** _expression_ **)** Evaluates the expression and records the result. If an exception is thrown it is caught, reported, and counted as a failure. These are the macros you will use most of the time Examples: ```c++ CHECK( str == "string value" ); CHECK( thisReturnsTrue() ); REQUIRE( i == 42 ); ``` **REQUIRE_FALSE(** _expression_ **)** and **CHECK_FALSE(** _expression_ **)** Evaluates the expression and records the _logical NOT_ of the result. If an exception is thrown it is caught, reported, and counted as a failure. (these forms exist as a workaround for the fact that ! prefixed expressions cannot be decomposed). Example: ```c++ REQUIRE_FALSE( thisReturnsFalse() ); ``` ## Exceptions **REQUIRE_THROWS(** _expression_ **)** and **CHECK_THROWS(** _expression_ **)** Expects that an exception (of any type) is be thrown during evaluation of the expression. **REQUIRE_THROWS_AS(** _expression_ and _exception type_ **)** and **CHECK_THROWS_AS(** _expression_, _exception type_ **)** Expects that an exception of the _specified type_ is thrown during evaluation of the expression. **REQUIRE_NOTHROW(** _expression_ **)** and **CHECK_NOTHROW(** _expression_ **)** Expects that no exception is thrown during evaluation of the expression. ## Matcher expressions To support Matchers a slightly different form is used. Matchers will be more fully documented elsewhere. *Note that Matchers are still at early stage development and are subject to change.* **REQUIRE_THAT(** _lhs_, __matcher call__ **)** and **CHECK_THAT(** _lhs_, __matcher call__ **)** --- [Home](../README.md)Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/command-line.md000066400000000000000000000156321221513074500231410ustar00rootroot00000000000000CATCH works quite nicely without any command line options at all - but for those times when you want greater control the following options are available. Note that options are described according to the following pattern: ` ...`
` -r, --reporter`
` -b, --break`
` -s, --success`
` -a, --abort`
` -l, --list`
` -o, --out`
` -n, --name`
` -e, --nothrow`
` -h, -?, --help`
## Specifying which tests to run
<test-spec> ...
Test cases, wildcarded test cases, tags and tag expressions are all passed directly as arguments. Tags are distinguished by being enclosed in square brackets. If no test specs are supplied then all test cases, except "hidden" tests (tagged ```[hide]``` or, in the legacy case, prefixed by `'./'`) are run Specs must be enclosed in quotes if they contain spaces. If they do not contain spaces the quotes are optional. Wildcards consist of the `*` character at the beginning and/or end of test case names and can substitute for any number of any characters (including none). Test specs are case insensitive. If a spec is prefixed with `exclude:` or the `~` character then the pattern matches an exclusion. This means that tests matching the pattern are excluded from the set - even if a prior inclusion spec included them. Subsequent inclusion specs will take precendence, however. Inclusions and exclusions are evaluated in left-to-right order. Test case examples:
thisTestOnly            Matches the test case called, 'thisTestOnly'
"this test only"        Matches the test case called, 'this test only'
these*                  Matches all cases starting with 'these'
exclude:notThis         Matches all tests except, 'notThis'
~notThis                Matches all tests except, 'notThis'
~*private*              Matches all tests except those that contain 'private'
a* ~ab* abc             Matches all tests that start with 'a', except those that
                        start with 'ab', except 'abc', which is included
Names within square brackets are interpreted as tags. A series of tags form an AND expression wheras a comma seperated sequence forms an OR expression. e.g.:
[one][two],[three]
This matches all tests tagged `[one]` and `[two]`, as well as all tests tagged `[three]`
## Choosing a reporter to use
-r, --reporter <reporter>
A reporter is an object that formats and structures the output of running tests, and potentially summarises the results. By default a console reporter is used that writes, IDE friendly, textual output. Catch comes bundled with some alternative reporters, but more can be added in client code.
The bundled reporters are:
-r console
-r xml
-r junit
The JUnit reporter is an xml format that follows the structure of the JUnit XML Report ANT task, as consumed by a number of third-party tools, including Continuous Integration servers such as Hudson. If not otherwise needed, the standard XML reporter is preferred as this is a streaming reporter, whereas the Junit reporter needs to hold all its results until the end so it can write the overall results into attributes of the root node.
## Breaking into the debugger
-b, --break
In some IDEs (currently XCode and Visual Studio) it is possible for Catch to break into the debugger on a test failure. This can be very helpful during debug sessions - especially when there is more than one path through a particular test. In addition to the command line option, ensure you have built your code with the DEBUG preprocessor symbol
## Showing results for successful tests
-s, --success
Usually you only want to see reporting for failed tests. Sometimes it's useful to see *all* the output (especially when you don't trust that that test you just added worked first time!). To see successul, as well as failing, test results just pass this option. Note that each reporter may treat this option differently. The Junit reporter, for example, logs all results regardless.
## Aborting after a certain number of failures
-a, --abort
-x, --abortx [<failure threshold>]
If a ```REQUIRE``` assertion fails the test case aborts, but subsequent test cases are still run. If a ```CHECK``` assertion fails even the current test case is not aborted. Sometimes this results in a flood of failure messages and you'd rather just see the first few. Specifying ```-a``` or ```--abort``` on its own will abort the whole test run on the first failed assertion of any kind. Use ```-x``` or ```--abortx``` followed by a number to abort after that number of assertion failures.
## Listing available tests, tags or reporters
-l, --list-tests
-t, --list-tags
--list-reporters
```-l``` or ```--list-tests`` will list all registered tests, along with any tags. If one or more test-specs have been supplied too then only the matching tests will be listed. ```-t``` or ```--list-tags``` lists all available tags, along with the number of test cases they match. Again, supplying test specs limits the tags that match. ```--list-reporters``` lists the available reporters.
## Sending output to a file
-o, --out <filename>
Use this option to send all output to a file. By default output is sent to stdout (note that uses of stdout and stderr *from within test cases* are redirected and included in the report - so even stderr will effectively end up on stdout).
## Naming a test run
-n, --name <name for test run>
If a name is supplied it will be used by the reporter to provide an overall name for the test run. This can be useful if you are sending to a file, for example, and need to distinguish different test runs - either from different Catch executables or runs of the same executable with different options. If not supplied the name is defaulted to the name of the executable.
## Eliding assertions expected to throw
-e, --nothrow
Skips all assertions that test that an exception is thrown, e.g. ```REQUIRE_THROWS```. These can be a nuisance in certain debugging environments that may break when exceptions are thrown (while this is usually optional for handled exceptions, it can be useful to have enabled if you are trying to track down something unexpected). When running with this option any throw checking assertions are skipped so as not to contribute additional noise. Be careful if this affects the behaviour of subsequent tests.
## Usage
-h, -?, --help
Prints the command line arguments to stdout --- [Home](../README.md)Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/logging.md000066400000000000000000000032011221513074500222110ustar00rootroot00000000000000# Logging macros Additional messages can be logged during a test case. ## Streaming macros All these macros allow heterogenous sequences of values to be streaming using the insertion operator (```<<```) in the same way that std::ostream, std::cout, etc support it. E.g.: ```c++ INFO( "The number is " << i ); ``` (Note that there is no initial ```<<``` - instead the insertion sequence is placed in parentheses.) These macros come in three forms: **INFO(** _message expression_ **)** The message is logged to a buffer, but only reported with the next assertion that is logged. This allows you to log contextual information in case of failures which is not shown during a successful test run (for the console reporter, without -s). Messages are removed from the buffer at the end of their scope, so may be used, for example, in loops. **WARN(** _message expression_ **)** The message is always reported but does not fail the test. **FAIL(** _message expression_ **)** The message is reported and the test case fails. ## Quickly capture a variable value **CAPTURE(** _expression_ **)** Sometimes you just want to log the name and value of a variable. While you can easily do this with the INFO macro, above, as a convenience the CAPTURE macro handles the stringising of the variable name for you (actually it works with any expression, not just variables). E.g. ```c++ CAPTURE( theAnswer ); ``` This would log something like:
"theAnswer := 42"
## Deprecated macros **SCOPED_INFO and SCOPED_CAPTURE** These macros are now deprecated and are just aliases for INFO and CAPTURE (which were not previously scoped). --- [Home](../README.md)Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/own-main.md000066400000000000000000000041331221513074500223150ustar00rootroot00000000000000# Supplying main() yourself The easiest way to use Catch is to let it supply ```main()``` for you and handle configuring itself from the command line. This is achieved by writing ```#define CATCH_CONFIG_MAIN``` before the ```#include "catch.hpp"``` in *exactly one* source file. Sometimes, though, you need to write your own version of main(). You can do this by writing ```#define CATCH_CONFIG_RUNNER``` instead. Now you are free to write ```main()``` as normal and call into Catch yourself manually. You now have a lot of flexibility - but here are three recipes to get your started: ## Let Catch take full control of args and config If you just need to have code that executes before and/ or after Catch this is the simplest option. ```c++ #define CATCH_CONFIG_RUNNER #include "catch.hpp" int main( int argc, char* const argv[] ) { // global setup... int result = Catch::Session().run( argc, argv ); // global clean-up... return result; } ``` ## Amending the config If you still want Catch to process the command line, but you want to programatically tweak the config, you can do so in one of two ways: ```c++ #define CATCH_CONFIG_RUNNER #include "catch.hpp" int main( int argc, char* const argv[] ) { Catch::Session session; // There must be exactly once instance // writing to session.configData() here sets defaults // this is the preferred way to set them int returnCode = session.applyCommandLine( argc, argv ); if( returnCode != 0 ) // Indicates a command line error return returnCode; // writing to session.configData() or session.Config() here // overrides command line args // only do this if you know you need to return session.run(); } ``` Take a look at the definitions of Config and ConfigData to see what you can do with them. To take full control of the config simply omit the call to ```applyCommandLine()```. ## Adding your own command line options Catch embeds a powerful command line parser which you can also use to parse your own options out. This capability is still in active development but will be documented here when it is ready. --- [Home](../README.md)Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/reference-index.md000066400000000000000000000005561221513074500236400ustar00rootroot00000000000000These are the currently documented areas of the framework. There is more to come. Before looking at this material be sure to read the [tutorial](tutorial.md) * [Command Line](command-line.md) * [Assertion Macros](assertions.md) * [Logging Macros](logging.md) * [Supplying your own main()](own-main.md) * [Test fixtures](test-fixtures.md) --- [Home](../README.md)Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/test-fixtures.md000066400000000000000000000024501221513074500234160ustar00rootroot00000000000000Although Catch allows you to group tests together as sections within a test case, it can still convenient, sometimes, to group them using a more traditional test fixture. Catch fully supports this too. You define the test fixture as a simple structure: ```c++ class UniqueTestsFixture { private: static int uniqueID; protected: DBConnection conn; public: UniqueTestsFixture() : conn(DBConnection::createConnection("myDB")) { } protected: int getID() { return ++uniqueID; } }; int UniqueTestsFixture::uniqueID = 0; TEST_CASE_METHOD(UniqueTestsFixture, "Create Employee/No Name", "[create]") { REQUIRE_THROWS(conn.executeSQL("INSERT INTO employee (id, name) VALUES (?, ?)", getID(), "")); } TEST_CASE_METHOD(UniqueTestsFixture, "Create Employee/Normal", "[create]") { REQUIRE(conn.executeSQL("INSERT INTO employee (id, name) VALUES (?, ?)", getID(), "Joe Bloggs")); } ``` The two test cases here will create uniquely-named derived classes of UniqueTestsFixture and thus can access the `getID()` protected method and `conn` member variables. This ensures that both the test cases are able to create a DBConnection using the same method (DRY principle) and that any ID's created are unique such that the order that tests are executed does not matter. --- [Home](../README.md)Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/tutorial.md000066400000000000000000000140671221513074500224420ustar00rootroot00000000000000# Getting Catch The simplest way to get Catch is to download the single header version from [http://builds.catch-lib.net](http://builds.catch-lib.net). Don't be put off by the word "builds" there. The single header is generated by merging a set of individual headers but it is still just normal source code in a header file. The full source for Catch, including test projects, documentation, and other things, is hosted on GitHub. [http://catch-lib.net](http://catch-lib.net) will redirect you there. ## Where to put it? Catch is header only. All you need to do is drop the file(s) somewhere reachable from your project - either in some central location you can set your header search path to find, or directly into your project tree itself! This is a particularly good option for other Open-Source projects that want to use Catch for their test suite. See [this blog entry for more on that](http://www.levelofindirection.com/journal/2011/5/27/unit-testing-in-c-and-objective-c-just-got-ridiculously-easi-1.html). The rest of this tutorial will assume that the Catch single-include header (or the include folder) is available unqualified - but you may need to prefix it with a folder name if necessary. # Writing tests Let's start with a really simple example. Say you have written a function to calculate factorials and now you want to test it (let's leave aside TDD for now). ```c++ unsigned int Factorial( unsigned int number ) { return number <= 1 ? number : Factorial(number-1)*number; } ``` To keep things simple we'll put everything in a single file. ```c++ #define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file #include "catch.hpp" unsigned int Factorial( unsigned int number ) { return number <= 1 ? number : Factorial(number-1)*number; } TEST_CASE( "Factorials are computed", "[factorial]" ) { REQUIRE( Factorial(1) == 1 ); REQUIRE( Factorial(2) == 2 ); REQUIRE( Factorial(3) == 6 ); REQUIRE( Factorial(10) == 3628800 ); } ``` This will compile to a complete executable which responds to [command line arguments](command-line.md). If you just run it with no arguments it will execute all test cases (in this case there is just one), report any failures, report a summary of how many tests passed and failed and return the number of failed tests (useful for if you just want a yes/ no answer to: "did it work"). If you run this as written it will pass. Everything is good. Right? Well, there is still a bug here. In fact the first version of this tutorial I posted here genuinely had the bug in! So it's not completely contrived (thanks to Daryle Walker (```@CTMacUser```) for pointing this out). What is the bug? Well what is the factorial of zero? [The factorial of zero is one](http://mathforum.org/library/drmath/view/57128.html) - which is just one of those things you have to know (and remember!). Let's add that to the test case: ```c++ TEST_CASE( "Factorials are computed", "[factorial]" ) { REQUIRE( Factorial(0) == 1 ); REQUIRE( Factorial(1) == 1 ); REQUIRE( Factorial(2) == 2 ); REQUIRE( Factorial(3) == 6 ); REQUIRE( Factorial(10) == 3628800 ); } ``` Now we get a failure - something like: ``` Example.cpp:9: FAILED: REQUIRE( Factorial(0) == 1 ) with expansion: 0 == 1 ``` Note that we get the actual return value of Factorial(0) printed for us (0) - even though we used a natural expression with the == operator. That let's us immediately see what the problem is. Let's change the factorial function to: ```c++ unsigned int Factorial( unsigned int number ) { return number > 1 ? Factorial(number-1)*number : 1; } ``` Now all the tests pass. Of course there are still more issues to do deal with. For example we'll hit problems when the return value starts to exceed the range of an unsigned int. With factorials that can happen quite quickly. You might want to add tests for such cases and decide how to handle them. We'll stop short of doing that here. ## What did we do here? Although this was a simple test it's been enough to demonstrate a few things about how Catch is used. Let's take moment to consider those before we move on. 1. All we did was ```#define``` one identifier and ```#include``` one header and we got everything - even an implementation of ```main()``` that will [respond to command line arguments](command-line.md). You can only use that ```#define``` in one implementation file, for (hopefully) obvious reasons. Once you have more than one file with unit tests in you'll just ```#include "catch.hpp"``` and go. Usually it's a good idea to have a dedicated implementation file that just has ```#define CATCH_CONFIG_MAIN``` and ```#include "catch.hpp"```. You can also provide your own implementation of main and drive Catch yourself (see [Supplying-your-own-main()](own-main.md). 2. We introduce test cases with the TEST_CASE macro. This macro takes two arguments - a hierarchical test name (forward slash separated, by convention) and a free-form description. The test name should be unique - and ideally will logically group related tests together like folders in a file system. You can run sets of tests by specifying a wildcarded test name. 3. The name and description arguments are just strings. We haven't had to declare a function or method - or explicitly register the test case anywhere. Behind the scenes a function with a generated name is defined for you, and automatically registered using static registry classes. By abstracting the function name away we can name our tests without the constraints of identifier names. 4. We write our individual test assertions using the REQUIRE macro. Rather than a separate macro for each type of condition we express the condition naturally using C/C++ syntax. Behind the scenes a simple set of expression templates captures the left-hand-side and right-hand-side of the expression so we can display the values in our test report. As we'll see later there _are_ other assertion macros - but because of this technique the number of them is drastically reduced. ## Next steps For more specific information see the [Reference pages](reference-index.md) --- [Home](../README.md) Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/whats-changed.md000066400000000000000000000061471221513074500233140ustar00rootroot00000000000000## What's new in Catch This page has been added following quite a large (hopefully the last such) merge from the integration branch. Please read this summary through so you know what to expect (and whether any changes - breaking in some cases - will affect you). * Calling Catch from your own ```main()``` has changed - please review [the updated docs](own-main.md) * The command line has changed. The biggest change is that test case names and tags should now only be supplied as primary arguments - in fact the ```-t``` option has been repurposed to mean "list tags". There are [updated docs for this too](command-line.md) * There is a new reporter interface. If you have written a custom reporter you can use the ```LegacyReporterAdapter``` to minimise any differences. Ideally you should update to the new interface - especially as it has been designed to be more robust in the face of future changes (which should be minimal). * The docs have moved from the wiki to the repository itself. They consist of a set of markdown files in the docs folder and are referenced directly from the README in the root. You can still read them online from GitHub. * Lots of new goodness - more documentation for which is coming. The existing docs have been updated to account for some of the changes already (e.g. variadic macros). A quick rundown: * Variadic macros are used, where possible, so that, e.g. you can write a ```TEST_CASE``` with just a name - or even no name at all (making it an anonymous test case). * The hierarchical naming convention is deprecated in favour of using tags (see next) * ```TEST_CASE```s (but not ```SECTION```s) can now be tagged by placing keywords in square brackets in the second argument - e.g.: ```TEST_CASE( "A nice name", "[tag1][tag2]")```. The old style is still supported but please consider using this new style. * Tests can still be "hidden" using the ```./``` prefix as before, but the preferred way now is to give it the ```[hide]``` tag (hidden tests are skipped if you run the test process without specifying any test specs). * As well as ```TEST_CASE```s and ```SECTION```s you can now also use BDD-style ```SCENARIO``` (in place of ```TEST_CASE```) and ```GIVEN```, ```WHEN``` and ```THEN``` macros (in place of ```SECTION```s). * New command line parser. Under the hood it is a complete rewrite - now powered by a command line library that will soon be spun out as a separate project: Clara. The options themselves are largely the same but there are some notable differences (as already discussed). * Completely overhauled output from the textual reporter (now the Console reporter). This now features a much clearer, cleaner format, including good use of indentation. More information can be found in [this blog post](http://www.levelofindirection.com/journal/2013/6/28/catch-10.html). If you find any issues please raise issue tickets on the [issue tracker on GitHub](https://github.com/philsquared/Catch/issues) as before. For general questions, comments and suggestions, though, please use the [new forums on Google Groups](https://groups.google.com/forum/?fromgroups#!forum/catch-forum). --- [Home](../README.md) Catch-1e2f1d160336be07411775c476bfed3c7673263f/docs/why-catch.md000066400000000000000000000054771221513074500224730ustar00rootroot00000000000000# Why do we need yet another C++ test framework? Good question. For C++ there are quite a number of established frameworks, including (but not limited to), [CppUnit](http://sourceforge.net/apps/mediawiki/cppunit/index.php?title=Main_Page), [Google Test](http://code.google.com/p/googletest/), [Boost.Test](http://www.boost.org/doc/libs/1_49_0/libs/test/doc/html/index.html), [Aeryn](https://launchpad.net/aeryn), [Cute](http://r2.ifs.hsr.ch/cute), [Fructose](http://fructose.sourceforge.net/) and [many, many more](http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B). Even for Objective-C there are a few, including OCUnit - which now comes bundled with XCode. So what does Catch bring to the party that differentiates it from these? Apart from a Catchy name, of course. ## Key Features * Really easy to get started. Just download catch.hpp, #include it and you're away. * No external dependencies. As long as you can compile C++98 and have a C++ standard library available. * Write test cases as, self-registering, functions or methods. * Divide test cases into sections, each of which is run in isolation (eliminates the need for fixtures!) * Use BDD-style GIVEN-WHEN-THEN in place of test cases and sections. * Only one core assertion macro for comparisons. Standard C/C++ operators are used for the comparison - yet the full expression is decomposed and lhs and rhs values are logged. ## Other core features * Tests are named using free-form strings - no more couching names in legal identifiers. * Tests can be tagged for easily running ad-hoc groups of tests. * Failures can (optionally) break into the debugger on Windows and Mac. * Output is through modular reporter objects. Basic textual and XML reporters are included. Custom reporters can easily be added. * JUnit xml output is supported for integration with third-party tools, such as CI servers. * A default main() function is provided (in a header), but you can supply your own for complete control (e.g. integration into your own test runner GUI). * A command line parser is provided and can still be used if you choose to provided your own main() function. * Catch can test itself. * Alternative assertion macro(s) report failures but don't abort the test case * Floating point tolerance comparisons are built in using an expressive Approx() syntax. * Internal and friendly macros are isolated so name clashes can be managed * Support for Matchers (early stages) ## Objective-C-specific features * Automatically detects if you are using it from an Objective-C project * Works with and without ARC with no additional configuration * Implement test fixtures using Obj-C classes too (like OCUnit) * Additional built in matchers that work with Obj-C types (e.g. string matchers) See the [tutorial](tutorial.md) to get more of a taste of using CATCH in practice --- [Home](../README.md)Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/000077500000000000000000000000001221513074500207405ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/catch.hpp000066400000000000000000000250411221513074500225350ustar00rootroot00000000000000/* * Created by Phil on 22/10/2010. * Copyright 2010 Two Blue Cubes Ltd * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_HPP_INCLUDED #define TWOBLUECUBES_CATCH_HPP_INCLUDED #ifdef __clang__ #pragma clang diagnostic ignored "-Wglobal-constructors" #pragma clang diagnostic ignored "-Wvariadic-macros" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif #include "internal/catch_notimplemented_exception.h" #include "internal/catch_context.h" #include "internal/catch_test_registry.hpp" #include "internal/catch_capture.hpp" #include "internal/catch_section.hpp" #include "internal/catch_generators.hpp" #include "internal/catch_interfaces_exception.h" #include "internal/catch_approx.hpp" #include "internal/catch_matchers.hpp" #include "internal/catch_compiler_capabilities.h" // These files are included here so the single_include script doesn't put them // in the conditionally compiled sections #include "internal/catch_test_case_info.h" #include "internal/catch_interfaces_runner.h" #ifdef __OBJC__ #include "internal/catch_objc.hpp" #endif #if defined( CATCH_CONFIG_MAIN ) || defined( CATCH_CONFIG_RUNNER ) #include "internal/catch_impl.hpp" #endif #ifdef CATCH_CONFIG_MAIN #include "internal/catch_default_main.hpp" #endif ////// // If this config identifier is defined then all CATCH macros are prefixed with CATCH_ #ifdef CATCH_CONFIG_PREFIX_ALL #define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) #define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "CATCH_REQUIRE_FALSE" ) #define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" ) #define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) #define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) #define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) #define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CATCH_CHECK_FALSE" ) #define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) #define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) #define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) #define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) #define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) #define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) #define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) #define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) #define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN" ) #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL" ) #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED" ) #define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) #define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) #define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) #ifdef CATCH_CONFIG_VARIADIC_MACROS #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #else #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) #endif #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) #define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) #define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) #define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) // "BDD-style" convenience wrappers #ifdef CATCH_CONFIG_VARIADIC_MACROS #define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) #else #define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) #endif #define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" ) #define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" ) #define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" ) #define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" ) #define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" ) // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required #else #define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) #define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "REQUIRE_FALSE" ) #define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "REQUIRE_THROWS" ) #define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) #define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) #define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) #define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CHECK_FALSE" ) #define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) #define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) #define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) #define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" ) #define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) #define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) #define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) #define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) #define WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN" ) #define FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL" ) #define SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED" ) #define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) #define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) #define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) #ifdef CATCH_CONFIG_VARIADIC_MACROS #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #else #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) #endif #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) #define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) #define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) #define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) #endif #define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) // "BDD-style" convenience wrappers #ifdef CATCH_CONFIG_VARIADIC_MACROS #define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) #else #define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) #endif #define GIVEN( desc ) SECTION( " Given: " desc, "" ) #define WHEN( desc ) SECTION( " When: " desc, "" ) #define AND_WHEN( desc ) SECTION( "And when: " desc, "" ) #define THEN( desc ) SECTION( " Then: " desc, "" ) #define AND_THEN( desc ) SECTION( " And: " desc, "" ) using Catch::Detail::Approx; #ifdef __clang__ #pragma clang diagnostic pop #endif #endif // TWOBLUECUBES_CATCH_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/catch_runner.hpp000066400000000000000000000201701221513074500241240ustar00rootroot00000000000000/* * Created by Phil on 31/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED #define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED #include "internal/catch_commandline.hpp" #include "internal/catch_list.hpp" #include "internal/catch_runner_impl.hpp" #include "internal/catch_test_spec.h" #include "internal/catch_version.h" #include "internal/catch_text.h" #include #include #include namespace Catch { class Runner { public: Runner( Ptr const& config ) : m_config( config ) { openStream(); makeReporter(); } Totals runTests() { std::vector filterGroups = m_config->filters(); if( filterGroups.empty() ) { TestCaseFilters filterGroup( "" ); filterGroups.push_back( filterGroup ); } RunContext context( m_config.get(), m_reporter ); Totals totals; for( std::size_t i=0; i < filterGroups.size() && !context.aborting(); ++i ) { context.testGroupStarting( filterGroups[i].getName(), i, filterGroups.size() ); totals += runTestsForGroup( context, filterGroups[i] ); context.testGroupEnded( filterGroups[i].getName(), totals, i, filterGroups.size() ); } return totals; } Totals runTestsForGroup( RunContext& context, const TestCaseFilters& filterGroup ) { Totals totals; std::vector::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin(); std::vector::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end(); int testsRunForGroup = 0; for(; it != itEnd; ++it ) { if( filterGroup.shouldInclude( *it ) ) { testsRunForGroup++; if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) { if( context.aborting() ) break; totals += context.runTest( *it ); m_testsAlreadyRun.insert( *it ); } } } if( testsRunForGroup == 0 && !filterGroup.getName().empty() ) m_reporter->noMatchingTestCases( filterGroup.getName() ); return totals; } private: void openStream() { // Open output file, if specified if( !m_config->getFilename().empty() ) { m_ofs.open( m_config->getFilename().c_str() ); if( m_ofs.fail() ) { std::ostringstream oss; oss << "Unable to open file: '" << m_config->getFilename() << "'"; throw std::domain_error( oss.str() ); } m_config->setStreamBuf( m_ofs.rdbuf() ); } } void makeReporter() { std::string reporterName = m_config->getReporterName().empty() ? "console" : m_config->getReporterName(); m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() ); if( !m_reporter ) { std::ostringstream oss; oss << "No reporter registered with name: '" << reporterName << "'"; throw std::domain_error( oss.str() ); } } private: Ptr m_config; std::ofstream m_ofs; Ptr m_reporter; std::set m_testsAlreadyRun; }; class Session { static bool alreadyInstantiated; public: struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; Session() : m_cli( makeCommandLineParser() ) { if( alreadyInstantiated ) { std::string msg = "Only one instance of Catch::Session can ever be used"; std::cerr << msg << std::endl; throw std::logic_error( msg ); } alreadyInstantiated = true; } ~Session() { Catch::cleanUp(); } void showHelp( std::string const& processName ) { std::cout << "\nCatch v" << libraryVersion.majorVersion << "." << libraryVersion.minorVersion << " build " << libraryVersion.buildNumber; if( libraryVersion.branchName != "master" ) std::cout << " (" << libraryVersion.branchName << " branch)"; std::cout << "\n"; m_cli.usage( std::cout, processName ); std::cout << "For more detail usage please see the project docs\n" << std::endl; } int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { try { m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); if( unusedOptionBehaviour == OnUnusedOptions::Fail ) enforceNoUsedTokens(); if( m_configData.showHelp ) showHelp( m_configData.processName ); m_config.reset(); } catch( std::exception& ex ) { { Colour colourGuard( Colour::Red ); std::cerr << "\nError in input:\n" << Text( ex.what(), TextAttributes().setIndent(2) ) << "\n\n"; } m_cli.usage( std::cout, m_configData.processName ); return (std::numeric_limits::max)(); } return 0; } void useConfigData( ConfigData const& _configData ) { m_configData = _configData; m_config.reset(); } void enforceNoUsedTokens() const { if( !m_unusedTokens.empty() ) { std::vector::const_iterator it = m_unusedTokens.begin(), itEnd = m_unusedTokens.end(); std::string msg; for(; it != itEnd; ++it ) msg += " unrecognised option: " + it->data + "\n"; throw std::runtime_error( msg.substr( 0, msg.size()-1 ) ); } } int run( int argc, char* const argv[] ) { int returnCode = applyCommandLine( argc, argv ); if( returnCode == 0 ) returnCode = run(); return returnCode; } int run() { if( m_configData.showHelp ) return 0; try { config(); // Force config to be constructed Runner runner( m_config ); // Handle list request if( Option listed = list( config() ) ) return static_cast( *listed ); return static_cast( runner.runTests().assertions.failed ); } catch( std::exception& ex ) { std::cerr << ex.what() << std::endl; return (std::numeric_limits::max)(); } } Clara::CommandLine const& cli() const { return m_cli; } std::vector const& unusedTokens() const { return m_unusedTokens; } ConfigData& configData() { return m_configData; } Config& config() { if( !m_config ) m_config = new Config( m_configData ); return *m_config; } private: Clara::CommandLine m_cli; std::vector m_unusedTokens; ConfigData m_configData; Ptr m_config; }; bool Session::alreadyInstantiated = false; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/catch_with_main.hpp000066400000000000000000000007731221513074500246010ustar00rootroot00000000000000 /* * Created by Phil on 01/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_WITH_MAIN_HPP_INCLUDED #define TWOBLUECUBES_CATCH_WITH_MAIN_HPP_INCLUDED #include "catch_runner.hpp" #include "catch.hpp" #include "internal/catch_default_main.hpp" #endif // TWOBLUECUBES_CATCH_WITH_MAIN_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/000077500000000000000000000000001221513074500225545ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_approx.hpp000066400000000000000000000046141221513074500257450ustar00rootroot00000000000000/* * Created by Phil on 28/04/2011. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED #define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED #include "catch_tostring.hpp" #include #include namespace Catch { namespace Detail { class Approx { public: explicit Approx ( double value ) : m_epsilon( std::numeric_limits::epsilon()*100 ), m_scale( 1.0 ), m_value( value ) {} Approx( Approx const& other ) : m_epsilon( other.m_epsilon ), m_scale( other.m_scale ), m_value( other.m_value ) {} static Approx custom() { return Approx( 0 ); } Approx operator()( double value ) { Approx approx( value ); approx.epsilon( m_epsilon ); approx.scale( m_scale ); return approx; } friend bool operator == ( double lhs, Approx const& rhs ) { // Thanks to Richard Harris for his help refining this formula return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); } friend bool operator == ( Approx const& lhs, double rhs ) { return operator==( rhs, lhs ); } friend bool operator != ( double lhs, Approx const& rhs ) { return !operator==( lhs, rhs ); } friend bool operator != ( Approx const& lhs, double rhs ) { return !operator==( rhs, lhs ); } Approx& epsilon( double newEpsilon ) { m_epsilon = newEpsilon; return *this; } Approx& scale( double newScale ) { m_scale = newScale; return *this; } std::string toString() const { std::ostringstream oss; oss << "Approx( " << m_value << " )"; return oss.str(); } private: double m_epsilon; double m_scale; double m_value; }; } template<> inline std::string toString( Detail::Approx const& value ) { return value.toString(); } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_assertionresult.h000066400000000000000000000037101221513074500273360ustar00rootroot00000000000000/* * Created by Phil on 28/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED #include #include "catch_result_type.h" namespace Catch { struct AssertionInfo { AssertionInfo() {} AssertionInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, std::string const& _capturedExpression, ResultDisposition::Flags _resultDisposition ); std::string macroName; SourceLineInfo lineInfo; std::string capturedExpression; ResultDisposition::Flags resultDisposition; }; struct AssertionResultData { AssertionResultData() : resultType( ResultWas::Unknown ) {} std::string reconstructedExpression; std::string message; ResultWas::OfType resultType; }; class AssertionResult { public: AssertionResult(); AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); ~AssertionResult(); bool isOk() const; bool succeeded() const; ResultWas::OfType getResultType() const; bool hasExpression() const; bool hasMessage() const; std::string getExpression() const; std::string getExpressionInMacro() const; bool hasExpandedExpression() const; std::string getExpandedExpression() const; std::string getMessage() const; SourceLineInfo getSourceInfo() const; std::string getTestMacroName() const; protected: AssertionInfo m_info; AssertionResultData m_resultData; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_assertionresult.hpp000066400000000000000000000055551221513074500277070ustar00rootroot00000000000000/* * Created by Phil on 8/8/12 * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED #include "catch_assertionresult.h" namespace Catch { AssertionInfo::AssertionInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, std::string const& _capturedExpression, ResultDisposition::Flags _resultDisposition ) : macroName( _macroName ), lineInfo( _lineInfo ), capturedExpression( _capturedExpression ), resultDisposition( _resultDisposition ) {} AssertionResult::AssertionResult() {} AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) : m_info( info ), m_resultData( data ) {} AssertionResult::~AssertionResult() {} // Result was a success bool AssertionResult::succeeded() const { return Catch::isOk( m_resultData.resultType ); } // Result was a success, or failure is suppressed bool AssertionResult::isOk() const { return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); } ResultWas::OfType AssertionResult::getResultType() const { return m_resultData.resultType; } bool AssertionResult::hasExpression() const { return !m_info.capturedExpression.empty(); } bool AssertionResult::hasMessage() const { return !m_resultData.message.empty(); } std::string AssertionResult::getExpression() const { if( shouldNegate( m_info.resultDisposition ) ) return "!" + m_info.capturedExpression; else return m_info.capturedExpression; } std::string AssertionResult::getExpressionInMacro() const { if( m_info.macroName.empty() ) return m_info.capturedExpression; else return m_info.macroName + "( " + m_info.capturedExpression + " )"; } bool AssertionResult::hasExpandedExpression() const { return hasExpression() && getExpandedExpression() != getExpression(); } std::string AssertionResult::getExpandedExpression() const { return m_resultData.reconstructedExpression; } std::string AssertionResult::getMessage() const { return m_resultData.message; } SourceLineInfo AssertionResult::getSourceInfo() const { return m_info.lineInfo; } std::string AssertionResult::getTestMacroName() const { return m_info.macroName; } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_capture.hpp000066400000000000000000000211721221513074500260750ustar00rootroot00000000000000/* * Created by Phil on 18/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED #define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED #include "catch_expression_decomposer.hpp" #include "catch_expressionresult_builder.h" #include "catch_message.h" #include "catch_interfaces_capture.h" #include "catch_debugger.hpp" #include "catch_context.h" #include "catch_common.h" #include "catch_tostring.hpp" #include "catch_interfaces_registry_hub.h" #include "internal/catch_compiler_capabilities.h" #include namespace Catch { inline IResultCapture& getResultCapture() { return getCurrentContext().getResultCapture(); } template ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher, std::string const& matcherCallAsString ) { std::string matcherAsString = matcher.toString(); if( matcherAsString == "{?}" ) matcherAsString = matcherCallAsString; return ExpressionResultBuilder() .setRhs( matcherAsString ) .setOp( "matches" ); } template ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher, ArgT const& arg, std::string const& matcherCallAsString ) { return expressionResultBuilderFromMatcher( matcher, matcherCallAsString ) .setLhs( Catch::toString( arg ) ) .setResultType( matcher.match( arg ) ); } template ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher, ArgT* arg, std::string const& matcherCallAsString ) { return expressionResultBuilderFromMatcher( matcher, matcherCallAsString ) .setLhs( Catch::toString( arg ) ) .setResultType( matcher.match( arg ) ); } struct TestFailureException{}; } // end namespace Catch /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ASSERTIONINFO_NAME INTERNAL_CATCH_UNIQUE_NAME( __assertionInfo ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ACCEPT_EXPR( evaluatedExpr, resultDisposition, originalExpr ) \ if( Catch::ResultAction::Value internal_catch_action = Catch::getResultCapture().acceptExpression( evaluatedExpr, INTERNAL_CATCH_ASSERTIONINFO_NAME ) ) { \ if( internal_catch_action & Catch::ResultAction::Debug ) BreakIntoDebugger(); \ if( internal_catch_action & Catch::ResultAction::Abort ) throw Catch::TestFailureException(); \ if( !Catch::shouldContinueOnFailure( resultDisposition ) ) throw Catch::TestFailureException(); \ Catch::isTrue( false && originalExpr ); \ } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ACCEPT_INFO( expr, macroName, resultDisposition ) \ Catch::AssertionInfo INTERNAL_CATCH_ASSERTIONINFO_NAME( macroName, CATCH_INTERNAL_LINEINFO, expr, resultDisposition ); /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ try { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionDecomposer()->*expr ).endExpression( resultDisposition ), resultDisposition, expr ); \ } catch( Catch::TestFailureException& ) { \ throw; \ } catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), \ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, expr ); \ } \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ if( Catch::getResultCapture().getLastResult()->succeeded() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ if( !Catch::getResultCapture().getLastResult()->succeeded() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ try { \ expr; \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \ } \ catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), resultDisposition, false ); \ } \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \ try { \ if( Catch::getCurrentContext().getConfig()->allowThrows() ) { \ expr; \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::DidntThrowException ), resultDisposition, false ); \ } \ } \ catch( Catch::TestFailureException& ) { \ throw; \ } \ catch( exceptionType ) { \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \ } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS( expr, exceptionType, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \ catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \ } \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_MSG( log, messageType, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( messageType ) << log, resultDisposition, true ) \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_INFO( log, macroName ) \ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #arg " " #matcher, macroName, resultDisposition ); \ try { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::expressionResultBuilderFromMatcher( ::Catch::Matchers::matcher, arg, #matcher ) ), resultDisposition, false ); \ } catch( Catch::TestFailureException& ) { \ throw; \ } catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \ } \ } while( Catch::isTrue( false ) ) #endif // TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_commandline.hpp000066400000000000000000000110221221513074500267110ustar00rootroot00000000000000/* * Created by Phil on 02/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED #define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED #include "catch_config.hpp" #include "catch_common.h" #include "clara.h" namespace Catch { inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } inline void abortAfterX( ConfigData& config, int x ) { if( x < 1 ) throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); config.abortAfter = x; } inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } inline void addWarning( ConfigData& config, std::string const& _warning ) { if( _warning == "NoAssertions" ) config.warnings = (WarnAbout::What)( config.warnings | WarnAbout::NoAssertions ); else throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); } inline void setVerbosity( ConfigData& config, int level ) { // !TBD: accept strings? config.verbosity = (Verbosity::Level)level; } inline void setShowDurations( ConfigData& config, bool _showDurations ) { config.showDurations = _showDurations ? ShowDurations::Always : ShowDurations::Never; } inline Clara::CommandLine makeCommandLineParser() { Clara::CommandLine cli; cli.bindProcessName( &ConfigData::processName ); cli.bind( &ConfigData::showHelp ) .describe( "display usage information" ) .shortOpt( "?") .shortOpt( "h") .longOpt( "help" ); cli.bind( &ConfigData::listTests ) .describe( "list all (or matching) test cases" ) .shortOpt( "l") .longOpt( "list-tests" ); cli.bind( &ConfigData::listTags ) .describe( "list all (or matching) tags" ) .shortOpt( "t") .longOpt( "list-tags" ); cli.bind( &ConfigData::listReporters ) .describe( "list all reporters" ) .longOpt( "list-reporters" ); cli.bind( &ConfigData::showSuccessfulTests ) .describe( "include successful tests in output" ) .shortOpt( "s") .longOpt( "success" ); cli.bind( &ConfigData::shouldDebugBreak ) .describe( "break into debugger on failure" ) .shortOpt( "b") .longOpt( "break" ); cli.bind( &ConfigData::noThrow ) .describe( "skip exception tests" ) .shortOpt( "e") .longOpt( "nothrow" ); cli.bind( &ConfigData::outputFilename ) .describe( "output filename" ) .shortOpt( "o") .longOpt( "out" ) .hint( "filename" ); cli.bind( &ConfigData::reporterName ) .describe( "reporter to use - defaults to console" ) .shortOpt( "r") .longOpt( "reporter" ) // .hint( "name[:filename]" ); .hint( "name" ); cli.bind( &ConfigData::name ) .describe( "suite name" ) .shortOpt( "n") .longOpt( "name" ) .hint( "name" ); cli.bind( &abortAfterFirst ) .describe( "abort at first failure" ) .shortOpt( "a") .longOpt( "abort" ); cli.bind( &abortAfterX ) .describe( "abort after x failures" ) .shortOpt( "x") .longOpt( "abortx" ) .hint( "number of failures" ); cli.bind( &addWarning ) .describe( "enable warnings" ) .shortOpt( "w") .longOpt( "warn" ) .hint( "warning name" ); // cli.bind( &setVerbosity ) // .describe( "level of verbosity (0=no output)" ) // .shortOpt( "v") // .longOpt( "verbosity" ) // .hint( "level" ); cli.bind( &addTestOrTags ) .describe( "which test or tests to use" ) .hint( "test name, pattern or tags" ); cli.bind( &setShowDurations ) .describe( "show test durations" ) .shortOpt( "d") .longOpt( "durations" ) .hint( "yes/no" ); return cli; } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_common.h000066400000000000000000000120031221513074500253530ustar00rootroot00000000000000/* * Created by Phil on 29/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_COMMON_H_INCLUDED #define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) #define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) #define INTERNAL_CATCH_STRINGIFY2( expr ) #expr #define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) #include #include #include #include "catch_compiler_capabilities.h" namespace Catch { class NonCopyable { NonCopyable( NonCopyable const& ); void operator = ( NonCopyable const& ); protected: NonCopyable() {} virtual ~NonCopyable(); }; class SafeBool { public: typedef void (SafeBool::*type)() const; static type makeSafe( bool value ) { return value ? &SafeBool::trueValue : 0; } private: void trueValue() const {} }; template inline void deleteAll( ContainerT& container ) { typename ContainerT::const_iterator it = container.begin(); typename ContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) delete *it; } template inline void deleteAllValues( AssociativeContainerT& container ) { typename AssociativeContainerT::const_iterator it = container.begin(); typename AssociativeContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) delete it->second; } template inline void forEach( ContainerT& container, Function function ) { std::for_each( container.begin(), container.end(), function ); } template inline void forEach( ContainerT const& container, Function function ) { std::for_each( container.begin(), container.end(), function ); } inline bool startsWith( std::string const& s, std::string const& prefix ) { return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; } inline bool endsWith( std::string const& s, std::string const& suffix ) { return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; } inline bool contains( std::string const& s, std::string const& infix ) { return s.find( infix ) != std::string::npos; } inline void toLowerInPlace( std::string& s ) { std::transform( s.begin(), s.end(), s.begin(), ::tolower ); } inline std::string toLower( std::string const& s ) { std::string lc = s; toLowerInPlace( lc ); return lc; } struct pluralise { pluralise( std::size_t count, std::string const& label ) : m_count( count ), m_label( label ) {} friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { os << pluraliser.m_count << " " << pluraliser.m_label; if( pluraliser.m_count != 1 ) os << "s"; return os; } std::size_t m_count; std::string m_label; }; struct SourceLineInfo { SourceLineInfo() : line( 0 ){} SourceLineInfo( std::string const& _file, std::size_t _line ) : file( _file ), line( _line ) {} SourceLineInfo( SourceLineInfo const& other ) : file( other.file ), line( other.line ) {} bool empty() const { return file.empty(); } bool operator == ( SourceLineInfo const& other ) const { return line == other.line && file == other.file; } std::string file; std::size_t line; }; inline std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { #ifndef __GNUG__ os << info.file << "(" << info.line << ")"; #else os << info.file << ":" << info.line; #endif return os; } // This is just here to avoid compiler warnings with macro constants and boolean literals inline bool isTrue( bool value ){ return value; } inline void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { std::ostringstream oss; oss << locationInfo << ": Internal Catch error: '" << message << "'"; if( isTrue( true )) throw std::logic_error( oss.str() ); } } #define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) #define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); #endif // TWOBLUECUBES_CATCH_COMMON_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_compiler_capabilities.h000066400000000000000000000041011221513074500304060ustar00rootroot00000000000000/* * Created by Phil on 15/04/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED #define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED // Much of the following code is based on Boost (1.53) //////////////////////////////////////////////////////////////////////////////// // Borland #ifdef __BORLANDC__ #if (__BORLANDC__ > 0x582 ) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // __BORLANDC__ //////////////////////////////////////////////////////////////////////////////// // EDG #ifdef __EDG_VERSION__ #if (__EDG_VERSION__ > 238 ) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // __EDG_VERSION__ //////////////////////////////////////////////////////////////////////////////// // Digital Mars #ifdef __DMC__ #if (__DMC__ > 0x840 ) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // __DMC__ //////////////////////////////////////////////////////////////////////////////// // GCC #ifdef __GNUC__ #if __GNUC__ < 3 #if (__GNUC_MINOR__ >= 96 ) //#define CATCH_CONFIG_SFINAE #endif #elif __GNUC__ >= 3 // #define CATCH_CONFIG_SFINAE // Taking this out completely for now #endif // __GNUC__ < 3 #endif // __GNUC__ //////////////////////////////////////////////////////////////////////////////// // Visual C++ #ifdef _MSC_VER #if (_MSC_VER >= 1310 ) // (VC++ 7.0+) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // _MSC_VER // Use variadic macros if the compiler supports them #if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ ( defined __GNUC__ && __GNUC__ >= 3 ) || \ ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) #ifndef CATCH_CONFIG_NO_VARIADIC_MACROS #define CATCH_CONFIG_VARIADIC_MACROS #endif #endif #endif // TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_config.hpp000066400000000000000000000122421221513074500256750ustar00rootroot00000000000000/* * Created by Phil on 08/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED #define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED #include "catch_test_spec.h" #include "catch_context.h" #include "catch_interfaces_config.h" #include "catch_stream.hpp" #include #include #include #include #ifndef CATCH_CONFIG_CONSOLE_WIDTH #define CATCH_CONFIG_CONSOLE_WIDTH 80 #endif namespace Catch { struct ConfigData { ConfigData() : listTests( false ), listTags( false ), listReporters( false ), showSuccessfulTests( false ), shouldDebugBreak( false ), noThrow( false ), showHelp( false ), abortAfter( -1 ), verbosity( Verbosity::Normal ), warnings( WarnAbout::Nothing ), showDurations( ShowDurations::DefaultForReporter ) {} bool listTests; bool listTags; bool listReporters; bool showSuccessfulTests; bool shouldDebugBreak; bool noThrow; bool showHelp; int abortAfter; Verbosity::Level verbosity; WarnAbout::What warnings; ShowDurations::OrNot showDurations; std::string reporterName; std::string outputFilename; std::string name; std::string processName; std::vector testsOrTags; }; class Config : public SharedImpl { private: Config( Config const& other ); Config& operator = ( Config const& other ); virtual void dummy(); public: Config() : m_os( std::cout.rdbuf() ) {} Config( ConfigData const& data ) : m_data( data ), m_os( std::cout.rdbuf() ) { if( !data.testsOrTags.empty() ) { std::string groupName; for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) { if( i != 0 ) groupName += " "; groupName += data.testsOrTags[i]; } TestCaseFilters filters( groupName ); for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) { std::string filter = data.testsOrTags[i]; if( startsWith( filter, "[" ) || startsWith( filter, "~[" ) ) filters.addTags( filter ); else filters.addFilter( TestCaseFilter( filter ) ); } m_filterSets.push_back( filters ); } } virtual ~Config() { m_os.rdbuf( std::cout.rdbuf() ); m_stream.release(); } void setFilename( std::string const& filename ) { m_data.outputFilename = filename; } std::string const& getFilename() const { return m_data.outputFilename ; } bool listTests() const { return m_data.listTests; } bool listTags() const { return m_data.listTags; } bool listReporters() const { return m_data.listReporters; } std::string getProcessName() const { return m_data.processName; } bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } void setStreamBuf( std::streambuf* buf ) { m_os.rdbuf( buf ? buf : std::cout.rdbuf() ); } void useStream( std::string const& streamName ) { Stream stream = createStream( streamName ); setStreamBuf( stream.streamBuf ); m_stream.release(); m_stream = stream; } std::string getReporterName() const { return m_data.reporterName; } void addTestSpec( std::string const& testSpec ) { TestCaseFilters filters( testSpec ); filters.addFilter( TestCaseFilter( testSpec ) ); m_filterSets.push_back( filters ); } int abortAfter() const { return m_data.abortAfter; } std::vector const& filters() const { return m_filterSets; } bool showHelp() const { return m_data.showHelp; } // IConfig interface virtual bool allowThrows() const { return !m_data.noThrow; } virtual std::ostream& stream() const { return m_os; } virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } private: ConfigData m_data; Stream m_stream; mutable std::ostream m_os; std::vector m_filterSets; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_console_colour.hpp000066400000000000000000000030431221513074500274540ustar00rootroot00000000000000/* * Created by Phil on 25/2/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED #include "catch_common.h" namespace Catch { namespace Detail { struct IColourImpl; } struct Colour { enum Code { None = 0, White, Red, Green, Blue, Cyan, Yellow, Grey, Bright = 0x10, BrightRed = Bright | Red, BrightGreen = Bright | Green, LightGrey = Bright | Grey, BrightWhite = Bright | White, // By intention FileName = LightGrey, ResultError = BrightRed, ResultSuccess = BrightGreen, Error = BrightRed, Success = Green, OriginalExpression = Cyan, ReconstructedExpression = Yellow, SecondaryText = LightGrey, Headers = White }; // Use constructed object for RAII guard Colour( Code _colourCode ); ~Colour(); // Use static method for one-shot changes static void use( Code _colourCode ); private: static Detail::IColourImpl* impl; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_console_colour_impl.hpp000066400000000000000000000125221221513074500304770ustar00rootroot00000000000000/* * Created by Phil on 25/2/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED #include "catch_console_colour.hpp" namespace Catch { namespace Detail { struct IColourImpl { virtual ~IColourImpl() {} virtual void use( Colour::Code _colourCode ) = 0; }; }} #if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// #ifndef NOMINMAX #define NOMINMAX #endif #ifdef __AFXDLL #include #else #include #endif namespace Catch { namespace { class Win32ColourImpl : public Detail::IColourImpl { public: Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) { CONSOLE_SCREEN_BUFFER_INFO csbiInfo; GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); originalAttributes = csbiInfo.wAttributes; } virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { case Colour::None: return setTextAttribute( originalAttributes ); case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Red: return setTextAttribute( FOREGROUND_RED ); case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); case Colour::Grey: return setTextAttribute( 0 ); case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Bright: throw std::logic_error( "not a colour" ); } } private: void setTextAttribute( WORD _textAttribute ) { SetConsoleTextAttribute( stdoutHandle, _textAttribute ); } HANDLE stdoutHandle; WORD originalAttributes; }; inline bool shouldUseColourForPlatform() { return true; } Win32ColourImpl platformColourImpl; } // end anon namespace } // end namespace Catch #else // Not Windows - assumed to be POSIX compatible ////////////////////////// #include namespace Catch { namespace { // use POSIX/ ANSI console terminal codes // Thanks to Adam Strzelecki for original contribution // (http://github.com/nanoant) // https://github.com/philsquared/Catch/pull/131 class PosixColourImpl : public Detail::IColourImpl { public: virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { case Colour::None: case Colour::White: return setColour( "[0m" ); case Colour::Red: return setColour( "[0;31m" ); case Colour::Green: return setColour( "[0;32m" ); case Colour::Blue: return setColour( "[0:34m" ); case Colour::Cyan: return setColour( "[0;36m" ); case Colour::Yellow: return setColour( "[0;33m" ); case Colour::Grey: return setColour( "[1;30m" ); case Colour::LightGrey: return setColour( "[0;37m" ); case Colour::BrightRed: return setColour( "[1;31m" ); case Colour::BrightGreen: return setColour( "[1;32m" ); case Colour::BrightWhite: return setColour( "[1;37m" ); case Colour::Bright: throw std::logic_error( "not a colour" ); } } private: void setColour( const char* _escapeCode ) { std::cout << '\033' << _escapeCode; } }; inline bool shouldUseColourForPlatform() { return isatty( fileno(stdout) ); } PosixColourImpl platformColourImpl; } // end anon namespace } // end namespace Catch #endif // not Windows namespace Catch { namespace { struct NoColourImpl : Detail::IColourImpl { void use( Colour::Code ) {} }; NoColourImpl noColourImpl; static const bool shouldUseColour = shouldUseColourForPlatform() && !isDebuggerActive(); } Colour::Colour( Code _colourCode ){ use( _colourCode ); } Colour::~Colour(){ use( None ); } void Colour::use( Code _colourCode ) { impl->use( _colourCode ); } Detail::IColourImpl* Colour::impl = shouldUseColour ? static_cast( &platformColourImpl ) : static_cast( &noColourImpl ); } // end namespace Catch #endif // TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_context.h000066400000000000000000000027601221513074500255600ustar00rootroot00000000000000/* * Created by Phil on 31/12/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED #define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED #include "catch_interfaces_generators.h" #include "catch_ptr.hpp" #include #include #include namespace Catch { class TestCase; class Stream; struct IResultCapture; struct IRunner; struct IGeneratorsForTest; struct IConfig; struct IContext { virtual ~IContext(); virtual IResultCapture& getResultCapture() = 0; virtual IRunner& getRunner() = 0; virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; virtual bool advanceGeneratorsForCurrentTest() = 0; virtual Ptr getConfig() const = 0; }; struct IMutableContext : IContext { virtual ~IMutableContext(); virtual void setResultCapture( IResultCapture* resultCapture ) = 0; virtual void setRunner( IRunner* runner ) = 0; virtual void setConfig( Ptr const& config ) = 0; }; IContext& getCurrentContext(); IMutableContext& getCurrentMutableContext(); void cleanUpContext(); Stream createStream( std::string const& streamName ); } #endif // TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_context_impl.hpp000066400000000000000000000071721221513074500271430ustar00rootroot00000000000000/* * Created by Phil on 31/12/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED #define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED #include "catch_runner_impl.hpp" #include "catch_context.h" #include "catch_stream.hpp" namespace Catch { class Context : public IMutableContext { Context() : m_config( NULL ) {} Context( Context const& ); void operator=( Context const& ); public: // IContext virtual IResultCapture& getResultCapture() { return *m_resultCapture; } virtual IRunner& getRunner() { return *m_runner; } virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { return getGeneratorsForCurrentTest() .getGeneratorInfo( fileInfo, totalSize ) .getCurrentIndex(); } virtual bool advanceGeneratorsForCurrentTest() { IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); return generators && generators->moveNext(); } virtual Ptr getConfig() const { return m_config; } public: // IMutableContext virtual void setResultCapture( IResultCapture* resultCapture ) { m_resultCapture = resultCapture; } virtual void setRunner( IRunner* runner ) { m_runner = runner; } virtual void setConfig( Ptr const& config ) { m_config = config; } friend IMutableContext& getCurrentMutableContext(); private: IGeneratorsForTest* findGeneratorsForCurrentTest() { std::string testName = getResultCapture().getCurrentTestName(); std::map::const_iterator it = m_generatorsByTestName.find( testName ); return it != m_generatorsByTestName.end() ? it->second : NULL; } IGeneratorsForTest& getGeneratorsForCurrentTest() { IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); if( !generators ) { std::string testName = getResultCapture().getCurrentTestName(); generators = createGeneratorsForTest(); m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); } return *generators; } private: IRunner* m_runner; IResultCapture* m_resultCapture; Ptr m_config; std::map m_generatorsByTestName; }; namespace { Context* currentContext = NULL; } IMutableContext& getCurrentMutableContext() { if( !currentContext ) currentContext = new Context(); return *currentContext; } IContext& getCurrentContext() { return getCurrentMutableContext(); } Stream createStream( std::string const& streamName ) { if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); if( streamName == "debug" ) return Stream( new StreamBufImpl, true ); throw std::domain_error( "Unknown stream: " + streamName ); } void cleanUpContext() { delete currentContext; currentContext = NULL; } } #endif // TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_debugger.hpp000066400000000000000000000071521221513074500262200ustar00rootroot00000000000000/* * Created by Phil on 27/12/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * Provides a BreakIntoDebugger() macro for Windows and Mac (so far) */ #ifndef TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED #define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED #include #include "catch_platform.h" #ifdef CATCH_PLATFORM_MAC #include #include #include #include #include namespace Catch{ // The following function is taken directly from the following technical note: // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html // Returns true if the current process is being debugged (either // running under the debugger or has a debugger attached post facto). inline bool isDebuggerActive(){ int junk; int mib[4]; struct kinfo_proc info; size_t size; // Initialize the flags so that, if sysctl fails for some bizarre // reason, we get a predictable result. info.kp_proc.p_flag = 0; // Initialize mib, which tells sysctl the info we want, in this case // we're looking for information about a specific process ID. mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); // Call sysctl. size = sizeof(info); junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); assert(junk == 0); // We're being debugged if the P_TRACED flag is set. return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); } } // The following code snippet taken from: // http://cocoawithlove.com/2008/03/break-into-debugger.html #ifdef DEBUG #if defined(__ppc64__) || defined(__ppc__) #define BreakIntoDebugger() \ if( Catch::isDebuggerActive() ) { \ __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ : : : "memory","r0","r3","r4" ); \ } #else #define BreakIntoDebugger() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} #endif #else inline void BreakIntoDebugger(){} #endif #elif defined(_MSC_VER) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); #define BreakIntoDebugger() if (IsDebuggerPresent() ) { __debugbreak(); } inline bool isDebuggerActive() { return IsDebuggerPresent() != 0; } #elif defined(__MINGW32__) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); extern "C" __declspec(dllimport) void __stdcall DebugBreak(); #define BreakIntoDebugger() if (IsDebuggerPresent() ) { DebugBreak(); } inline bool isDebuggerActive() { return IsDebuggerPresent() != 0; } #else inline void BreakIntoDebugger(){} inline bool isDebuggerActive() { return false; } #endif #ifdef CATCH_PLATFORM_WINDOWS extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); inline void writeToDebugConsole( std::string const& text ) { ::OutputDebugStringA( text.c_str() ); } #else inline void writeToDebugConsole( std::string const& text ) { // !TBD: Need a version for Mac/ XCode and other IDEs std::cout << text; } #endif // CATCH_PLATFORM_WINDOWS #endif // TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_default_main.hpp000066400000000000000000000016621221513074500270640ustar00rootroot00000000000000/* * Created by Phil on 20/05/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED #define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED #ifndef __OBJC__ // Standard C/C++ main entry point int main (int argc, char * const argv[]) { return Catch::Session().run( argc, argv ); } #else // __OBJC__ // Objective-C entry point int main (int argc, char * const argv[]) { #if !CATCH_ARC_ENABLED NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; #endif Catch::registerTestMethods(); int result = Catch::Session().run( argc, (char* const*)argv ); #if !CATCH_ARC_ENABLED [pool drain]; #endif return result; } #endif // __OBJC__ #endif // TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_evaluate.hpp000066400000000000000000000156571221513074500262530ustar00rootroot00000000000000/* * Created by Phil on 04/03/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED #define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4389) // '==' : signed/unsigned mismatch #endif namespace Catch { namespace Internal { enum Operator { IsEqualTo, IsNotEqualTo, IsLessThan, IsGreaterThan, IsLessThanOrEqualTo, IsGreaterThanOrEqualTo }; template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; template inline T& opCast(T const& t) { return const_cast(t); } // nullptr_t support based on pull request #154 from Konstantin Baumann #ifdef CATCH_CONFIG_CPP11_NULLPTR inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } #endif // CATCH_CONFIG_CPP11_NULLPTR // So the compare overloads can be operator agnostic we convey the operator as a template // enum, which is used to specialise an Evaluator for doing the comparison. template class Evaluator{}; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs) { return opCast( lhs ) == opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) != opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) < opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) > opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) >= opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) <= opCast( rhs ); } }; template bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { return Evaluator::evaluate( lhs, rhs ); } // This level of indirection allows us to specialise for integer types // to avoid signed/ unsigned warnings // "base" overload template bool compare( T1 const& lhs, T2 const& rhs ) { return Evaluator::evaluate( lhs, rhs ); } // unsigned X to int template bool compare( unsigned int lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned long lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned char lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } // unsigned X to long template bool compare( unsigned int lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned long lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned char lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } // int to unsigned X template bool compare( int lhs, unsigned int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( int lhs, unsigned long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( int lhs, unsigned char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // long to unsigned X template bool compare( long lhs, unsigned int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long lhs, unsigned long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long lhs, unsigned char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // pointer to long (when comparing against NULL) template bool compare( long lhs, T* rhs ) { return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); } template bool compare( T* lhs, long rhs ) { return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); } // pointer to int (when comparing against NULL) template bool compare( int lhs, T* rhs ) { return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); } template bool compare( T* lhs, int rhs ) { return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); } #ifdef CATCH_CONFIG_CPP11_NULLPTR // pointer to nullptr_t (when comparing against nullptr) template bool compare( std::nullptr_t, T* rhs ) { return Evaluator::evaluate( NULL, rhs ); } template bool compare( T* lhs, std::nullptr_t ) { return Evaluator::evaluate( lhs, NULL ); } #endif // CATCH_CONFIG_CPP11_NULLPTR } // end of namespace Internal } // end of namespace Catch #ifdef _MSC_VER #pragma warning(pop) #endif #endif // TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED catch_exception_translator_registry.hpp000066400000000000000000000042101221513074500325440ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/* * Created by Phil on 20/04/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED #define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED #include "catch_interfaces_exception.h" #include "catch_tostring.hpp" #ifdef __OBJC__ #import "Foundation/Foundation.h" #endif namespace Catch { class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { public: ~ExceptionTranslatorRegistry() { deleteAll( m_translators ); } virtual void registerTranslator( const IExceptionTranslator* translator ) { m_translators.push_back( translator ); } virtual std::string translateActiveException() const { try { #ifdef __OBJC__ // In Objective-C try objective-c exceptions first @try { throw; } @catch (NSException *exception) { return toString( [exception description] ); } #else throw; #endif } catch( std::exception& ex ) { return ex.what(); } catch( std::string& msg ) { return msg; } catch( const char* msg ) { return msg; } catch(...) { return tryTranslators( m_translators.begin() ); } } std::string tryTranslators( std::vector::const_iterator it ) const { if( it == m_translators.end() ) return "Unknown exception"; try { return (*it)->translate(); } catch(...) { return tryTranslators( it+1 ); } } private: std::vector m_translators; }; } #endif // TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_expression_decomposer.hpp000066400000000000000000000016051221513074500310500ustar00rootroot00000000000000/* * Created by Phil on 11/5/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_EXPRESSION_DECOMPOSER_HPP_INCLUDED #define TWOBLUECUBES_CATCH_EXPRESSION_DECOMPOSER_HPP_INCLUDED #include "catch_expression_lhs.hpp" namespace Catch { // Captures the LHS of the expression and wraps it in an Expression Lhs object class ExpressionDecomposer { public: template ExpressionLhs operator->* ( T const& operand ) { return ExpressionLhs( operand ); } ExpressionLhs operator->* ( bool value ) { return ExpressionLhs( value ); } }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_EXPRESSION_DECOMPOSER_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_expression_lhs.hpp000066400000000000000000000073071221513074500275030ustar00rootroot00000000000000/* * Created by Phil on 11/5/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED #define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED #include "catch_expressionresult_builder.h" #include "catch_evaluate.hpp" #include "catch_tostring.hpp" namespace Catch { // Wraps the LHS of an expression and captures the operator and RHS (if any) - wrapping them all // in an ExpressionResultBuilder object template class ExpressionLhs { void operator = ( ExpressionLhs const& ); public: ExpressionLhs( T lhs ) : m_lhs( lhs ) {} template ExpressionResultBuilder& operator == ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator != ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator < ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator > ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator <= ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator >= ( RhsT const& rhs ) { return captureExpression( rhs ); } ExpressionResultBuilder& operator == ( bool rhs ) { return captureExpression( rhs ); } ExpressionResultBuilder& operator != ( bool rhs ) { return captureExpression( rhs ); } ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition ) { bool value = m_lhs ? true : false; return m_result .setLhs( Catch::toString( value ) ) .setResultType( value ) .endExpression( resultDisposition ); } // Only simple binary expressions are allowed on the LHS. // If more complex compositions are required then place the sub expression in parentheses template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); private: template ExpressionResultBuilder& captureExpression( RhsT const& rhs ) { return m_result .setResultType( Internal::compare( m_lhs, rhs ) ) .setLhs( Catch::toString( m_lhs ) ) .setRhs( Catch::toString( rhs ) ) .setOp( Internal::OperatorTraits::getName() ); } private: ExpressionResultBuilder m_result; T m_lhs; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_expressionresult_builder.h000066400000000000000000000045101221513074500312330ustar00rootroot00000000000000/* * Created by Phil on 8/5/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_ASSERTIONRESULT_BUILDER_H_INCLUDED #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_BUILDER_H_INCLUDED #include "catch_tostring.hpp" #include "catch_assertionresult.h" #include "catch_result_type.h" #include "catch_evaluate.hpp" #include "catch_common.h" namespace Catch { struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; // Wraps the (stringised versions of) the lhs, operator and rhs of an expression - as well as // the result of evaluating it. This is used to build an AssertionResult object class ExpressionResultBuilder { public: ExpressionResultBuilder( ResultWas::OfType resultType = ResultWas::Unknown ); ExpressionResultBuilder( ExpressionResultBuilder const& other ); ExpressionResultBuilder& operator=(ExpressionResultBuilder const& other ); ExpressionResultBuilder& setResultType( ResultWas::OfType result ); ExpressionResultBuilder& setResultType( bool result ); ExpressionResultBuilder& setLhs( std::string const& lhs ); ExpressionResultBuilder& setRhs( std::string const& rhs ); ExpressionResultBuilder& setOp( std::string const& op ); ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition ); template ExpressionResultBuilder& operator << ( T const& value ) { m_stream << value; return *this; } std::string reconstructExpression( AssertionInfo const& info ) const; AssertionResult buildResult( AssertionInfo const& info ) const; template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); private: AssertionResultData m_data; struct ExprComponents { ExprComponents() : shouldNegate( false ) {} bool shouldNegate; std::string lhs, rhs, op; } m_exprComponents; std::ostringstream m_stream; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_ASSERTIONRESULT_BUILDER_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_expressionresult_builder.hpp000066400000000000000000000103761221513074500316020ustar00rootroot00000000000000/* * Created by Phil on 8/8/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED #define TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED #include "catch_expressionresult_builder.h" #include namespace Catch { ExpressionResultBuilder::ExpressionResultBuilder( ResultWas::OfType resultType ) { m_data.resultType = resultType; } ExpressionResultBuilder::ExpressionResultBuilder( ExpressionResultBuilder const& other ) : m_data( other.m_data ), m_exprComponents( other.m_exprComponents ) { m_stream << other.m_stream.str(); } ExpressionResultBuilder& ExpressionResultBuilder::operator=(ExpressionResultBuilder const& other ) { m_data = other.m_data; m_exprComponents = other.m_exprComponents; m_stream.str(""); m_stream << other.m_stream.str(); return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setResultType( ResultWas::OfType result ) { m_data.resultType = result; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setResultType( bool result ) { m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::endExpression( ResultDisposition::Flags resultDisposition ) { m_exprComponents.shouldNegate = shouldNegate( resultDisposition ); return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setLhs( std::string const& lhs ) { m_exprComponents.lhs = lhs; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setRhs( std::string const& rhs ) { m_exprComponents.rhs = rhs; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setOp( std::string const& op ) { m_exprComponents.op = op; return *this; } AssertionResult ExpressionResultBuilder::buildResult( AssertionInfo const& info ) const { assert( m_data.resultType != ResultWas::Unknown ); AssertionResultData data = m_data; // Flip bool results if shouldNegate is set if( m_exprComponents.shouldNegate && data.resultType == ResultWas::Ok ) data.resultType = ResultWas::ExpressionFailed; else if( m_exprComponents.shouldNegate && data.resultType == ResultWas::ExpressionFailed ) data.resultType = ResultWas::Ok; data.message = m_stream.str(); data.reconstructedExpression = reconstructExpression( info ); if( m_exprComponents.shouldNegate ) { if( m_exprComponents.op == "" ) data.reconstructedExpression = "!" + data.reconstructedExpression; else data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; } return AssertionResult( info, data ); } std::string ExpressionResultBuilder::reconstructExpression( AssertionInfo const& info ) const { if( m_exprComponents.op == "" ) return m_exprComponents.lhs.empty() ? info.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; else if( m_exprComponents.op == "matches" ) return m_exprComponents.lhs + " " + m_exprComponents.rhs; else if( m_exprComponents.op != "!" ) { if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && m_exprComponents.lhs.find("\n") == std::string::npos && m_exprComponents.rhs.find("\n") == std::string::npos ) return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; else return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; } else return "{can't expand - use " + info.macroName + "_FALSE( " + info.capturedExpression.substr(1) + " ) instead of " + info.macroName + "( " + info.capturedExpression + " ) for better diagnostics}"; } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_generators.hpp000066400000000000000000000122631221513074500266040ustar00rootroot00000000000000/* * Created by Phil on 27/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED #define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED #include "catch_context.h" #include #include #include #include namespace Catch { template struct IGenerator { virtual ~IGenerator() {} virtual T getValue( std::size_t index ) const = 0; virtual std::size_t size () const = 0; }; template class BetweenGenerator : public IGenerator { public: BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} virtual T getValue( std::size_t index ) const { return m_from+static_cast( index ); } virtual std::size_t size() const { return static_cast( 1+m_to-m_from ); } private: T m_from; T m_to; }; template class ValuesGenerator : public IGenerator { public: ValuesGenerator(){} void add( T value ) { m_values.push_back( value ); } virtual T getValue( std::size_t index ) const { return m_values[index]; } virtual std::size_t size() const { return m_values.size(); } private: std::vector m_values; }; template class CompositeGenerator { public: CompositeGenerator() : m_totalSize( 0 ) {} // *** Move semantics, similar to auto_ptr *** CompositeGenerator( CompositeGenerator& other ) : m_fileInfo( other.m_fileInfo ), m_totalSize( 0 ) { move( other ); } CompositeGenerator& setFileInfo( const char* fileInfo ) { m_fileInfo = fileInfo; return *this; } ~CompositeGenerator() { deleteAll( m_composed ); } operator T () const { size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); typename std::vector*>::const_iterator it = m_composed.begin(); typename std::vector*>::const_iterator itEnd = m_composed.end(); for( size_t index = 0; it != itEnd; ++it ) { const IGenerator* generator = *it; if( overallIndex >= index && overallIndex < index + generator->size() ) { return generator->getValue( overallIndex-index ); } index += generator->size(); } CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so } void add( const IGenerator* generator ) { m_totalSize += generator->size(); m_composed.push_back( generator ); } CompositeGenerator& then( CompositeGenerator& other ) { move( other ); return *this; } CompositeGenerator& then( T value ) { ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( value ); add( valuesGen ); return *this; } private: void move( CompositeGenerator& other ) { std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); m_totalSize += other.m_totalSize; other.m_composed.clear(); } std::vector*> m_composed; std::string m_fileInfo; size_t m_totalSize; }; namespace Generators { template CompositeGenerator between( T from, T to ) { CompositeGenerator generators; generators.add( new BetweenGenerator( from, to ) ); return generators; } template CompositeGenerator values( T val1, T val2 ) { CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); generators.add( valuesGen ); return generators; } template CompositeGenerator values( T val1, T val2, T val3 ){ CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); valuesGen->add( val3 ); generators.add( valuesGen ); return generators; } template CompositeGenerator values( T val1, T val2, T val3, T val4 ) { CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); valuesGen->add( val3 ); valuesGen->add( val4 ); generators.add( valuesGen ); return generators; } } // end namespace Generators using namespace Generators; } // end namespace Catch #define INTERNAL_CATCH_LINESTR2( line ) #line #define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) #define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) #endif // TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_generators_impl.hpp000066400000000000000000000047161221513074500276310ustar00rootroot00000000000000/* * Created by Phil on 28/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED #define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED #include "catch_interfaces_generators.h" #include "catch_common.h" #include #include #include namespace Catch { struct GeneratorInfo : IGeneratorInfo { GeneratorInfo( std::size_t size ) : m_size( size ), m_currentIndex( 0 ) {} bool moveNext() { if( ++m_currentIndex == m_size ) { m_currentIndex = 0; return false; } return true; } std::size_t getCurrentIndex() const { return m_currentIndex; } std::size_t m_size; std::size_t m_currentIndex; }; /////////////////////////////////////////////////////////////////////////// class GeneratorsForTest : public IGeneratorsForTest { public: ~GeneratorsForTest() { deleteAll( m_generatorsInOrder ); } IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { std::map::const_iterator it = m_generatorsByName.find( fileInfo ); if( it == m_generatorsByName.end() ) { IGeneratorInfo* info = new GeneratorInfo( size ); m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); m_generatorsInOrder.push_back( info ); return *info; } return *it->second; } bool moveNext() { std::vector::const_iterator it = m_generatorsInOrder.begin(); std::vector::const_iterator itEnd = m_generatorsInOrder.end(); for(; it != itEnd; ++it ) { if( (*it)->moveNext() ) return true; } return false; } private: std::map m_generatorsByName; std::vector m_generatorsInOrder; }; IGeneratorsForTest* createGeneratorsForTest() { return new GeneratorsForTest(); } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_impl.hpp000066400000000000000000000062041221513074500253720ustar00rootroot00000000000000/* * Created by Phil on 5/8/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED #define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED // Collect all the implementation files together here // These are the equivalent of what would usually be cpp files #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wweak-vtables" #endif #include "catch_runner.hpp" #include "catch_registry_hub.hpp" #include "catch_notimplemented_exception.hpp" #include "catch_context_impl.hpp" #include "catch_console_colour_impl.hpp" #include "catch_generators_impl.hpp" #include "catch_assertionresult.hpp" #include "catch_expressionresult_builder.hpp" #include "catch_test_case_info.hpp" #include "catch_tags.hpp" #include "catch_version.hpp" #include "catch_text.hpp" #include "catch_message.hpp" #include "catch_legacy_reporter_adapter.hpp" #include "catch_timer.hpp" #include "../reporters/catch_reporter_xml.hpp" #include "../reporters/catch_reporter_junit.hpp" #include "../reporters/catch_reporter_console.hpp" namespace Catch { NonCopyable::~NonCopyable() {} IShared::~IShared() {} StreamBufBase::~StreamBufBase() throw() {} IContext::~IContext() {} IResultCapture::~IResultCapture() {} ITestCase::~ITestCase() {} ITestCaseRegistry::~ITestCaseRegistry() {} IRegistryHub::~IRegistryHub() {} IMutableRegistryHub::~IMutableRegistryHub() {} IExceptionTranslator::~IExceptionTranslator() {} IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} IReporter::~IReporter() {} IReporterFactory::~IReporterFactory() {} IReporterRegistry::~IReporterRegistry() {} IStreamingReporter::~IStreamingReporter() {} AssertionStats::~AssertionStats() {} SectionStats::~SectionStats() {} TestCaseStats::~TestCaseStats() {} TestGroupStats::~TestGroupStats() {} TestRunStats::~TestRunStats() {} CumulativeReporterBase::SectionNode::~SectionNode() {} CumulativeReporterBase::~CumulativeReporterBase() {} StreamingReporterBase::~StreamingReporterBase() {} ConsoleReporter::~ConsoleReporter() {} IRunner::~IRunner() {} IMutableContext::~IMutableContext() {} IConfig::~IConfig() {} XmlReporter::~XmlReporter() {} JunitReporter::~JunitReporter() {} TestRegistry::~TestRegistry() {} FreeFunctionTestCase::~FreeFunctionTestCase() {} IGeneratorInfo::~IGeneratorInfo() {} IGeneratorsForTest::~IGeneratorsForTest() {} TagParser::~TagParser() {} TagExtracter::~TagExtracter() {} TagExpressionParser::~TagExpressionParser() {} Matchers::Impl::StdString::Equals::~Equals() {} Matchers::Impl::StdString::Contains::~Contains() {} Matchers::Impl::StdString::StartsWith::~StartsWith() {} Matchers::Impl::StdString::EndsWith::~EndsWith() {} void Config::dummy() {} INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) } #ifdef __clang__ #pragma clang diagnostic pop #endif #endif // TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_capture.h000066400000000000000000000031271221513074500277400ustar00rootroot00000000000000/* * Created by Phil on 07/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED #include #include "catch_result_type.h" #include "catch_totals.hpp" #include "catch_common.h" namespace Catch { class TestCase; class ExpressionResultBuilder; class AssertionResult; struct AssertionInfo; struct SectionInfo; struct MessageInfo; class ScopedMessageBuilder; struct IResultCapture { virtual ~IResultCapture(); virtual void assertionEnded( AssertionResult const& result ) = 0; virtual bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) = 0; virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0; virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( MessageInfo const& message ) = 0; virtual bool shouldDebugBreak() const = 0; virtual ResultAction::Value acceptExpression( ExpressionResultBuilder const& assertionResult, AssertionInfo const& assertionInfo ) = 0; virtual std::string getCurrentTestName() const = 0; virtual const AssertionResult* getLastResult() const = 0; }; } #endif // TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_config.h000066400000000000000000000024411221513074500275400ustar00rootroot00000000000000/* * Created by Phil on 05/06/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED #include #include #include "catch_ptr.hpp" namespace Catch { struct Verbosity { enum Level { NoOutput = 0, Quiet, Normal }; }; struct WarnAbout { enum What { Nothing = 0x00, NoAssertions = 0x01 }; }; struct ShowDurations { enum OrNot { DefaultForReporter, Always, Never }; }; struct IConfig : IShared { virtual ~IConfig(); virtual bool allowThrows() const = 0; virtual std::ostream& stream() const = 0; virtual std::string name() const = 0; virtual bool includeSuccessfulResults() const = 0; virtual bool shouldDebugBreak() const = 0; virtual bool warnAboutMissingAssertions() const = 0; virtual int abortAfter() const = 0; virtual ShowDurations::OrNot showDurations() const = 0; }; } #endif // TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_exception.h000066400000000000000000000043701221513074500302740ustar00rootroot00000000000000/* * Created by Phil on 20/04/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED #include #include "catch_interfaces_registry_hub.h" namespace Catch { typedef std::string(*exceptionTranslateFunction)(); struct IExceptionTranslator { virtual ~IExceptionTranslator(); virtual std::string translate() const = 0; }; struct IExceptionTranslatorRegistry { virtual ~IExceptionTranslatorRegistry(); virtual std::string translateActiveException() const = 0; }; class ExceptionTranslatorRegistrar { template class ExceptionTranslator : public IExceptionTranslator { public: ExceptionTranslator( std::string(*translateFunction)( T& ) ) : m_translateFunction( translateFunction ) {} virtual std::string translate() const { try { throw; } catch( T& ex ) { return m_translateFunction( ex ); } } protected: std::string(*m_translateFunction)( T& ); }; public: template ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { getMutableRegistryHub().registerTranslator ( new ExceptionTranslator( translateFunction ) ); } }; } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) #endif // TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_generators.h000066400000000000000000000016561221513074500304530ustar00rootroot00000000000000/* * Created by Phil on 7/8/2012. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED #include namespace Catch { struct IGeneratorInfo { virtual ~IGeneratorInfo(); virtual bool moveNext() = 0; virtual std::size_t getCurrentIndex() const = 0; }; struct IGeneratorsForTest { virtual ~IGeneratorsForTest(); virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; virtual bool moveNext() = 0; }; IGeneratorsForTest* createGeneratorsForTest(); } // end namespace Catch #endif // TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_registry_hub.h000066400000000000000000000027011221513074500310000ustar00rootroot00000000000000/* * Created by Phil on 5/8/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED #include "catch_interfaces_reporter.h" #include "catch_interfaces_config.h" #include namespace Catch { class TestCase; struct ITestCaseRegistry; struct IExceptionTranslatorRegistry; struct IExceptionTranslator; struct IRegistryHub { virtual ~IRegistryHub(); virtual IReporterRegistry const& getReporterRegistry() const = 0; virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; }; struct IMutableRegistryHub { virtual ~IMutableRegistryHub(); virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; virtual void registerTest( TestCase const& testInfo ) = 0; virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; }; IRegistryHub& getRegistryHub(); IMutableRegistryHub& getMutableRegistryHub(); void cleanUp(); std::string translateActiveException(); } #endif // TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_reporter.h000066400000000000000000000373111221513074500301410ustar00rootroot00000000000000/* * Created by Phil on 31/12/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED #include "catch_common.h" #include "catch_totals.hpp" #include "catch_ptr.hpp" #include "catch_config.hpp" #include "catch_test_case_info.h" #include "catch_assertionresult.h" #include "catch_message.h" #include "catch_option.hpp" #include #include #include #include namespace Catch { struct ReporterConfig { explicit ReporterConfig( Ptr const& _fullConfig ) : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} std::ostream& stream() const { return *m_stream; } Ptr fullConfig() const { return m_fullConfig; } private: std::ostream* m_stream; Ptr m_fullConfig; }; struct ReporterPreferences { ReporterPreferences() : shouldRedirectStdOut( false ) {} bool shouldRedirectStdOut; }; template struct LazyStat : Option { LazyStat() : used( false ) {} LazyStat& operator=( T const& _value ) { Option::operator=( _value ); used = false; return *this; } void reset() { Option::reset(); used = false; } bool used; }; struct TestRunInfo { TestRunInfo( std::string const& _name ) : name( _name ) {} std::string name; }; struct GroupInfo { GroupInfo( std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount ) : name( _name ), groupIndex( _groupIndex ), groupsCounts( _groupsCount ) {} std::string name; std::size_t groupIndex; std::size_t groupsCounts; }; struct SectionInfo { SectionInfo( std::string const& _name, std::string const& _description, SourceLineInfo const& _lineInfo ) : name( _name ), description( _description ), lineInfo( _lineInfo ) {} std::string name; std::string description; SourceLineInfo lineInfo; }; struct AssertionStats { AssertionStats( AssertionResult const& _assertionResult, std::vector const& _infoMessages, Totals const& _totals ) : assertionResult( _assertionResult ), infoMessages( _infoMessages ), totals( _totals ) { if( assertionResult.hasMessage() ) { // Copy message into messages list. // !TBD This should have been done earlier, somewhere MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); builder << assertionResult.getMessage(); builder.m_info.message = builder.m_stream.str(); infoMessages.push_back( builder.m_info ); } } virtual ~AssertionStats(); AssertionResult assertionResult; std::vector infoMessages; Totals totals; }; struct SectionStats { SectionStats( SectionInfo const& _sectionInfo, Counts const& _assertions, double _durationInSeconds, bool _missingAssertions ) : sectionInfo( _sectionInfo ), assertions( _assertions ), durationInSeconds( _durationInSeconds ), missingAssertions( _missingAssertions ) {} virtual ~SectionStats(); SectionInfo sectionInfo; Counts assertions; double durationInSeconds; bool missingAssertions; }; struct TestCaseStats { TestCaseStats( TestCaseInfo const& _testInfo, Totals const& _totals, std::string const& _stdOut, std::string const& _stdErr, bool _aborting ) : testInfo( _testInfo ), totals( _totals ), stdOut( _stdOut ), stdErr( _stdErr ), aborting( _aborting ) {} virtual ~TestCaseStats(); TestCaseInfo testInfo; Totals totals; std::string stdOut; std::string stdErr; bool aborting; }; struct TestGroupStats { TestGroupStats( GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting ) : groupInfo( _groupInfo ), totals( _totals ), aborting( _aborting ) {} TestGroupStats( GroupInfo const& _groupInfo ) : groupInfo( _groupInfo ), aborting( false ) {} virtual ~TestGroupStats(); GroupInfo groupInfo; Totals totals; bool aborting; }; struct TestRunStats { TestRunStats( TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting ) : runInfo( _runInfo ), totals( _totals ), aborting( _aborting ) {} TestRunStats( TestRunStats const& _other ) : runInfo( _other.runInfo ), totals( _other.totals ), aborting( _other.aborting ) {} virtual ~TestRunStats(); TestRunInfo runInfo; Totals totals; bool aborting; }; struct IStreamingReporter : IShared { virtual ~IStreamingReporter(); // Implementing class must also provide the following static method: // static std::string getDescription(); virtual ReporterPreferences getPreferences() const = 0; virtual void noMatchingTestCases( std::string const& spec ) = 0; virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; virtual void sectionEnded( SectionStats const& sectionStats ) = 0; virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; }; struct StreamingReporterBase : SharedImpl { StreamingReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) {} virtual ~StreamingReporterBase(); virtual void noMatchingTestCases( std::string const& ) {} virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { currentTestRunInfo = _testRunInfo; } virtual void testGroupStarting( GroupInfo const& _groupInfo ) { currentGroupInfo = _groupInfo; } virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { currentTestCaseInfo = _testInfo; } virtual void sectionStarting( SectionInfo const& _sectionInfo ) { m_sectionStack.push_back( _sectionInfo ); } virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { m_sectionStack.pop_back(); } virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { currentTestCaseInfo.reset(); assert( m_sectionStack.empty() ); } virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { currentGroupInfo.reset(); } virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { currentTestCaseInfo.reset(); currentGroupInfo.reset(); currentTestRunInfo.reset(); } Ptr m_config; std::ostream& stream; LazyStat currentTestRunInfo; LazyStat currentGroupInfo; LazyStat currentTestCaseInfo; std::vector m_sectionStack; }; struct CumulativeReporterBase : SharedImpl { template struct Node : SharedImpl<> { explicit Node( T const& _value ) : value( _value ) {} virtual ~Node() {} typedef std::vector > ChildNodes; T value; ChildNodes children; }; struct SectionNode : SharedImpl<> { explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} virtual ~SectionNode(); bool operator == ( SectionNode const& other ) const { return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; } bool operator == ( Ptr const& other ) const { return operator==( *other ); } SectionStats stats; typedef std::vector > ChildSections; typedef std::vector Assertions; ChildSections childSections; Assertions assertions; std::string stdOut; std::string stdErr; }; friend bool operator == ( Ptr const& node, SectionInfo const& other ) { return node->stats.sectionInfo.lineInfo == other.lineInfo; } typedef Node TestCaseNode; typedef Node TestGroupNode; typedef Node TestRunNode; CumulativeReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) {} ~CumulativeReporterBase(); virtual void testRunStarting( TestRunInfo const& ) {} virtual void testGroupStarting( GroupInfo const& ) {} virtual void testCaseStarting( TestCaseInfo const& ) {} virtual void sectionStarting( SectionInfo const& sectionInfo ) { SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); Ptr node; if( m_sectionStack.empty() ) { if( !m_rootSection ) m_rootSection = new SectionNode( incompleteStats ); node = m_rootSection; } else { SectionNode& parentNode = *m_sectionStack.back(); SectionNode::ChildSections::const_iterator it = std::find( parentNode.childSections.begin(), parentNode.childSections.end(), sectionInfo ); if( it == parentNode.childSections.end() ) { node = new SectionNode( incompleteStats ); parentNode.childSections.push_back( node ); } else node = *it; } m_sectionStack.push_back( node ); m_deepestSection = node; } virtual void assertionStarting( AssertionInfo const& ) {} virtual bool assertionEnded( AssertionStats const& assertionStats ) { assert( !m_sectionStack.empty() ); SectionNode& sectionNode = *m_sectionStack.back(); sectionNode.assertions.push_back( assertionStats ); return true; } virtual void sectionEnded( SectionStats const& sectionStats ) { assert( !m_sectionStack.empty() ); SectionNode& node = *m_sectionStack.back(); node.stats = sectionStats; m_sectionStack.pop_back(); } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { Ptr node = new TestCaseNode( testCaseStats ); assert( m_sectionStack.size() == 0 ); node->children.push_back( m_rootSection ); m_testCases.push_back( node ); m_rootSection.reset(); assert( m_deepestSection ); m_deepestSection->stdOut = testCaseStats.stdOut; m_deepestSection->stdErr = testCaseStats.stdErr; } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { Ptr node = new TestGroupNode( testGroupStats ); node->children.swap( m_testCases ); m_testGroups.push_back( node ); } virtual void testRunEnded( TestRunStats const& testRunStats ) { Ptr node = new TestRunNode( testRunStats ); node->children.swap( m_testGroups ); m_testRuns.push_back( node ); testRunEnded(); } virtual void testRunEnded() = 0; Ptr m_config; std::ostream& stream; std::vector m_assertions; std::vector > > m_sections; std::vector > m_testCases; std::vector > m_testGroups; std::vector > m_testRuns; Ptr m_rootSection; Ptr m_deepestSection; std::vector > m_sectionStack; }; // Deprecated struct IReporter : IShared { virtual ~IReporter(); virtual bool shouldRedirectStdout() const = 0; virtual void StartTesting() = 0; virtual void EndTesting( Totals const& totals ) = 0; virtual void StartGroup( std::string const& groupName ) = 0; virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; virtual void Aborted() = 0; virtual void Result( AssertionResult const& result ) = 0; }; struct IReporterFactory { virtual ~IReporterFactory(); virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; virtual std::string getDescription() const = 0; }; struct IReporterRegistry { typedef std::map FactoryMap; virtual ~IReporterRegistry(); virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; virtual FactoryMap const& getFactories() const = 0; }; inline std::string trim( std::string const& str ) { static char const* whitespaceChars = "\n\r\t "; std::string::size_type start = str.find_first_not_of( whitespaceChars ); std::string::size_type end = str.find_last_not_of( whitespaceChars ); return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; } } #endif // TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_runner.h000066400000000000000000000011011221513074500275740ustar00rootroot00000000000000/* * Created by Phil on 07/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED #include "catch_totals.hpp" #include namespace Catch { class TestCase; struct IRunner { virtual ~IRunner(); }; } #endif // TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_interfaces_testcase.h000066400000000000000000000016431221513074500301110ustar00rootroot00000000000000/* * Created by Phil on 07/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED #define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED #include "catch_ptr.hpp" #include namespace Catch { class TestCaseFilters; struct ITestCase : IShared { virtual void invoke () const = 0; protected: virtual ~ITestCase(); }; class TestCase; struct ITestCaseRegistry { virtual ~ITestCaseRegistry(); virtual std::vector const& getAllTests() const = 0; virtual std::vector getMatchingTestCases( std::string const& rawTestSpec ) const = 0; }; } #endif // TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_legacy_reporter_adapter.h000066400000000000000000000031131221513074500307530ustar00rootroot00000000000000/* * Created by Phil on 6th April 2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED #include "catch_interfaces_reporter.h" namespace Catch { class LegacyReporterAdapter : public SharedImpl { public: LegacyReporterAdapter( Ptr const& legacyReporter ); virtual ~LegacyReporterAdapter(); virtual ReporterPreferences getPreferences() const; virtual void noMatchingTestCases( std::string const& ); virtual void testRunStarting( TestRunInfo const& ); virtual void testGroupStarting( GroupInfo const& groupInfo ); virtual void testCaseStarting( TestCaseInfo const& testInfo ); virtual void sectionStarting( SectionInfo const& sectionInfo ); virtual void assertionStarting( AssertionInfo const& ); virtual bool assertionEnded( AssertionStats const& assertionStats ); virtual void sectionEnded( SectionStats const& sectionStats ); virtual void testCaseEnded( TestCaseStats const& testCaseStats ); virtual void testGroupEnded( TestGroupStats const& testGroupStats ); virtual void testRunEnded( TestRunStats const& testRunStats ); private: Ptr m_legacyReporter; }; } #endif // TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_legacy_reporter_adapter.hpp000066400000000000000000000071201221513074500313150ustar00rootroot00000000000000/* * Created by Phil on 6th April 2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED #include "catch_legacy_reporter_adapter.h" namespace Catch { LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) : m_legacyReporter( legacyReporter ) {} LegacyReporterAdapter::~LegacyReporterAdapter() {} ReporterPreferences LegacyReporterAdapter::getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); return prefs; } void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { m_legacyReporter->StartTesting(); } void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { m_legacyReporter->StartGroup( groupInfo.name ); } void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { m_legacyReporter->StartTestCase( testInfo ); } void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); } void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { // Not on legacy interface } bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); it != itEnd; ++it ) { if( it->type == ResultWas::Info ) { ExpressionResultBuilder expressionBuilder( it->type ); expressionBuilder << it->message; AssertionInfo info( it->macroName, it->lineInfo, "", ResultDisposition::Normal ); AssertionResult result = expressionBuilder.buildResult( info ); m_legacyReporter->Result( result ); } } } m_legacyReporter->Result( assertionStats.assertionResult ); return true; } void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { if( sectionStats.missingAssertions ) m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); } void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { m_legacyReporter->EndTestCase ( testCaseStats.testInfo, testCaseStats.totals, testCaseStats.stdOut, testCaseStats.stdErr ); } void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { if( testGroupStats.aborting ) m_legacyReporter->Aborted(); m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); } void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { m_legacyReporter->EndTesting( testRunStats.totals ); } } #endif // TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_list.hpp000066400000000000000000000206651221513074500254130ustar00rootroot00000000000000/* * Created by Phil on 5/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED #define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED #include "catch_commandline.hpp" #include "catch_text.h" #include "catch_console_colour.hpp" #include #include namespace Catch { inline bool matchesFilters( std::vector const& filters, TestCase const& testCase ) { std::vector::const_iterator it = filters.begin(); std::vector::const_iterator itEnd = filters.end(); for(; it != itEnd; ++it ) if( !it->shouldInclude( testCase ) ) return false; return true; } inline std::size_t listTests( Config const& config ) { if( config.filters().empty() ) std::cout << "All available test cases:\n"; else std::cout << "Matching test cases:\n"; std::vector const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests(); std::vector::const_iterator it = allTests.begin(), itEnd = allTests.end(); // First pass - get max tags std::size_t maxTagLen = 0; std::size_t maxNameLen = 0; for(; it != itEnd; ++it ) { if( matchesFilters( config.filters(), *it ) ) { maxTagLen = (std::max)( it->getTestCaseInfo().tagsAsString.size(), maxTagLen ); maxNameLen = (std::max)( it->getTestCaseInfo().name.size(), maxNameLen ); } } // Try to fit everything in. If not shrink tag column first, down to 30 // then shrink name column until it all fits (strings will be wrapped within column) while( maxTagLen + maxNameLen > CATCH_CONFIG_CONSOLE_WIDTH-5 ) { if( maxTagLen > 30 ) --maxTagLen; else --maxNameLen; } std::size_t matchedTests = 0; for( it = allTests.begin(); it != itEnd; ++it ) { if( matchesFilters( config.filters(), *it ) ) { matchedTests++; Text nameWrapper( it->getTestCaseInfo().name, TextAttributes() .setWidth( maxNameLen ) .setInitialIndent(2) .setIndent(4) ); Text tagsWrapper( it->getTestCaseInfo().tagsAsString, TextAttributes() .setWidth( maxTagLen ) .setInitialIndent(0) .setIndent( 2 ) ); for( std::size_t i = 0; i < (std::max)( nameWrapper.size(), tagsWrapper.size() ); ++i ) { Colour::Code colour = Colour::None; if( it->getTestCaseInfo().isHidden ) colour = Colour::SecondaryText; std::string nameCol; if( i < nameWrapper.size() ) { nameCol = nameWrapper[i]; } else { nameCol = " ..."; colour = Colour::SecondaryText; } { Colour colourGuard( colour ); std::cout << nameCol; } if( i < tagsWrapper.size() && !tagsWrapper[i].empty() ) { if( i == 0 ) { Colour colourGuard( Colour::SecondaryText ); std::cout << " " << std::string( maxNameLen - nameCol.size(), '.' ) << " "; } else { std::cout << std::string( maxNameLen - nameCol.size(), ' ' ) << " "; } std::cout << tagsWrapper[i]; } std::cout << "\n"; } } } if( config.filters().empty() ) std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl; else std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; return matchedTests; } inline std::size_t listTags( Config const& config ) { if( config.filters().empty() ) std::cout << "All available tags:\n"; else std::cout << "Matching tags:\n"; std::vector const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests(); std::vector::const_iterator it = allTests.begin(), itEnd = allTests.end(); std::map tagCounts; std::size_t maxTagLen = 0; for(; it != itEnd; ++it ) { if( matchesFilters( config.filters(), *it ) ) { for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), tagItEnd = it->getTestCaseInfo().tags.end(); tagIt != tagItEnd; ++tagIt ) { std::string tagName = *tagIt; maxTagLen = (std::max)( maxTagLen, tagName.size() ); std::map::iterator countIt = tagCounts.find( tagName ); if( countIt == tagCounts.end() ) tagCounts.insert( std::make_pair( tagName, 1 ) ); else countIt->second++; } } } maxTagLen +=4; if( maxTagLen > CATCH_CONFIG_CONSOLE_WIDTH-10 ) maxTagLen = CATCH_CONFIG_CONSOLE_WIDTH-10; for( std::map::const_iterator countIt = tagCounts.begin(), countItEnd = tagCounts.end(); countIt != countItEnd; ++countIt ) { Text wrapper( "[" + countIt->first + "]", TextAttributes() .setIndent(2) .setWidth( maxTagLen ) ); std::cout << wrapper; std::size_t dots = 2; if( maxTagLen > wrapper.last().size() ) dots += maxTagLen - wrapper.last().size(); { Colour colourGuard( Colour::SecondaryText ); std::cout << std::string( dots, '.' ); } std::cout << countIt->second << "\n"; } std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; return tagCounts.size(); } inline std::size_t listReporters( Config const& /*config*/ ) { std::cout << "Available reports:\n"; IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; std::size_t maxNameLen = 0; for(it = itBegin; it != itEnd; ++it ) maxNameLen = (std::max)( maxNameLen, it->first.size() ); for(it = itBegin; it != itEnd; ++it ) { Text wrapper( it->second->getDescription(), TextAttributes() .setInitialIndent( 0 ) .setIndent( 7+maxNameLen ) .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); std::cout << " " << it->first << ":" << std::string( maxNameLen - it->first.size() + 2, ' ' ) << wrapper << "\n"; } std::cout << std::endl; return factories.size(); } inline Option list( Config const& config ) { Option listedCount; if( config.listTests() ) listedCount = listedCount.valueOr(0) + listTests( config ); if( config.listTags() ) listedCount = listedCount.valueOr(0) + listTags( config ); if( config.listReporters() ) listedCount = listedCount.valueOr(0) + listReporters( config ); return listedCount; } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_matchers.hpp000066400000000000000000000210331221513074500262340ustar00rootroot00000000000000/* * Created by Phil Nash on 04/03/2012. * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED #define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED namespace Catch { namespace Matchers { namespace Impl { template struct Matcher : SharedImpl { typedef ExpressionT ExpressionType; virtual ~Matcher() {} virtual Ptr clone() const = 0; virtual bool match( ExpressionT const& expr ) const = 0; virtual std::string toString() const = 0; }; template struct MatcherImpl : Matcher { virtual Ptr > clone() const { return Ptr >( new DerivedT( static_cast( *this ) ) ); } }; namespace Generic { template class AllOf : public MatcherImpl, ExpressionT> { public: AllOf() {} AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} AllOf& add( Matcher const& matcher ) { m_matchers.push_back( matcher.clone() ); return *this; } virtual bool match( ExpressionT const& expr ) const { for( std::size_t i = 0; i < m_matchers.size(); ++i ) if( !m_matchers[i]->match( expr ) ) return false; return true; } virtual std::string toString() const { std::ostringstream oss; oss << "( "; for( std::size_t i = 0; i < m_matchers.size(); ++i ) { if( i != 0 ) oss << " and "; oss << m_matchers[i]->toString(); } oss << " )"; return oss.str(); } private: std::vector > > m_matchers; }; template class AnyOf : public MatcherImpl, ExpressionT> { public: AnyOf() {} AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} AnyOf& add( Matcher const& matcher ) { m_matchers.push_back( matcher.clone() ); return *this; } virtual bool match( ExpressionT const& expr ) const { for( std::size_t i = 0; i < m_matchers.size(); ++i ) if( m_matchers[i]->match( expr ) ) return true; return false; } virtual std::string toString() const { std::ostringstream oss; oss << "( "; for( std::size_t i = 0; i < m_matchers.size(); ++i ) { if( i != 0 ) oss << " or "; oss << m_matchers[i]->toString(); } oss << " )"; return oss.str(); } private: std::vector > > m_matchers; }; } namespace StdString { inline std::string makeString( std::string const& str ) { return str; } inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } struct Equals : MatcherImpl { Equals( std::string const& str ) : m_str( str ){} Equals( Equals const& other ) : m_str( other.m_str ){} virtual ~Equals(); virtual bool match( std::string const& expr ) const { return m_str == expr; } virtual std::string toString() const { return "equals: \"" + m_str + "\""; } std::string m_str; }; struct Contains : MatcherImpl { Contains( std::string const& substr ) : m_substr( substr ){} Contains( Contains const& other ) : m_substr( other.m_substr ){} virtual ~Contains(); virtual bool match( std::string const& expr ) const { return expr.find( m_substr ) != std::string::npos; } virtual std::string toString() const { return "contains: \"" + m_substr + "\""; } std::string m_substr; }; struct StartsWith : MatcherImpl { StartsWith( std::string const& substr ) : m_substr( substr ){} StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){} virtual ~StartsWith(); virtual bool match( std::string const& expr ) const { return expr.find( m_substr ) == 0; } virtual std::string toString() const { return "starts with: \"" + m_substr + "\""; } std::string m_substr; }; struct EndsWith : MatcherImpl { EndsWith( std::string const& substr ) : m_substr( substr ){} EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){} virtual ~EndsWith(); virtual bool match( std::string const& expr ) const { return expr.find( m_substr ) == expr.size() - m_substr.size(); } virtual std::string toString() const { return "ends with: \"" + m_substr + "\""; } std::string m_substr; }; } // namespace StdString } // namespace Impl // The following functions create the actual matcher objects. // This allows the types to be inferred template inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, Impl::Matcher const& m2 ) { return Impl::Generic::AllOf().add( m1 ).add( m2 ); } template inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, Impl::Matcher const& m2, Impl::Matcher const& m3 ) { return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); } template inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, Impl::Matcher const& m2 ) { return Impl::Generic::AnyOf().add( m1 ).add( m2 ); } template inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, Impl::Matcher const& m2, Impl::Matcher const& m3 ) { return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); } inline Impl::StdString::Equals Equals( std::string const& str ) { return Impl::StdString::Equals( str ); } inline Impl::StdString::Equals Equals( const char* str ) { return Impl::StdString::Equals( Impl::StdString::makeString( str ) ); } inline Impl::StdString::Contains Contains( std::string const& substr ) { return Impl::StdString::Contains( substr ); } inline Impl::StdString::Contains Contains( const char* substr ) { return Impl::StdString::Contains( Impl::StdString::makeString( substr ) ); } inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { return Impl::StdString::StartsWith( substr ); } inline Impl::StdString::StartsWith StartsWith( const char* substr ) { return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); } inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { return Impl::StdString::EndsWith( substr ); } inline Impl::StdString::EndsWith EndsWith( const char* substr ) { return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); } } // namespace Matchers using namespace Matchers; } // namespace Catch #endif // TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_message.h000066400000000000000000000034061221513074500255160ustar00rootroot00000000000000/* * Created by Phil Nash on 1/2/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED #define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED #include #include "catch_result_type.h" #include "catch_common.h" namespace Catch { struct MessageInfo { MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ); std::string macroName; SourceLineInfo lineInfo; ResultWas::OfType type; std::string message; unsigned int sequence; bool operator == ( MessageInfo const& other ) const { return sequence == other.sequence; } bool operator < ( MessageInfo const& other ) const { return sequence < other.sequence; } private: static unsigned int globalCount; }; struct MessageBuilder { MessageBuilder( std::string const& macroName, SourceLineInfo const& lineInfo, ResultWas::OfType type ) : m_info( macroName, lineInfo, type ) {} template MessageBuilder& operator << ( T const& value ) { m_stream << value; return *this; } MessageInfo m_info; std::ostringstream m_stream; }; class ScopedMessage { public: ScopedMessage( MessageBuilder const& builder ); ~ScopedMessage(); MessageInfo m_info; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_message.hpp000066400000000000000000000024321221513074500260540ustar00rootroot00000000000000/* * Created by Phil Nash on 1/2/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED #define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED #include "catch_message.h" namespace Catch { MessageInfo::MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ) : macroName( _macroName ), lineInfo( _lineInfo ), type( _type ), sequence( ++globalCount ) {} // This may need protecting if threading support is added unsigned int MessageInfo::globalCount = 0; //////////////////////////////////////////////////////////////////////////// ScopedMessage::ScopedMessage( MessageBuilder const& builder ) : m_info( builder.m_info ) { m_info.message = builder.m_stream.str(); getResultCapture().pushScopedMessage( m_info ); } ScopedMessage::~ScopedMessage() { getResultCapture().popScopedMessage( m_info ); } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_notimplemented_exception.h000066400000000000000000000020321221513074500311660ustar00rootroot00000000000000/* * Created by Phil on 5/8/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED #include "catch_common.h" #include namespace Catch { class NotImplementedException : public std::exception { public: NotImplementedException( SourceLineInfo const& lineInfo ); virtual ~NotImplementedException() throw() {} virtual const char* what() const throw(); private: std::string m_what; SourceLineInfo m_lineInfo; }; } // end namespace Catch /////////////////////////////////////////////////////////////////////////////// #define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) #endif // TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_notimplemented_exception.hpp000066400000000000000000000016421221513074500315340ustar00rootroot00000000000000/* * Created by Phil on 5/8/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED #include "catch_notimplemented_exception.h" #include namespace Catch { NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) : m_lineInfo( lineInfo ) { std::ostringstream oss; oss << lineInfo << ": function "; oss << "not implemented"; m_what = oss.str(); } const char* NotImplementedException::what() const throw() { return m_what.c_str(); } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_objc.hpp000066400000000000000000000164621221513074500253550ustar00rootroot00000000000000/* * Created by Phil on 14/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED #define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED #include "catch_objc_arc.hpp" #import #include // NB. Any general catch headers included here must be included // in catch.hpp first to make sure they are included by the single // header for non obj-usage #include "internal/catch_test_case_info.h" /////////////////////////////////////////////////////////////////////////////// // This protocol is really only here for (self) documenting purposes, since // all its methods are optional. @protocol OcFixture @optional -(void) setUp; -(void) tearDown; @end namespace Catch { class OcMethod : public SharedImpl { public: OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} virtual void invoke() const { id obj = [[m_cls alloc] init]; performOptionalSelector( obj, @selector(setUp) ); performOptionalSelector( obj, m_sel ); performOptionalSelector( obj, @selector(tearDown) ); arcSafeRelease( obj ); } private: virtual ~OcMethod() {} Class m_cls; SEL m_sel; }; namespace Detail{ inline bool startsWith( std::string const& str, std::string const& sub ) { return str.length() > sub.length() && str.substr( 0, sub.length() ) == sub; } inline std::string getAnnotation( Class cls, std::string const& annotationName, std::string const& testCaseName ) { NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; SEL sel = NSSelectorFromString( selStr ); arcSafeRelease( selStr ); id value = performOptionalSelector( cls, sel ); if( value ) return [(NSString*)value UTF8String]; return ""; } } inline size_t registerTestMethods() { size_t noTestMethods = 0; int noClasses = objc_getClassList( NULL, 0 ); Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); objc_getClassList( classes, noClasses ); for( int c = 0; c < noClasses; c++ ) { Class cls = classes[c]; { u_int count; Method* methods = class_copyMethodList( cls, &count ); for( u_int m = 0; m < count ; m++ ) { SEL selector = method_getName(methods[m]); std::string methodName = sel_getName(selector); if( Detail::startsWith( methodName, "Catch_TestCase_" ) ) { std::string testCaseName = methodName.substr( 15 ); std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); const char* className = class_getName( cls ); getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); noTestMethods++; } } free(methods); } } return noTestMethods; } namespace Matchers { namespace Impl { namespace NSStringMatchers { template struct StringHolder : MatcherImpl{ StringHolder( NSString* substr ) : m_substr( [substr copy] ){} StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} StringHolder() { arcSafeRelease( m_substr ); } NSString* m_substr; }; struct Equals : StringHolder { Equals( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str isEqualToString:m_substr]; } virtual std::string toString() const { return "equals string: \"" + Catch::toString( m_substr ) + "\""; } }; struct Contains : StringHolder { Contains( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location != NSNotFound; } virtual std::string toString() const { return "contains string: \"" + Catch::toString( m_substr ) + "\""; } }; struct StartsWith : StringHolder { StartsWith( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == 0; } virtual std::string toString() const { return "starts with: \"" + Catch::toString( m_substr ) + "\""; } }; struct EndsWith : StringHolder { EndsWith( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == [str length] - [m_substr length]; } virtual std::string toString() const { return "ends with: \"" + Catch::toString( m_substr ) + "\""; } }; } // namespace NSStringMatchers } // namespace Impl inline Impl::NSStringMatchers::Equals Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } inline Impl::NSStringMatchers::Contains Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } inline Impl::NSStringMatchers::StartsWith StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } inline Impl::NSStringMatchers::EndsWith EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } } // namespace Matchers using namespace Matchers; } // namespace Catch /////////////////////////////////////////////////////////////////////////////// #define OC_TEST_CASE( name, desc )\ +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ {\ return @ name; \ }\ +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ { \ return @ desc; \ } \ -(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) #endif // TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_objc_arc.hpp000066400000000000000000000026061221513074500261750ustar00rootroot00000000000000/* * Created by Phil on 1/08/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED #define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED #import #ifdef __has_feature #define CATCH_ARC_ENABLED __has_feature(objc_arc) #else #define CATCH_ARC_ENABLED 0 #endif void arcSafeRelease( NSObject* obj ); id performOptionalSelector( id obj, SEL sel ); #if !CATCH_ARC_ENABLED inline void arcSafeRelease( NSObject* obj ) { [obj release]; } inline id performOptionalSelector( id obj, SEL sel ) { if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; return nil; } #define CATCH_UNSAFE_UNRETAINED #define CATCH_ARC_STRONG #else inline void arcSafeRelease( NSObject* ){} inline id performOptionalSelector( id obj, SEL sel ) { #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" #endif if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; #ifdef __clang__ #pragma clang diagnostic pop #endif return nil; } #define CATCH_UNSAFE_UNRETAINED __unsafe_unretained #define CATCH_ARC_STRONG __strong #endif #endif // TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_option.hpp000066400000000000000000000040531221513074500257410ustar00rootroot00000000000000/* * Created by Phil on 02/12/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED #define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED #include "catch_common.h" namespace Catch { // An optional type template class Option { public: Option() : nullableValue( NULL ) {} Option( T const& _value ) : nullableValue( new( storage ) T( _value ) ) {} Option( Option const& _other ) : nullableValue( _other ? new( storage ) T( *_other ) : NULL ) {} ~Option() { reset(); } Option& operator= ( Option const& _other ) { reset(); if( _other ) nullableValue = new( storage ) T( *_other ); return *this; } Option& operator = ( T const& _value ) { reset(); nullableValue = new( storage ) T( _value ); return *this; } void reset() { if( nullableValue ) nullableValue->~T(); nullableValue = NULL; } T& operator*() { return *nullableValue; } T const& operator*() const { return *nullableValue; } T* operator->() { return nullableValue; } const T* operator->() const { return nullableValue; } T valueOr( T const& defaultValue ) const { return nullableValue ? *nullableValue : defaultValue; } bool some() const { return nullableValue != NULL; } bool none() const { return nullableValue == NULL; } bool operator !() const { return nullableValue == NULL; } operator SafeBool::type() const { return SafeBool::makeSafe( some() ); } private: T* nullableValue; char storage[sizeof(T)]; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_platform.h000066400000000000000000000012471221513074500257170ustar00rootroot00000000000000/* * Created by Phil on 16/8/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ #ifndef TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED #define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) #define CATCH_PLATFORM_MAC #elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) #define CATCH_PLATFORM_IPHONE #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) #define CATCH_PLATFORM_WINDOWS #endif #endif // TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_ptr.hpp000066400000000000000000000045571221513074500252470ustar00rootroot00000000000000/* * Created by Phil on 02/05/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED #define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED #include "catch_common.h" #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { // An intrusive reference counting smart pointer. // T must implement addRef() and release() methods // typically implementing the IShared interface template class Ptr { public: Ptr() : m_p( NULL ){} Ptr( T* p ) : m_p( p ){ if( m_p ) m_p->addRef(); } Ptr( Ptr const& other ) : m_p( other.m_p ){ if( m_p ) m_p->addRef(); } ~Ptr(){ if( m_p ) m_p->release(); } void reset() { if( m_p ) m_p->release(); m_p = NULL; } Ptr& operator = ( T* p ){ Ptr temp( p ); swap( temp ); return *this; } Ptr& operator = ( Ptr const& other ){ Ptr temp( other ); swap( temp ); return *this; } void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } T* get() { return m_p; } const T* get() const{ return m_p; } T& operator*() const { return *m_p; } T* operator->() const { return m_p; } bool operator !() const { return m_p == NULL; } operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); } private: T* m_p; }; struct IShared : NonCopyable { virtual ~IShared(); virtual void addRef() const = 0; virtual void release() const = 0; }; template struct SharedImpl : T { SharedImpl() : m_rc( 0 ){} virtual void addRef() const { ++m_rc; } virtual void release() const { if( --m_rc == 0 ) delete this; } mutable unsigned int m_rc; }; } // end namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif #endif // TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_registry_hub.hpp000066400000000000000000000053551221513074500271450ustar00rootroot00000000000000/* * Created by Phil on 5/8/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED #define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED #include "catch_interfaces_registry_hub.h" #include "catch_test_case_registry_impl.hpp" #include "catch_reporter_registry.hpp" #include "catch_exception_translator_registry.hpp" namespace Catch { namespace { class RegistryHub : public IRegistryHub, public IMutableRegistryHub { RegistryHub( RegistryHub const& ); void operator=( RegistryHub const& ); public: // IRegistryHub RegistryHub() { } virtual IReporterRegistry const& getReporterRegistry() const { return m_reporterRegistry; } virtual ITestCaseRegistry const& getTestCaseRegistry() const { return m_testCaseRegistry; } virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { return m_exceptionTranslatorRegistry; } public: // IMutableRegistryHub virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { m_reporterRegistry.registerReporter( name, factory ); } virtual void registerTest( TestCase const& testInfo ) { m_testCaseRegistry.registerTest( testInfo ); } virtual void registerTranslator( const IExceptionTranslator* translator ) { m_exceptionTranslatorRegistry.registerTranslator( translator ); } private: TestRegistry m_testCaseRegistry; ReporterRegistry m_reporterRegistry; ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; }; // Single, global, instance inline RegistryHub*& getTheRegistryHub() { static RegistryHub* theRegistryHub = NULL; if( !theRegistryHub ) theRegistryHub = new RegistryHub(); return theRegistryHub; } } IRegistryHub& getRegistryHub() { return *getTheRegistryHub(); } IMutableRegistryHub& getMutableRegistryHub() { return *getTheRegistryHub(); } void cleanUp() { delete getTheRegistryHub(); getTheRegistryHub() = NULL; cleanUpContext(); } std::string translateActiveException() { return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_reporter_registrars.hpp000066400000000000000000000056611221513074500305460ustar00rootroot00000000000000/* * Created by Phil on 31/12/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED #define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED #include "catch_interfaces_registry_hub.h" #include "catch_legacy_reporter_adapter.h" namespace Catch { template class LegacyReporterRegistrar { class ReporterFactory : public IReporterFactory { virtual IStreamingReporter* create( ReporterConfig const& config ) const { return new LegacyReporterAdapter( new T( config ) ); } virtual std::string getDescription() const { return T::getDescription(); } }; public: LegacyReporterRegistrar( std::string const& name ) { getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); } }; template class ReporterRegistrar { class ReporterFactory : public IReporterFactory { // *** Please Note ***: // - If you end up here looking at a compiler error because it's trying to register // your custom reporter class be aware that the native reporter interface has changed // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. // However please consider updating to the new interface as the old one is now // deprecated and will probably be removed quite soon! // Please contact me via github if you have any questions at all about this. // In fact, ideally, please contact me anyway to let me know you've hit this - as I have // no idea who is actually using custom reporters at all (possibly no-one!). // The new interface is designed to minimise exposure to interface changes in the future. virtual IStreamingReporter* create( ReporterConfig const& config ) const { return new T( config ); } virtual std::string getDescription() const { return T::getDescription(); } }; public: ReporterRegistrar( std::string const& name ) { getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); } }; } #define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); #define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); #endif // TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_reporter_registry.hpp000066400000000000000000000024401221513074500302210ustar00rootroot00000000000000/* * Created by Phil on 29/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED #define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED #include "catch_interfaces_reporter.h" #include namespace Catch { class ReporterRegistry : public IReporterRegistry { public: virtual ~ReporterRegistry() { deleteAllValues( m_factories ); } virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const { FactoryMap::const_iterator it = m_factories.find( name ); if( it == m_factories.end() ) return NULL; return it->second->create( ReporterConfig( config ) ); } void registerReporter( std::string const& name, IReporterFactory* factory ) { m_factories.insert( std::make_pair( name, factory ) ); } FactoryMap const& getFactories() const { return m_factories; } private: FactoryMap m_factories; }; } #endif // TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_result_type.h000066400000000000000000000043621221513074500264530ustar00rootroot00000000000000/* * Created by Phil on 07/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED #define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED namespace Catch { // ResultWas::OfType enum struct ResultWas { enum OfType { Unknown = -1, Ok = 0, Info = 1, Warning = 2, FailureBit = 0x10, ExpressionFailed = FailureBit | 1, ExplicitFailure = FailureBit | 2, Exception = 0x100 | FailureBit, ThrewException = Exception | 1, DidntThrowException = Exception | 2 }; }; inline bool isOk( ResultWas::OfType resultType ) { return ( resultType & ResultWas::FailureBit ) == 0; } inline bool isJustInfo( int flags ) { return flags == ResultWas::Info; } // ResultAction::Value enum struct ResultAction { enum Value { None, Failed = 1, // Failure - but no debug break if Debug bit not set Debug = 2, // If this bit is set, invoke the debugger Abort = 4 // Test run should abort }; }; // ResultDisposition::Flags enum struct ResultDisposition { enum Flags { Normal = 0x00, ContinueOnFailure = 0x01, // Failures fail test, but execution continues NegateResult = 0x02, // Prefix expressiom with ! SuppressFail = 0x04 // Failures are reported but do not fail the test }; }; inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { return static_cast( static_cast( lhs ) | static_cast( rhs ) ); } inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } inline bool shouldNegate( int flags ) { return ( flags & ResultDisposition::NegateResult ) != 0; } inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_runner_impl.hpp000066400000000000000000000307041221513074500267650ustar00rootroot00000000000000 /* * Created by Phil on 22/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED #define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED #include "catch_interfaces_runner.h" #include "catch_interfaces_reporter.h" #include "catch_interfaces_exception.h" #include "catch_config.hpp" #include "catch_test_registry.hpp" #include "catch_test_case_info.h" #include "catch_capture.hpp" #include "catch_totals.hpp" #include "catch_test_spec.h" #include "catch_test_case_tracker.hpp" #include "catch_timer.h" #include #include namespace Catch { class StreamRedirect { public: StreamRedirect( std::ostream& stream, std::string& targetString ) : m_stream( stream ), m_prevBuf( stream.rdbuf() ), m_targetString( targetString ) { stream.rdbuf( m_oss.rdbuf() ); } ~StreamRedirect() { m_targetString += m_oss.str(); m_stream.rdbuf( m_prevBuf ); } private: std::ostream& m_stream; std::streambuf* m_prevBuf; std::ostringstream m_oss; std::string& m_targetString; }; /////////////////////////////////////////////////////////////////////////// class RunContext : public IResultCapture, public IRunner { RunContext( RunContext const& ); void operator =( RunContext const& ); public: explicit RunContext( Ptr const& config, Ptr const& reporter ) : m_runInfo( config->name() ), m_context( getCurrentMutableContext() ), m_activeTestCase( NULL ), m_config( config ), m_reporter( reporter ), m_prevRunner( &m_context.getRunner() ), m_prevResultCapture( &m_context.getResultCapture() ), m_prevConfig( m_context.getConfig() ) { m_context.setRunner( this ); m_context.setConfig( m_config ); m_context.setResultCapture( this ); m_reporter->testRunStarting( m_runInfo ); } virtual ~RunContext() { m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); m_context.setRunner( m_prevRunner ); m_context.setConfig( NULL ); m_context.setResultCapture( m_prevResultCapture ); m_context.setConfig( m_prevConfig ); } void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); } void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); } Totals runMatching( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { std::vector matchingTests = getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec ); Totals totals; testGroupStarting( testSpec, groupIndex, groupsCount ); std::vector::const_iterator it = matchingTests.begin(); std::vector::const_iterator itEnd = matchingTests.end(); for(; it != itEnd; ++it ) totals += runTest( *it ); testGroupEnded( testSpec, totals, groupIndex, groupsCount ); return totals; } Totals runTest( TestCase const& testCase ) { Totals prevTotals = m_totals; std::string redirectedCout; std::string redirectedCerr; TestCaseInfo testInfo = testCase.getTestCaseInfo(); m_reporter->testCaseStarting( testInfo ); m_activeTestCase = &testCase; m_testCaseTracker = TestCaseTracker( testInfo.name ); do { do { runCurrentTest( redirectedCout, redirectedCerr ); } while( !m_testCaseTracker->isCompleted() && !aborting() ); } while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); Totals deltaTotals = m_totals.delta( prevTotals ); m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded( TestCaseStats( testInfo, deltaTotals, redirectedCout, redirectedCerr, aborting() ) ); m_activeTestCase = NULL; m_testCaseTracker.reset(); return deltaTotals; } Ptr config() const { return m_config; } private: // IResultCapture virtual ResultAction::Value acceptExpression( ExpressionResultBuilder const& assertionResult, AssertionInfo const& assertionInfo ) { m_lastAssertionInfo = assertionInfo; return actOnCurrentResult( assertionResult.buildResult( assertionInfo ) ); } virtual void assertionEnded( AssertionResult const& result ) { if( result.getResultType() == ResultWas::Ok ) { m_totals.assertions.passed++; } else if( !result.isOk() ) { m_totals.assertions.failed++; } if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) m_messages.clear(); // Reset working state m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); } virtual bool sectionStarted ( SectionInfo const& sectionInfo, Counts& assertions ) { std::ostringstream oss; oss << sectionInfo.name << "@" << sectionInfo.lineInfo; if( !m_testCaseTracker->enterSection( oss.str() ) ) return false; m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; m_reporter->sectionStarting( sectionInfo ); assertions = m_totals.assertions; return true; } bool testForMissingAssertions( Counts& assertions ) { if( assertions.total() != 0 || !m_config->warnAboutMissingAssertions() || m_testCaseTracker->currentSectionHasChildren() ) return false; m_totals.assertions.failed++; assertions.failed++; return true; } virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) { if( std::uncaught_exception() ) { m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) ); return; } Counts assertions = m_totals.assertions - prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); m_testCaseTracker->leaveSection(); m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) ); m_messages.clear(); } virtual void pushScopedMessage( MessageInfo const& message ) { m_messages.push_back( message ); } virtual void popScopedMessage( MessageInfo const& message ) { m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); } virtual bool shouldDebugBreak() const { return m_config->shouldDebugBreak(); } virtual std::string getCurrentTestName() const { return m_activeTestCase ? m_activeTestCase->getTestCaseInfo().name : ""; } virtual const AssertionResult* getLastResult() const { return &m_lastResult; } public: // !TBD We need to do this another way! bool aborting() const { return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); } private: ResultAction::Value actOnCurrentResult( AssertionResult const& result ) { m_lastResult = result; assertionEnded( m_lastResult ); ResultAction::Value action = ResultAction::None; if( !m_lastResult.isOk() ) { action = ResultAction::Failed; if( shouldDebugBreak() ) action = (ResultAction::Value)( action | ResultAction::Debug ); if( aborting() ) action = (ResultAction::Value)( action | ResultAction::Abort ); } return action; } void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); SectionInfo testCaseSection( testCaseInfo.name, testCaseInfo.description, testCaseInfo.lineInfo ); m_reporter->sectionStarting( testCaseSection ); Counts prevAssertions = m_totals.assertions; double duration = 0; try { m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); TestCaseTracker::Guard guard( *m_testCaseTracker ); Timer timer; timer.start(); if( m_reporter->getPreferences().shouldRedirectStdOut ) { StreamRedirect coutRedir( std::cout, redirectedCout ); StreamRedirect cerrRedir( std::cerr, redirectedCerr ); m_activeTestCase->invoke(); } else { m_activeTestCase->invoke(); } duration = timer.getElapsedSeconds(); } catch( TestFailureException& ) { // This just means the test was aborted due to failure } catch(...) { ExpressionResultBuilder exResult( ResultWas::ThrewException ); exResult << translateActiveException(); actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) ); } // If sections ended prematurely due to an exception we stored their // infos here so we can tear them down outside the unwind process. for( std::vector::const_iterator it = m_unfinishedSections.begin(), itEnd = m_unfinishedSections.end(); it != itEnd; ++it ) sectionEnded( it->info, it->prevAssertions, it->durationInSeconds ); m_unfinishedSections.clear(); m_messages.clear(); Counts assertions = m_totals.assertions - prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); m_reporter->sectionEnded( testCaseSectionStats ); } private: struct UnfinishedSections { UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds ) : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) {} SectionInfo info; Counts prevAssertions; double durationInSeconds; }; TestRunInfo m_runInfo; IMutableContext& m_context; TestCase const* m_activeTestCase; Option m_testCaseTracker; AssertionResult m_lastResult; Ptr m_config; Totals m_totals; Ptr m_reporter; std::vector m_messages; IRunner* m_prevRunner; IResultCapture* m_prevResultCapture; Ptr m_prevConfig; AssertionInfo m_lastAssertionInfo; std::vector m_unfinishedSections; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_section.hpp000066400000000000000000000035731221513074500261030ustar00rootroot00000000000000/* * Created by Phil on 03/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED #define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED #include "catch_capture.hpp" #include "catch_totals.hpp" #include "catch_compiler_capabilities.h" #include "catch_timer.h" #include namespace Catch { class Section { public: Section( SourceLineInfo const& lineInfo, std::string const& name, std::string const& description = "" ) : m_info( name, description, lineInfo ), m_sectionIncluded( getCurrentContext().getResultCapture().sectionStarted( m_info, m_assertions ) ) { m_timer.start(); } ~Section() { if( m_sectionIncluded ) getCurrentContext().getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); } // This indicates whether the section should be executed or not operator bool() { return m_sectionIncluded; } private: SectionInfo m_info; std::string m_name; Counts m_assertions; bool m_sectionIncluded; Timer m_timer; }; } // end namespace Catch #ifdef CATCH_CONFIG_VARIADIC_MACROS #define INTERNAL_CATCH_SECTION( ... ) \ if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) #else #define INTERNAL_CATCH_SECTION( name, desc ) \ if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( CATCH_INTERNAL_LINEINFO, name, desc ) ) #endif #endif // TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_section_info.hpp000066400000000000000000000056141221513074500271140ustar00rootroot00000000000000/* * Created by Phil Nash on 4/5/2012 * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_SECTION_INFO_HPP_INCLUDED #define TWOBLUECUBES_CATCH_SECTION_INFO_HPP_INCLUDED #include "catch_common.h" #include #include namespace Catch { class RunningSection { public: typedef std::vector SubSections; enum State { Root, Unknown, Branch, TestedBranch, TestedLeaf }; RunningSection( RunningSection* parent, std::string const& name ) : m_state( Unknown ), m_parent( parent ), m_name( name ) {} RunningSection( std::string const& name ) : m_state( Root ), m_parent( NULL ), m_name( name ) {} ~RunningSection() { deleteAll( m_subSections ); } std::string getName() const { return m_name; } bool shouldRun() const { return m_state < TestedBranch; } bool isBranch() const { return m_state == Branch; } const RunningSection* getParent() const { return m_parent; } bool hasUntestedSections() const { if( m_state == Unknown ) return true; for( SubSections::const_iterator it = m_subSections.begin(); it != m_subSections.end(); ++it) if( (*it)->hasUntestedSections() ) return true; return false; } // Mutable methods: RunningSection* getParent() { return m_parent; } RunningSection* findOrAddSubSection( std::string const& name, bool& changed ) { for( SubSections::const_iterator it = m_subSections.begin(); it != m_subSections.end(); ++it) if( (*it)->getName() == name ) return *it; RunningSection* subSection = new RunningSection( this, name ); m_subSections.push_back( subSection ); m_state = Branch; changed = true; return subSection; } bool ran() { if( m_state >= Branch ) return false; m_state = TestedLeaf; return true; } void ranToCompletion() { if( m_state == Branch && !hasUntestedSections() ) m_state = TestedBranch; } private: State m_state; RunningSection* m_parent; std::string m_name; SubSections m_subSections; }; } #endif // TWOBLUECUBES_CATCH_SECTION_INFO_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_sfinae.hpp000066400000000000000000000023151221513074500256750ustar00rootroot00000000000000/* * Created by Phil on 15/04/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED #define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED // Try to detect if the current compiler supports SFINAE #include "catch_compiler_capabilities.h" namespace Catch { struct TrueType { static const bool value = true; typedef void Enable; char sizer[1]; }; struct FalseType { static const bool value = false; typedef void Disable; char sizer[2]; }; #ifdef CATCH_CONFIG_SFINAE template struct NotABooleanExpression; template struct If : NotABooleanExpression {}; template<> struct If : TrueType {}; template<> struct If : FalseType {}; template struct SizedIf; template<> struct SizedIf : TrueType {}; template<> struct SizedIf : FalseType {}; #endif // CATCH_CONFIG_SFINAE } // end namespace Catch #endif // TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_stream.hpp000066400000000000000000000041571221513074500257310ustar00rootroot00000000000000/* * Created by Phil on 17/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ #ifndef TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED #define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED #include "catch_streambuf.h" #include "catch_debugger.hpp" #include #include namespace Catch { template class StreamBufImpl : public StreamBufBase { char data[bufferSize]; WriterF m_writer; public: StreamBufImpl() { setp( data, data + sizeof(data) ); } ~StreamBufImpl() throw() { sync(); } private: int overflow( int c ) { sync(); if( c != EOF ) { if( pbase() == epptr() ) m_writer( std::string( 1, static_cast( c ) ) ); else sputc( static_cast( c ) ); } return 0; } int sync() { if( pbase() != pptr() ) { m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); setp( pbase(), epptr() ); } return 0; } }; /////////////////////////////////////////////////////////////////////////// struct OutputDebugWriter { void operator()( std::string const&str ) { writeToDebugConsole( str ); } }; class Stream { public: Stream() : streamBuf( NULL ), isOwned( false ) {} Stream( std::streambuf* _streamBuf, bool _isOwned ) : streamBuf( _streamBuf ), isOwned( _isOwned ) {} void release() { if( isOwned ) { delete streamBuf; streamBuf = NULL; isOwned = false; } } std::streambuf* streamBuf; private: bool isOwned; }; } #endif // TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_streambuf.h000066400000000000000000000010621221513074500260560ustar00rootroot00000000000000/* * Created by Phil on 27/11/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED #define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED #include namespace Catch { class StreamBufBase : public std::streambuf { public: virtual ~StreamBufBase() throw(); }; } #endif // TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_tags.hpp000066400000000000000000000116661221513074500253770ustar00rootroot00000000000000/* * Created by Phil on 14/08/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED #include "catch_common.h" #include #include #include #include #ifdef __clang__ #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { class TagParser { public: virtual ~TagParser(); void parse( std::string const& str ) { std::size_t pos = 0; while( pos < str.size() ) { char c = str[pos]; if( c == '[' ) { std::size_t end = str.find_first_of( ']', pos ); if( end != std::string::npos ) { acceptTag( str.substr( pos+1, end-pos-1 ) ); pos = end+1; } else { acceptChar( c ); pos++; } } else { acceptChar( c ); pos++; } } endParse(); } protected: virtual void acceptTag( std::string const& tag ) = 0; virtual void acceptChar( char c ) = 0; virtual void endParse() {} private: }; class TagExtracter : public TagParser { public: TagExtracter( std::set& tags ) : m_tags( tags ) {} virtual ~TagExtracter(); void parse( std::string& description ) { TagParser::parse( description ); description = m_remainder; } private: virtual void acceptTag( std::string const& tag ) { m_tags.insert( toLower( tag ) ); } virtual void acceptChar( char c ) { m_remainder += c; } TagExtracter& operator=(TagExtracter const&); std::set& m_tags; std::string m_remainder; }; class Tag { public: Tag() : m_isNegated( false ) {} Tag( std::string const& name, bool isNegated ) : m_name( name ), m_isNegated( isNegated ) {} std::string getName() const { return m_name; } bool isNegated() const { return m_isNegated; } bool operator ! () const { return m_name.empty(); } private: std::string m_name; bool m_isNegated; }; class TagSet { typedef std::map TagMap; public: void add( Tag const& tag ) { m_tags.insert( std::make_pair( toLower( tag.getName() ), tag ) ); } bool empty() const { return m_tags.empty(); } bool matches( std::set const& tags ) const { TagMap::const_iterator it = m_tags.begin(); TagMap::const_iterator itEnd = m_tags.end(); for(; it != itEnd; ++it ) { bool found = tags.find( it->first ) != tags.end(); if( found == it->second.isNegated() ) return false; } return true; } private: TagMap m_tags; }; class TagExpression { public: bool matches( std::set const& tags ) const { std::vector::const_iterator it = m_tagSets.begin(); std::vector::const_iterator itEnd = m_tagSets.end(); for(; it != itEnd; ++it ) if( it->matches( tags ) ) return true; return false; } private: friend class TagExpressionParser; std::vector m_tagSets; }; class TagExpressionParser : public TagParser { public: TagExpressionParser( TagExpression& exp ) : m_isNegated( false ), m_exp( exp ) {} ~TagExpressionParser(); private: virtual void acceptTag( std::string const& tag ) { m_currentTagSet.add( Tag( tag, m_isNegated ) ); m_isNegated = false; } virtual void acceptChar( char c ) { switch( c ) { case '~': m_isNegated = true; break; case ',': m_exp.m_tagSets.push_back( m_currentTagSet ); break; } } virtual void endParse() { if( !m_currentTagSet.empty() ) m_exp.m_tagSets.push_back( m_currentTagSet ); } TagExpressionParser& operator=(TagExpressionParser const&); bool m_isNegated; TagSet m_currentTagSet; TagExpression& m_exp; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_test_case_info.h000066400000000000000000000045331221513074500270610ustar00rootroot00000000000000/* * Created by Phil on 29/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED #include "catch_common.h" #include "catch_ptr.hpp" #include #include #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { struct ITestCase; struct TestCaseInfo { TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::set const& _tags, bool _isHidden, SourceLineInfo const& _lineInfo ); TestCaseInfo( TestCaseInfo const& other ); std::string name; std::string className; std::string description; std::set tags; std::string tagsAsString; SourceLineInfo lineInfo; bool isHidden; }; class TestCase : protected TestCaseInfo { public: TestCase( ITestCase* testCase, TestCaseInfo const& info ); TestCase( TestCase const& other ); TestCase withName( std::string const& _newName ) const; void invoke() const; TestCaseInfo const& getTestCaseInfo() const; bool isHidden() const; bool hasTag( std::string const& tag ) const; bool matchesTags( std::string const& tagPattern ) const; std::set const& getTags() const; void swap( TestCase& other ); bool operator == ( TestCase const& other ) const; bool operator < ( TestCase const& other ) const; TestCase& operator = ( TestCase const& other ); private: Ptr test; }; TestCase makeTestCase( ITestCase* testCase, std::string const& className, std::string const& name, std::string const& description, SourceLineInfo const& lineInfo ); } #ifdef __clang__ #pragma clang diagnostic pop #endif #endif // TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_test_case_info.hpp000066400000000000000000000100771221513074500274210ustar00rootroot00000000000000/* * Created by Phil on 14/08/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED #include "catch_tags.hpp" #include "catch_test_case_info.h" #include "catch_interfaces_testcase.h" #include "catch_common.h" namespace Catch { TestCase makeTestCase( ITestCase* _testCase, std::string const& _className, std::string const& _name, std::string const& _descOrTags, SourceLineInfo const& _lineInfo ) { std::string desc = _descOrTags; bool isHidden( startsWith( _name, "./" ) ); std::set tags; TagExtracter( tags ).parse( desc ); if( tags.find( "hide" ) != tags.end() || tags.find( "." ) != tags.end() ) isHidden = true; TestCaseInfo info( _name, _className, desc, tags, isHidden, _lineInfo ); return TestCase( _testCase, info ); } TestCaseInfo::TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::set const& _tags, bool _isHidden, SourceLineInfo const& _lineInfo ) : name( _name ), className( _className ), description( _description ), tags( _tags ), lineInfo( _lineInfo ), isHidden( _isHidden ) { std::ostringstream oss; for( std::set::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) oss << "[" << *it << "]"; tagsAsString = oss.str(); } TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) : name( other.name ), className( other.className ), description( other.description ), tags( other.tags ), tagsAsString( other.tagsAsString ), lineInfo( other.lineInfo ), isHidden( other.isHidden ) {} TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} TestCase::TestCase( TestCase const& other ) : TestCaseInfo( other ), test( other.test ) {} TestCase TestCase::withName( std::string const& _newName ) const { TestCase other( *this ); other.name = _newName; return other; } void TestCase::invoke() const { test->invoke(); } bool TestCase::isHidden() const { return TestCaseInfo::isHidden; } bool TestCase::hasTag( std::string const& tag ) const { return tags.find( toLower( tag ) ) != tags.end(); } bool TestCase::matchesTags( std::string const& tagPattern ) const { TagExpression exp; TagExpressionParser( exp ).parse( tagPattern ); return exp.matches( tags ); } std::set const& TestCase::getTags() const { return tags; } void TestCase::swap( TestCase& other ) { test.swap( other.test ); className.swap( other.className ); name.swap( other.name ); description.swap( other.description ); std::swap( lineInfo, other.lineInfo ); } bool TestCase::operator == ( TestCase const& other ) const { return test.get() == other.test.get() && name == other.name && className == other.className; } bool TestCase::operator < ( TestCase const& other ) const { return name < other.name; } TestCase& TestCase::operator = ( TestCase const& other ) { TestCase temp( other ); swap( temp ); return *this; } TestCaseInfo const& TestCase::getTestCaseInfo() const { return *this; } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_test_case_registry_impl.hpp000066400000000000000000000130201221513074500313460ustar00rootroot00000000000000/* * Created by Phil on 7/1/2011 * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED #include "catch_test_registry.hpp" #include "catch_test_case_info.h" #include "catch_test_spec.h" #include "catch_context.h" #include #include #include #include namespace Catch { class TestRegistry : public ITestCaseRegistry { public: TestRegistry() : m_unnamedCount( 0 ) {} virtual ~TestRegistry(); virtual void registerTest( TestCase const& testCase ) { std::string name = testCase.getTestCaseInfo().name; if( name == "" ) { std::ostringstream oss; oss << "Anonymous test case " << ++m_unnamedCount; return registerTest( testCase.withName( oss.str() ) ); } if( m_functions.find( testCase ) == m_functions.end() ) { m_functions.insert( testCase ); m_functionsInOrder.push_back( testCase ); if( !testCase.isHidden() ) m_nonHiddenFunctions.push_back( testCase ); } else { TestCase const& prev = *m_functions.find( testCase ); std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n" << "\tFirst seen at " << SourceLineInfo( prev.getTestCaseInfo().lineInfo ) << "\n" << "\tRedefined at " << SourceLineInfo( testCase.getTestCaseInfo().lineInfo ) << std::endl; exit(1); } } virtual std::vector const& getAllTests() const { return m_functionsInOrder; } virtual std::vector const& getAllNonHiddenTests() const { return m_nonHiddenFunctions; } // !TBD deprecated virtual std::vector getMatchingTestCases( std::string const& rawTestSpec ) const { std::vector matchingTests; getMatchingTestCases( rawTestSpec, matchingTests ); return matchingTests; } // !TBD deprecated virtual void getMatchingTestCases( std::string const& rawTestSpec, std::vector& matchingTestsOut ) const { TestCaseFilter filter( rawTestSpec ); std::vector::const_iterator it = m_functionsInOrder.begin(); std::vector::const_iterator itEnd = m_functionsInOrder.end(); for(; it != itEnd; ++it ) { if( filter.shouldInclude( *it ) ) { matchingTestsOut.push_back( *it ); } } } virtual void getMatchingTestCases( TestCaseFilters const& filters, std::vector& matchingTestsOut ) const { std::vector::const_iterator it = m_functionsInOrder.begin(); std::vector::const_iterator itEnd = m_functionsInOrder.end(); // !TBD: replace with algorithm for(; it != itEnd; ++it ) if( filters.shouldInclude( *it ) ) matchingTestsOut.push_back( *it ); } private: std::set m_functions; std::vector m_functionsInOrder; std::vector m_nonHiddenFunctions; size_t m_unnamedCount; }; /////////////////////////////////////////////////////////////////////////// class FreeFunctionTestCase : public SharedImpl { public: FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} virtual void invoke() const { m_fun(); } private: virtual ~FreeFunctionTestCase(); TestFunction m_fun; }; inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { std::string className = classOrQualifiedMethodName; if( startsWith( className, "&" ) ) { std::size_t lastColons = className.rfind( "::" ); std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); if( penultimateColons == std::string::npos ) penultimateColons = 1; className = className.substr( penultimateColons, lastColons-penultimateColons ); } return className; } /////////////////////////////////////////////////////////////////////////// AutoReg::AutoReg( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ) { registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); } AutoReg::~AutoReg() {} void AutoReg::registerTestCase( ITestCase* testCase, char const* classOrQualifiedMethodName, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ) { getMutableRegistryHub().registerTest ( makeTestCase( testCase, extractClassName( classOrQualifiedMethodName ), nameAndDesc.name, nameAndDesc.description, lineInfo ) ); } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_test_case_tracker.hpp000066400000000000000000000104631221513074500301200ustar00rootroot00000000000000/* * Created by Phil Nash on 23/7/2013 * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED #include #include #include namespace Catch { namespace SectionTracking { class TrackedSection { typedef std::map TrackedSections; public: enum RunState { NotStarted, Executing, ExecutingChildren, Completed }; TrackedSection( std::string const& name, TrackedSection* parent ) : m_name( name ), m_runState( NotStarted ), m_parent( parent ) {} RunState runState() const { return m_runState; } void addChild( std::string const& childName ) { m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) ); } TrackedSection* getChild( std::string const& childName ) { return &m_children.find( childName )->second; } void enter() { if( m_runState == NotStarted ) m_runState = Executing; } void leave() { for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end(); it != itEnd; ++it ) if( it->second.runState() != Completed ) { m_runState = ExecutingChildren; return; } m_runState = Completed; } TrackedSection* getParent() { return m_parent; } bool hasChildren() const { return !m_children.empty(); } private: std::string m_name; RunState m_runState; TrackedSections m_children; TrackedSection* m_parent; }; class TestCaseTracker { public: TestCaseTracker( std::string const& testCaseName ) : m_testCase( testCaseName, NULL ), m_currentSection( &m_testCase ), m_completedASectionThisRun( false ) {} bool enterSection( std::string const& name ) { if( m_completedASectionThisRun ) return false; if( m_currentSection->runState() == TrackedSection::Executing ) { m_currentSection->addChild( name ); return false; } else { TrackedSection* child = m_currentSection->getChild( name ); if( child->runState() != TrackedSection::Completed ) { m_currentSection = child; m_currentSection->enter(); return true; } return false; } } void leaveSection() { m_currentSection->leave(); m_currentSection = m_currentSection->getParent(); assert( m_currentSection != NULL ); m_completedASectionThisRun = true; } bool currentSectionHasChildren() const { return m_currentSection->hasChildren(); } bool isCompleted() const { return m_testCase.runState() == TrackedSection::Completed; } class Guard { public: Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) { m_tracker.enterTestCase(); } ~Guard() { m_tracker.leaveTestCase(); } private: Guard( Guard const& ); void operator = ( Guard const& ); TestCaseTracker& m_tracker; }; private: void enterTestCase() { m_currentSection = &m_testCase; m_completedASectionThisRun = false; m_testCase.enter(); } void leaveTestCase() { m_testCase.leave(); } TrackedSection m_testCase; TrackedSection* m_currentSection; bool m_completedASectionThisRun; }; } // namespace SectionTracking using SectionTracking::TestCaseTracker; } // namespace Catch #endif // TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_test_registry.hpp000066400000000000000000000116041221513074500273400ustar00rootroot00000000000000/* * Created by Phil on 18/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED #include "catch_common.h" #include "catch_interfaces_testcase.h" #include "internal/catch_compiler_capabilities.h" namespace Catch { template class MethodTestCase : public SharedImpl { public: MethodTestCase( void (C::*method)() ) : m_method( method ) {} virtual void invoke() const { C obj; (obj.*m_method)(); } private: virtual ~MethodTestCase() {} void (C::*m_method)(); }; typedef void(*TestFunction)(); struct NameAndDesc { NameAndDesc( const char* _name = "", const char* _description= "" ) : name( _name ), description( _description ) {} const char* name; const char* description; }; struct AutoReg { AutoReg( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ); template AutoReg( void (C::*method)(), char const* className, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ) { registerTestCase( new MethodTestCase( method ), className, nameAndDesc, lineInfo ); } void registerTestCase( ITestCase* testCase, char const* className, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ); ~AutoReg(); private: AutoReg( AutoReg const& ); void operator= ( AutoReg const& ); }; } // end namespace Catch #ifdef CATCH_CONFIG_VARIADIC_MACROS /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE( ... ) \ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ namespace{ \ struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ void test(); \ }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ } \ void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() #else /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ namespace{ \ struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ void test(); \ }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ } \ void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() #endif #endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_test_spec.h000066400000000000000000000133751221513074500260710ustar00rootroot00000000000000/* * Created by Phil on 14/8/2012. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEST_SPEC_H_INCLUDED #define TWOBLUECUBES_CATCH_TEST_SPEC_H_INCLUDED #include "catch_test_case_info.h" #include "catch_tags.hpp" #include "catch_common.h" #include #include namespace Catch { struct IfFilterMatches{ enum DoWhat { AutoDetectBehaviour, IncludeTests, ExcludeTests }; }; class TestCaseFilter { enum WildcardPosition { NoWildcard = 0, WildcardAtStart = 1, WildcardAtEnd = 2, WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd }; public: TestCaseFilter( std::string const& testSpec, IfFilterMatches::DoWhat matchBehaviour = IfFilterMatches::AutoDetectBehaviour ) : m_stringToMatch( toLower( testSpec ) ), m_filterType( matchBehaviour ), m_wildcardPosition( NoWildcard ) { if( m_filterType == IfFilterMatches::AutoDetectBehaviour ) { if( startsWith( m_stringToMatch, "exclude:" ) ) { m_stringToMatch = m_stringToMatch.substr( 8 ); m_filterType = IfFilterMatches::ExcludeTests; } else if( startsWith( m_stringToMatch, "~" ) ) { m_stringToMatch = m_stringToMatch.substr( 1 ); m_filterType = IfFilterMatches::ExcludeTests; } else { m_filterType = IfFilterMatches::IncludeTests; } } if( startsWith( m_stringToMatch, "*" ) ) { m_stringToMatch = m_stringToMatch.substr( 1 ); m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtStart ); } if( endsWith( m_stringToMatch, "*" ) ) { m_stringToMatch = m_stringToMatch.substr( 0, m_stringToMatch.size()-1 ); m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtEnd ); } } IfFilterMatches::DoWhat getFilterType() const { return m_filterType; } bool shouldInclude( TestCase const& testCase ) const { return isMatch( testCase ) == (m_filterType == IfFilterMatches::IncludeTests); } private: #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunreachable-code" #endif bool isMatch( TestCase const& testCase ) const { std::string name = testCase.getTestCaseInfo().name; toLowerInPlace( name ); switch( m_wildcardPosition ) { case NoWildcard: return m_stringToMatch == name; case WildcardAtStart: return endsWith( name, m_stringToMatch ); case WildcardAtEnd: return startsWith( name, m_stringToMatch ); case WildcardAtBothEnds: return contains( name, m_stringToMatch ); } throw std::logic_error( "Unhandled wildcard type" ); } #ifdef __clang__ #pragma clang diagnostic pop #endif std::string m_stringToMatch; IfFilterMatches::DoWhat m_filterType; WildcardPosition m_wildcardPosition; }; class TestCaseFilters { public: TestCaseFilters( std::string const& name ) : m_name( name ) {} std::string getName() const { return m_name; } void addFilter( TestCaseFilter const& filter ) { if( filter.getFilterType() == IfFilterMatches::ExcludeTests ) m_exclusionFilters.push_back( filter ); else m_inclusionFilters.push_back( filter ); } void addTags( std::string const& tagPattern ) { TagExpression exp; TagExpressionParser( exp ).parse( tagPattern ); m_tagExpressions.push_back( exp ); } bool shouldInclude( TestCase const& testCase ) const { if( !m_tagExpressions.empty() ) { std::vector::const_iterator it = m_tagExpressions.begin(); std::vector::const_iterator itEnd = m_tagExpressions.end(); for(; it != itEnd; ++it ) if( it->matches( testCase.getTags() ) ) break; if( it == itEnd ) return false; } if( !m_inclusionFilters.empty() ) { std::vector::const_iterator it = m_inclusionFilters.begin(); std::vector::const_iterator itEnd = m_inclusionFilters.end(); for(; it != itEnd; ++it ) if( it->shouldInclude( testCase ) ) break; if( it == itEnd ) return false; } else if( m_exclusionFilters.empty() && m_tagExpressions.empty() ) { return !testCase.isHidden(); } std::vector::const_iterator it = m_exclusionFilters.begin(); std::vector::const_iterator itEnd = m_exclusionFilters.end(); for(; it != itEnd; ++it ) if( !it->shouldInclude( testCase ) ) return false; return true; } private: std::vector m_tagExpressions; std::vector m_inclusionFilters; std::vector m_exclusionFilters; std::string m_name; }; } #endif // TWOBLUECUBES_CATCH_TEST_SPEC_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_text.h000066400000000000000000000044711221513074500250610ustar00rootroot00000000000000/* * Created by Phil on 18/4/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEXT_H_INCLUDED #define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED #include "catch_config.hpp" #include #include namespace Catch { struct TextAttributes { TextAttributes() : initialIndent( std::string::npos ), indent( 0 ), width( CATCH_CONFIG_CONSOLE_WIDTH-1 ), tabChar( '\t' ) {} TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } std::size_t initialIndent; // indent of first line, or npos std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos std::size_t width; // maximum width of text, including indent. Longer text will wrap char tabChar; // If this char is seen the indent is changed to current pos }; class Text { public: Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ); void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ); typedef std::vector::const_iterator const_iterator; const_iterator begin() const { return lines.begin(); } const_iterator end() const { return lines.end(); } std::string const& last() const { return lines.back(); } std::size_t size() const { return lines.size(); } std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } std::string toString() const; friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ); private: std::string str; TextAttributes attr; std::vector lines; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_TEXT_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_text.hpp000066400000000000000000000062421221513074500254170ustar00rootroot00000000000000/* * Created by Phil on 20/4/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TEXT_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TEXT_HPP_INCLUDED #include #include namespace Catch { Text::Text( std::string const& _str, TextAttributes const& _attr ) : attr( _attr ) { std::string wrappableChars = " [({.,/|\\-"; std::size_t indent = _attr.initialIndent != std::string::npos ? _attr.initialIndent : _attr.indent; std::string remainder = _str; while( !remainder.empty() ) { assert( lines.size() < 1000 ); std::size_t tabPos = std::string::npos; std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); std::size_t pos = remainder.find_first_of( '\n' ); if( pos <= width ) { width = pos; } pos = remainder.find_last_of( _attr.tabChar, width ); if( pos != std::string::npos ) { tabPos = pos; if( remainder[width] == '\n' ) width--; remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); } if( width == remainder.size() ) { spliceLine( indent, remainder, width ); } else if( remainder[width] == '\n' ) { spliceLine( indent, remainder, width ); if( width <= 1 || remainder.size() != 1 ) remainder = remainder.substr( 1 ); indent = _attr.indent; } else { pos = remainder.find_last_of( wrappableChars, width ); if( pos != std::string::npos && pos > 0 ) { spliceLine( indent, remainder, pos ); if( remainder[0] == ' ' ) remainder = remainder.substr( 1 ); } else { spliceLine( indent, remainder, width-1 ); lines.back() += "-"; } if( lines.size() == 1 ) indent = _attr.indent; if( tabPos != std::string::npos ) indent += tabPos; } } } void Text::spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); _remainder = _remainder.substr( _pos ); } std::string Text::toString() const { std::ostringstream oss; oss << *this; return oss.str(); } std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); it != itEnd; ++it ) { if( it != _text.begin() ) _stream << "\n"; _stream << *it; } return _stream; } } // end namespace Catch #endif // TWOBLUECUBES_CATCH_TEXT_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_timer.h000066400000000000000000000015171221513074500252130ustar00rootroot00000000000000/* * Created by Phil on 05/08/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TIMER_H_INCLUDED #define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED #include "catch_platform.h" #ifdef CATCH_PLATFORM_WINDOWS typedef unsigned long long uint64_t; #else #include #endif namespace Catch { class Timer { public: Timer() : m_ticks( 0 ) {} void start(); unsigned int getElapsedNanoseconds() const; unsigned int getElapsedMilliseconds() const; double getElapsedSeconds() const; private: uint64_t m_ticks; }; } // namespace Catch #endif // TWOBLUECUBES_CATCH_TIMER_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_timer.hpp000066400000000000000000000031651221513074500255540ustar00rootroot00000000000000/* * Created by Phil on 05/08/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch_timer.h" #include "catch_platform.h" #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wc++11-long-long" #endif #ifdef CATCH_PLATFORM_WINDOWS #include #else #include #endif namespace Catch { namespace { #ifdef CATCH_PLATFORM_WINDOWS uint64_t getCurrentTicks() { static uint64_t hz=0, hzo=0; if (!hz) { QueryPerformanceFrequency((LARGE_INTEGER*)&hz); QueryPerformanceCounter((LARGE_INTEGER*)&hzo); } uint64_t t; QueryPerformanceCounter((LARGE_INTEGER*)&t); return ((t-hzo)*1000000)/hz; } #else uint64_t getCurrentTicks() { timeval t; gettimeofday(&t,NULL); return (uint64_t)t.tv_sec * 1000000ull + (uint64_t)t.tv_usec; } #endif } void Timer::start() { m_ticks = getCurrentTicks(); } unsigned int Timer::getElapsedNanoseconds() const { return (unsigned int)(getCurrentTicks() - m_ticks); } unsigned int Timer::getElapsedMilliseconds() const { return (unsigned int)((getCurrentTicks() - m_ticks)/1000); } double Timer::getElapsedSeconds() const { return (getCurrentTicks() - m_ticks)/1000000.0; } } // namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_tostring.hpp000066400000000000000000000141641221513074500263060ustar00rootroot00000000000000/* * Created by Phil on 8/5/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED #include "catch_common.h" #include "catch_sfinae.hpp" #include #include #include #ifdef __OBJC__ #include "catch_objc_arc.hpp" #endif namespace Catch { namespace Detail { // SFINAE is currently disabled by default for all compilers. // If the non SFINAE version of IsStreamInsertable is ambiguous for you // and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE #ifdef CATCH_CONFIG_SFINAE template class IsStreamInsertableHelper { template struct TrueIfSizeable : TrueType {}; template static TrueIfSizeable dummy(T2*); static FalseType dummy(...); public: typedef SizedIf type; }; template struct IsStreamInsertable : IsStreamInsertableHelper::type {}; #else struct BorgType { template BorgType( T const& ); }; TrueType& testStreamable( std::ostream& ); FalseType testStreamable( FalseType ); FalseType operator<<( std::ostream const&, BorgType const& ); template struct IsStreamInsertable { static std::ostream &s; static T const&t; enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; }; #endif template struct StringMakerBase { template static std::string convert( T const& ) { return "{?}"; } }; template<> struct StringMakerBase { template static std::string convert( T const& _value ) { std::ostringstream oss; oss << _value; return oss.str(); } }; } // end namespace Detail template std::string toString( T const& value ); template struct StringMaker : Detail::StringMakerBase::value> {}; template struct StringMaker { template static std::string convert( U* p ) { if( !p ) return INTERNAL_CATCH_STRINGIFY( NULL ); std::ostringstream oss; oss << p; return oss.str(); } }; template struct StringMaker > { static std::string convert( std::vector const& v ) { std::ostringstream oss; oss << "{ "; for( std::size_t i = 0; i < v.size(); ++ i ) { oss << toString( v[i] ); if( i < v.size() - 1 ) oss << ", "; } oss << " }"; return oss.str(); } }; namespace Detail { template inline std::string makeString( T const& value ) { return StringMaker::convert( value ); } } // end namespace Detail /// \brief converts any type to a string /// /// The default template forwards on to ostringstream - except when an /// ostringstream overload does not exist - in which case it attempts to detect /// that and writes {?}. /// Overload (not specialise) this template for custom typs that you don't want /// to provide an ostream overload for. template std::string toString( T const& value ) { return StringMaker::convert( value ); } // Built in overloads inline std::string toString( std::string const& value ) { return "\"" + value + "\""; } inline std::string toString( std::wstring const& value ) { std::ostringstream oss; oss << "\""; for(size_t i = 0; i < value.size(); ++i ) oss << static_cast( value[i] <= 0xff ? value[i] : '?'); oss << "\""; return oss.str(); } inline std::string toString( const char* const value ) { return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); } inline std::string toString( char* const value ) { return Catch::toString( static_cast( value ) ); } inline std::string toString( int value ) { std::ostringstream oss; oss << value; return oss.str(); } inline std::string toString( unsigned long value ) { std::ostringstream oss; if( value > 8192 ) oss << "0x" << std::hex << value; else oss << value; return oss.str(); } inline std::string toString( unsigned int value ) { return toString( static_cast( value ) ); } inline std::string toString( const double value ) { std::ostringstream oss; oss << std::setprecision( 10 ) << std::fixed << value; std::string d = oss.str(); std::size_t i = d.find_last_not_of( '0' ); if( i != std::string::npos && i != d.size()-1 ) { if( d[i] == '.' ) i++; d = d.substr( 0, i+1 ); } return d; } inline std::string toString( bool value ) { return value ? "true" : "false"; } inline std::string toString( char value ) { return value < ' ' ? toString( static_cast( value ) ) : Detail::makeString( value ); } inline std::string toString( signed char value ) { return toString( static_cast( value ) ); } inline std::string toString( unsigned char value ) { return toString( static_cast( value ) ); } #ifdef CATCH_CONFIG_CPP11_NULLPTR inline std::string toString( std::nullptr_t ) { return "nullptr"; } #endif #ifdef __OBJC__ inline std::string toString( NSString const * const& nsstring ) { if( !nsstring ) return "nil"; return std::string( "@\"" ) + [nsstring UTF8String] + "\""; } inline std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { if( !nsstring ) return "nil"; return std::string( "@\"" ) + [nsstring UTF8String] + "\""; } inline std::string toString( NSObject* const& nsObject ) { return toString( [nsObject description] ); } #endif } // end namespace Catch #endif // TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_totals.hpp000066400000000000000000000034441221513074500257420ustar00rootroot00000000000000/* * Created by Phil Nash on 23/02/2012. * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED #define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED #include namespace Catch { struct Counts { Counts() : passed( 0 ), failed( 0 ) {} Counts operator - ( Counts const& other ) const { Counts diff; diff.passed = passed - other.passed; diff.failed = failed - other.failed; return diff; } Counts& operator += ( Counts const& other ) { passed += other.passed; failed += other.failed; return *this; } std::size_t total() const { return passed + failed; } std::size_t passed; std::size_t failed; }; struct Totals { Totals operator - ( Totals const& other ) const { Totals diff; diff.assertions = assertions - other.assertions; diff.testCases = testCases - other.testCases; return diff; } Totals delta( Totals const& prevTotals ) const { Totals diff = *this - prevTotals; if( diff.assertions.failed > 0 ) ++diff.testCases.failed; else ++diff.testCases.passed; return diff; } Totals& operator += ( Totals const& other ) { assertions += other.assertions; testCases += other.testCases; return *this; } Counts assertions; Counts testCases; }; } #endif // TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_version.h000066400000000000000000000021221221513074500255510ustar00rootroot00000000000000/* * Created by Phil on 13/11/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_VERSION_H_INCLUDED #define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED namespace Catch { // Versioning information struct Version { Version( unsigned int _majorVersion, unsigned int _minorVersion, unsigned int _buildNumber, std::string const& _branchName ) : majorVersion( _majorVersion ), minorVersion( _minorVersion ), buildNumber( _buildNumber ), branchName( _branchName ) {} const unsigned int majorVersion; const unsigned int minorVersion; const unsigned int buildNumber; const std::string branchName; private: void operator=( Version const& ); }; extern Version libraryVersion; } #endif // TWOBLUECUBES_CATCH_VERSION_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_version.hpp000066400000000000000000000010531221513074500261130ustar00rootroot00000000000000/* * Created by Phil on 14/11/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED #define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED #include "catch_version.h" namespace Catch { // These numbers are maintained by a script Version libraryVersion( 1, 0, 10, "master" ); } #endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/catch_xmlwriter.hpp000066400000000000000000000141171221513074500264700ustar00rootroot00000000000000/* * Created by Phil on 09/12/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED #define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED #include #include #include #include namespace Catch { class XmlWriter { public: class ScopedElement { public: ScopedElement( XmlWriter* writer ) : m_writer( writer ) {} ScopedElement( ScopedElement const& other ) : m_writer( other.m_writer ){ other.m_writer = NULL; } ~ScopedElement() { if( m_writer ) m_writer->endElement(); } ScopedElement& writeText( std::string const& text, bool indent = true ) { m_writer->writeText( text, indent ); return *this; } template ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { m_writer->writeAttribute( name, attribute ); return *this; } private: mutable XmlWriter* m_writer; }; XmlWriter() : m_tagIsOpen( false ), m_needsNewline( false ), m_os( &std::cout ) {} XmlWriter( std::ostream& os ) : m_tagIsOpen( false ), m_needsNewline( false ), m_os( &os ) {} ~XmlWriter() { while( !m_tags.empty() ) endElement(); } XmlWriter& operator = ( XmlWriter const& other ) { XmlWriter temp( other ); swap( temp ); return *this; } void swap( XmlWriter& other ) { std::swap( m_tagIsOpen, other.m_tagIsOpen ); std::swap( m_needsNewline, other.m_needsNewline ); std::swap( m_tags, other.m_tags ); std::swap( m_indent, other.m_indent ); std::swap( m_os, other.m_os ); } XmlWriter& startElement( std::string const& name ) { ensureTagClosed(); newlineIfNecessary(); stream() << m_indent << "<" << name; m_tags.push_back( name ); m_indent += " "; m_tagIsOpen = true; return *this; } ScopedElement scopedElement( std::string const& name ) { ScopedElement scoped( this ); startElement( name ); return scoped; } XmlWriter& endElement() { newlineIfNecessary(); m_indent = m_indent.substr( 0, m_indent.size()-2 ); if( m_tagIsOpen ) { stream() << "/>\n"; m_tagIsOpen = false; } else { stream() << m_indent << "\n"; } m_tags.pop_back(); return *this; } XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { if( !name.empty() && !attribute.empty() ) { stream() << " " << name << "=\""; writeEncodedText( attribute ); stream() << "\""; } return *this; } XmlWriter& writeAttribute( std::string const& name, bool attribute ) { stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; return *this; } template XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { if( !name.empty() ) stream() << " " << name << "=\"" << attribute << "\""; return *this; } XmlWriter& writeText( std::string const& text, bool indent = true ) { if( !text.empty() ){ bool tagWasOpen = m_tagIsOpen; ensureTagClosed(); if( tagWasOpen && indent ) stream() << m_indent; writeEncodedText( text ); m_needsNewline = true; } return *this; } XmlWriter& writeComment( std::string const& text ) { ensureTagClosed(); stream() << m_indent << ""; m_needsNewline = true; return *this; } XmlWriter& writeBlankLine() { ensureTagClosed(); stream() << "\n"; return *this; } private: std::ostream& stream() { return *m_os; } void ensureTagClosed() { if( m_tagIsOpen ) { stream() << ">\n"; m_tagIsOpen = false; } } void newlineIfNecessary() { if( m_needsNewline ) { stream() << "\n"; m_needsNewline = false; } } void writeEncodedText( std::string const& text ) { static const char* charsToEncode = "<&\""; std::string mtext = text; std::string::size_type pos = mtext.find_first_of( charsToEncode ); while( pos != std::string::npos ) { stream() << mtext.substr( 0, pos ); switch( mtext[pos] ) { case '<': stream() << "<"; break; case '&': stream() << "&"; break; case '\"': stream() << """; break; } mtext = mtext.substr( pos+1 ); pos = mtext.find_first_of( charsToEncode ); } stream() << mtext; } bool m_tagIsOpen; bool m_needsNewline; std::vector m_tags; std::string m_indent; std::ostream* m_os; }; } #endif // TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/internal/clara.h000066400000000000000000000561041221513074500240150ustar00rootroot00000000000000/* * Created by Phil on 25/05/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CLARA_H_INCLUDED #define TWOBLUECUBES_CLARA_H_INCLUDED #include "catch_text.h" // This will get moved out too namespace Clara { namespace Detail { template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct IsBool { static const bool value = false; }; template<> struct IsBool { static const bool value = true; }; template void convertInto( std::string const& _source, T& _dest ) { std::stringstream ss; ss << _source; ss >> _dest; if( ss.fail() ) throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); } inline void convertInto( std::string const& _source, std::string& _dest ) { _dest = _source; } inline void convertInto( std::string const& _source, bool& _dest ) { std::string sourceLC = _source; std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) _dest = true; else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) _dest = false; else throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); } inline void convertInto( bool _source, bool& _dest ) { _dest = _source; } template inline void convertInto( bool, T& ) { throw std::runtime_error( "Invalid conversion" ); } template struct IArgFunction { virtual ~IArgFunction() {} virtual void set( ConfigT& config, std::string const& value ) const = 0; virtual void setFlag( ConfigT& config ) const = 0; virtual bool takesArg() const = 0; virtual IArgFunction* clone() const = 0; }; template class BoundArgFunction { public: BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj->clone() ) {} BoundArgFunction& operator = ( BoundArgFunction const& other ) { IArgFunction* newFunctionObj = other.functionObj->clone(); delete functionObj; functionObj = newFunctionObj; return *this; } ~BoundArgFunction() { delete functionObj; } void set( ConfigT& config, std::string const& value ) const { functionObj->set( config, value ); } void setFlag( ConfigT& config ) const { functionObj->setFlag( config ); } bool takesArg() const { return functionObj->takesArg(); } private: IArgFunction* functionObj; }; template struct NullBinder : IArgFunction{ virtual void set( C&, std::string const& ) const {} virtual void setFlag( C& ) const {} virtual bool takesArg() const { return true; } virtual IArgFunction* clone() const { return new NullBinder( *this ); } }; template struct BoundDataMember : IArgFunction{ BoundDataMember( M C::* _member ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { convertInto( stringValue, p.*member ); } virtual void setFlag( C& p ) const { convertInto( true, p.*member ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } M C::* member; }; template struct BoundUnaryMethod : IArgFunction{ BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { typename RemoveConstRef::type value; convertInto( stringValue, value ); (p.*member)( value ); } virtual void setFlag( C& p ) const { typename RemoveConstRef::type value; convertInto( true, value ); (p.*member)( value ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } void (C::*member)( M ); }; template struct BoundNullaryMethod : IArgFunction{ BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { bool value; convertInto( stringValue, value ); if( value ) (p.*member)(); } virtual void setFlag( C& p ) const { (p.*member)(); } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } void (C::*member)(); }; template struct BoundUnaryFunction : IArgFunction{ BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} virtual void set( C& obj, std::string const& stringValue ) const { bool value; convertInto( stringValue, value ); if( value ) function( obj ); } virtual void setFlag( C& p ) const { function( p ); } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } void (*function)( C& ); }; template struct BoundBinaryFunction : IArgFunction{ BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} virtual void set( C& obj, std::string const& stringValue ) const { typename RemoveConstRef::type value; convertInto( stringValue, value ); function( obj, value ); } virtual void setFlag( C& obj ) const { typename RemoveConstRef::type value; convertInto( true, value ); function( obj, value ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } void (*function)( C&, T ); }; template BoundArgFunction makeBoundField( M C::* _member ) { return BoundArgFunction( new BoundDataMember( _member ) ); } template BoundArgFunction makeBoundField( void (C::*_member)( M ) ) { return BoundArgFunction( new BoundUnaryMethod( _member ) ); } template BoundArgFunction makeBoundField( void (C::*_member)() ) { return BoundArgFunction( new BoundNullaryMethod( _member ) ); } template BoundArgFunction makeBoundField( void (*_function)( C& ) ) { return BoundArgFunction( new BoundUnaryFunction( _function ) ); } template BoundArgFunction makeBoundField( void (*_function)( C&, T ) ) { return BoundArgFunction( new BoundBinaryFunction( _function ) ); } } // namespace Detail struct Parser { Parser() : separators( " \t=:" ) {} struct Token { enum Type { Positional, ShortOpt, LongOpt }; Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} Type type; std::string data; }; void parseIntoTokens( int argc, char const * const * argv, std::vector& tokens ) const { for( int i = 1; i < argc; ++i ) parseIntoTokens( argv[i] , tokens); } void parseIntoTokens( std::string arg, std::vector& tokens ) const { while( !arg.empty() ) { Parser::Token token( Parser::Token::Positional, arg ); arg = ""; if( token.data[0] == '-' ) { if( token.data.size() > 1 && token.data[1] == '-' ) { token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); } else { token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { arg = "-" + token.data.substr( 1 ); token.data = token.data.substr( 0, 1 ); } } } if( token.type != Parser::Token::Positional ) { std::size_t pos = token.data.find_first_of( separators ); if( pos != std::string::npos ) { arg = token.data.substr( pos+1 ); token.data = token.data.substr( 0, pos ); } } tokens.push_back( token ); } } std::string separators; }; template class CommandLine { struct Arg { Arg( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ), position( -1 ) {} bool hasShortName( std::string const& shortName ) const { for( std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); it != itEnd; ++it ) if( *it == shortName ) return true; return false; } bool hasLongName( std::string const& _longName ) const { return _longName == longName; } bool takesArg() const { return !hint.empty(); } bool isFixedPositional() const { return position != -1; } bool isAnyPositional() const { return position == -1 && shortNames.empty() && longName.empty(); } std::string dbgName() const { if( !longName.empty() ) return "--" + longName; if( !shortNames.empty() ) return "-" + shortNames[0]; return "positional args"; } void validate() const { if( boundField.takesArg() && !takesArg() ) throw std::logic_error( dbgName() + " must specify an arg name" ); } std::string commands() const { std::ostringstream oss; bool first = true; std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); for(; it != itEnd; ++it ) { if( first ) first = false; else oss << ", "; oss << "-" << *it; } if( !longName.empty() ) { if( !first ) oss << ", "; oss << "--" << longName; } if( !hint.empty() ) oss << " <" << hint << ">"; return oss.str(); } Detail::BoundArgFunction boundField; std::vector shortNames; std::string longName; std::string description; std::string hint; int position; }; class ArgBinder { public: template ArgBinder( CommandLine* cl, F f ) : m_cl( cl ), m_arg( Detail::makeBoundField( f ) ) {} ArgBinder( ArgBinder& other ) : m_cl( other.m_cl ), m_arg( other.m_arg ) { other.m_cl = NULL; } ~ArgBinder() { if( m_cl ) { m_arg.validate(); if( m_arg.isFixedPositional() ) { m_cl->m_positionalArgs.insert( std::make_pair( m_arg.position, m_arg ) ); if( m_arg.position > m_cl->m_highestSpecifiedArgPosition ) m_cl->m_highestSpecifiedArgPosition = m_arg.position; } else if( m_arg.isAnyPositional() ) { if( m_cl->m_arg.get() ) throw std::logic_error( "Only one unpositional argument can be added" ); m_cl->m_arg = std::auto_ptr( new Arg( m_arg ) ); } else m_cl->m_options.push_back( m_arg ); } } ArgBinder& shortOpt( std::string const& name ) { m_arg.shortNames.push_back( name ); return *this; } ArgBinder& longOpt( std::string const& name ) { m_arg.longName = name; return *this; } ArgBinder& describe( std::string const& description ) { m_arg.description = description; return *this; } ArgBinder& hint( std::string const& hint ) { m_arg.hint = hint; return *this; } ArgBinder& position( int position ) { m_arg.position = position; return *this; } private: CommandLine* m_cl; Arg m_arg; }; public: CommandLine() : m_boundProcessName( new Detail::NullBinder() ), m_highestSpecifiedArgPosition( 0 ) {} CommandLine( CommandLine const& other ) : m_boundProcessName( other.m_boundProcessName ), m_options ( other.m_options ), m_positionalArgs( other.m_positionalArgs ), m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ) { if( other.m_arg.get() ) m_arg = std::auto_ptr( new Arg( *other.m_arg ) ); } template ArgBinder bind( F f ) { ArgBinder binder( this, f ); return binder; } template void bindProcessName( F f ) { m_boundProcessName = Detail::makeBoundField( f ); } void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = CATCH_CONFIG_CONSOLE_WIDTH ) const { typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; std::size_t maxWidth = 0; for( it = itBegin; it != itEnd; ++it ) maxWidth = (std::max)( maxWidth, it->commands().size() ); for( it = itBegin; it != itEnd; ++it ) { Catch::Text usage( it->commands(), Catch::TextAttributes() .setWidth( maxWidth+indent ) .setIndent( indent ) ); // !TBD handle longer usage strings Catch::Text desc( it->description, Catch::TextAttributes() .setWidth( width - maxWidth -3 ) ); for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { std::string usageCol = i < usage.size() ? usage[i] : ""; os << usageCol; if( i < desc.size() && !desc[i].empty() ) os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) << desc[i]; os << "\n"; } } } std::string optUsage() const { std::ostringstream oss; optUsage( oss ); return oss.str(); } void argSynopsis( std::ostream& os ) const { for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { if( i > 1 ) os << " "; typename std::map::const_iterator it = m_positionalArgs.find( i ); if( it != m_positionalArgs.end() ) os << "<" << it->second.hint << ">"; else if( m_arg.get() ) os << "<" << m_arg->hint << ">"; else throw std::logic_error( "non consecutive positional arguments with no floating args" ); } // !TBD No indication of mandatory args if( m_arg.get() ) { if( m_highestSpecifiedArgPosition > 1 ) os << " "; os << "[<" << m_arg->hint << "> ...]"; } } std::string argSynopsis() const { std::ostringstream oss; argSynopsis( oss ); return oss.str(); } void usage( std::ostream& os, std::string const& procName ) const { os << "usage:\n " << procName << " "; argSynopsis( os ); if( !m_options.empty() ) { os << " [options]\n\nwhere options are: \n"; optUsage( os, 2 ); } os << "\n"; } std::string usage( std::string const& procName ) const { std::ostringstream oss; usage( oss, procName ); return oss.str(); } std::vector parseInto( int argc, char const * const * argv, ConfigT& config ) const { std::string processName = argv[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); if( lastSlash != std::string::npos ) processName = processName.substr( lastSlash+1 ); m_boundProcessName.set( config, processName ); std::vector tokens; Parser parser; parser.parseIntoTokens( argc, argv, tokens ); return populate( tokens, config ); } std::vector populate( std::vector const& tokens, ConfigT& config ) const { if( m_options.empty() && m_positionalArgs.empty() ) throw std::logic_error( "No options or arguments specified" ); std::vector unusedTokens = populateOptions( tokens, config ); unusedTokens = populateFixedArgs( unusedTokens, config ); unusedTokens = populateFloatingArgs( unusedTokens, config ); return unusedTokens; } std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { std::vector unusedTokens; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); for(; it != itEnd; ++it ) { Arg const& arg = *it; try { if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { if( arg.takesArg() ) { if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) throw std::domain_error( "Expected argument to option " + token.data ); arg.boundField.set( config, tokens[++i].data ); } else { arg.boundField.setFlag( config ); } break; } } catch( std::exception& ex ) { throw std::runtime_error( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); } } if( it == itEnd ) unusedTokens.push_back( token ); } return unusedTokens; } std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { std::vector unusedTokens; int position = 1; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; typename std::map::const_iterator it = m_positionalArgs.find( position ); if( it != m_positionalArgs.end() ) it->second.boundField.set( config, token.data ); else unusedTokens.push_back( token ); if( token.type == Parser::Token::Positional ) position++; } return unusedTokens; } std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { if( !m_arg.get() ) return tokens; std::vector unusedTokens; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; if( token.type == Parser::Token::Positional ) m_arg->boundField.set( config, token.data ); else unusedTokens.push_back( token ); } return unusedTokens; } private: Detail::BoundArgFunction m_boundProcessName; std::vector m_options; std::map m_positionalArgs; std::auto_ptr m_arg; int m_highestSpecifiedArgPosition; }; } // end namespace Clara #endif // TWOBLUECUBES_CLARA_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/reporters/000077500000000000000000000000001221513074500227655ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/reporters/catch_reporter_console.hpp000066400000000000000000000370171221513074500302340ustar00rootroot00000000000000/* * Created by Phil on 5/12/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED #define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED #include "../internal/catch_interfaces_reporter.h" #include "../internal/catch_reporter_registrars.hpp" #include "../internal/catch_console_colour.hpp" namespace Catch { struct ConsoleReporter : StreamingReporterBase { ConsoleReporter( ReporterConfig const& _config ) : StreamingReporterBase( _config ), m_headerPrinted( false ), m_atLeastOneTestCasePrinted( false ) {} virtual ~ConsoleReporter(); static std::string getDescription() { return "Reports test results as plain lines of text"; } virtual ReporterPreferences getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = false; return prefs; } virtual void noMatchingTestCases( std::string const& spec ) { stream << "No test cases matched '" << spec << "'" << std::endl; } virtual void assertionStarting( AssertionInfo const& ) { } virtual bool assertionEnded( AssertionStats const& _assertionStats ) { AssertionResult const& result = _assertionStats.assertionResult; // Drop out if result was successful and we're not printing those if( !m_config->includeSuccessfulResults() && result.isOk() ) return false; lazyPrint(); AssertionPrinter printer( stream, _assertionStats ); printer.print(); stream << std::endl; return true; } virtual void sectionStarting( SectionInfo const& _sectionInfo ) { m_headerPrinted = false; StreamingReporterBase::sectionStarting( _sectionInfo ); } virtual void sectionEnded( SectionStats const& _sectionStats ) { if( _sectionStats.missingAssertions ) { lazyPrint(); Colour colour( Colour::ResultError ); if( m_sectionStack.size() > 1 ) stream << "\nNo assertions in section"; else stream << "\nNo assertions in test case"; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; } if( m_headerPrinted ) { if( m_config->showDurations() == ShowDurations::Always ) stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; m_headerPrinted = false; } else { if( m_config->showDurations() == ShowDurations::Always ) stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; } StreamingReporterBase::sectionEnded( _sectionStats ); } virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { StreamingReporterBase::testCaseEnded( _testCaseStats ); m_headerPrinted = false; } virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { if( currentGroupInfo.used ) { printSummaryDivider(); stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; printTotals( _testGroupStats.totals ); stream << "\n" << std::endl; } StreamingReporterBase::testGroupEnded( _testGroupStats ); } virtual void testRunEnded( TestRunStats const& _testRunStats ) { if( m_atLeastOneTestCasePrinted ) printTotalsDivider(); printTotals( _testRunStats.totals ); stream << "\n" << std::endl; StreamingReporterBase::testRunEnded( _testRunStats ); } private: class AssertionPrinter { void operator= ( AssertionPrinter const& ); public: AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats ) : stream( _stream ), stats( _stats ), result( _stats.assertionResult ), colour( Colour::None ), message( result.getMessage() ), messages( _stats.infoMessages ) { switch( result.getResultType() ) { case ResultWas::Ok: colour = Colour::Success; passOrFail = "PASSED"; //if( result.hasMessage() ) if( _stats.infoMessages.size() == 1 ) messageLabel = "with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "with messages"; break; case ResultWas::ExpressionFailed: if( result.isOk() ) { colour = Colour::Success; passOrFail = "FAILED - but was ok"; } else { colour = Colour::Error; passOrFail = "FAILED"; } if( _stats.infoMessages.size() == 1 ) messageLabel = "with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "with messages"; break; case ResultWas::ThrewException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "due to unexpected exception with message"; break; case ResultWas::DidntThrowException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "because no exception was thrown where one was expected"; break; case ResultWas::Info: messageLabel = "info"; break; case ResultWas::Warning: messageLabel = "warning"; break; case ResultWas::ExplicitFailure: passOrFail = "FAILED"; colour = Colour::Error; if( _stats.infoMessages.size() == 1 ) messageLabel = "explicitly with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "explicitly with messages"; break; // These cases are here to prevent compiler warnings case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: passOrFail = "** internal error **"; colour = Colour::Error; break; } } void print() const { printSourceInfo(); if( stats.totals.assertions.total() > 0 ) { if( result.isOk() ) stream << "\n"; printResultType(); printOriginalExpression(); printReconstructedExpression(); } else { stream << "\n"; } printMessage(); } private: void printResultType() const { if( !passOrFail.empty() ) { Colour colourGuard( colour ); stream << passOrFail << ":\n"; } } void printOriginalExpression() const { if( result.hasExpression() ) { Colour colourGuard( Colour::OriginalExpression ); stream << " "; stream << result.getExpressionInMacro(); stream << "\n"; } } void printReconstructedExpression() const { if( result.hasExpandedExpression() ) { stream << "with expansion:\n"; Colour colourGuard( Colour::ReconstructedExpression ); stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; } } void printMessage() const { if( !messageLabel.empty() ) stream << messageLabel << ":" << "\n"; for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); it != itEnd; ++it ) { stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; } } void printSourceInfo() const { Colour colourGuard( Colour::FileName ); stream << result.getSourceInfo() << ": "; } std::ostream& stream; AssertionStats const& stats; AssertionResult const& result; Colour::Code colour; std::string passOrFail; std::string messageLabel; std::string message; std::vector messages; }; void lazyPrint() { if( !currentTestRunInfo.used ) lazyPrintRunInfo(); if( !currentGroupInfo.used ) lazyPrintGroupInfo(); if( !m_headerPrinted ) { printTestCaseAndSectionHeader(); m_headerPrinted = true; } m_atLeastOneTestCasePrinted = true; } void lazyPrintRunInfo() { stream << "\n" << getTildes() << "\n"; Colour colour( Colour::SecondaryText ); stream << currentTestRunInfo->name << " is a Catch v" << libraryVersion.majorVersion << "." << libraryVersion.minorVersion << " b" << libraryVersion.buildNumber; if( libraryVersion.branchName != "master" ) stream << " (" << libraryVersion.branchName << ")"; stream << " host application.\n" << "Run with -? for options\n\n"; currentTestRunInfo.used = true; } void lazyPrintGroupInfo() { if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { printClosedHeader( "Group: " + currentGroupInfo->name ); currentGroupInfo.used = true; } } void printTestCaseAndSectionHeader() { assert( !m_sectionStack.empty() ); printOpenHeader( currentTestCaseInfo->name ); if( m_sectionStack.size() > 1 ) { Colour colourGuard( Colour::Headers ); std::vector::const_iterator it = m_sectionStack.begin()+1, // Skip first section (test case) itEnd = m_sectionStack.end(); for( ; it != itEnd; ++it ) printHeaderString( it->name, 2 ); } SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; if( !lineInfo.empty() ){ stream << getDashes() << "\n"; Colour colourGuard( Colour::FileName ); stream << lineInfo << "\n"; } stream << getDots() << "\n" << std::endl; } void printClosedHeader( std::string const& _name ) { printOpenHeader( _name ); stream << getDots() << "\n"; } void printOpenHeader( std::string const& _name ) { stream << getDashes() << "\n"; { Colour colourGuard( Colour::Headers ); printHeaderString( _name ); } } // if string has a : in first line will set indent to follow it on // subsequent lines void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { std::size_t i = _string.find( ": " ); if( i != std::string::npos ) i+=2; else i = 0; stream << Text( _string, TextAttributes() .setIndent( indent+i) .setInitialIndent( indent ) ) << "\n"; } void printTotals( const Totals& totals ) { if( totals.assertions.total() == 0 ) { stream << "No tests ran"; } else if( totals.assertions.failed ) { Colour colour( Colour::ResultError ); printCounts( "test case", totals.testCases ); if( totals.testCases.failed > 0 ) { stream << " ("; printCounts( "assertion", totals.assertions ); stream << ")"; } } else { Colour colour( Colour::ResultSuccess ); stream << "All tests passed (" << pluralise( totals.assertions.passed, "assertion" ) << " in " << pluralise( totals.testCases.passed, "test case" ) << ")"; } } void printCounts( std::string const& label, Counts const& counts ) { if( counts.total() == 1 ) { stream << "1 " << label << " - "; if( counts.failed ) stream << "failed"; else stream << "passed"; } else { stream << counts.total() << " " << label << "s "; if( counts.passed ) { if( counts.failed ) stream << "- " << counts.failed << " failed"; else if( counts.passed == 2 ) stream << "- both passed"; else stream << "- all passed"; } else { if( counts.failed == 2 ) stream << "- both failed"; else stream << "- all failed"; } } } void printTotalsDivider() { stream << getDoubleDashes() << "\n"; } void printSummaryDivider() { stream << getDashes() << "\n"; } static std::string const& getDashes() { static const std::string dashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '-' ); return dashes; } static std::string const& getDots() { static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '.' ); return dots; } static std::string const& getDoubleDashes() { static const std::string doubleDashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); return doubleDashes; } static std::string const& getTildes() { static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '~' ); return dots; } private: bool m_headerPrinted; bool m_atLeastOneTestCasePrinted; }; INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) } // end namespace Catch #endif // TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/reporters/catch_reporter_junit.hpp000066400000000000000000000220461221513074500277170ustar00rootroot00000000000000/* * Created by Phil on 26/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED #define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED #include "../internal/catch_tostring.hpp" #include "../internal/catch_interfaces_reporter.h" #include "../internal/catch_reporter_registrars.hpp" #include "../internal/catch_xmlwriter.hpp" #include namespace Catch { class JunitReporter : public CumulativeReporterBase { public: JunitReporter( ReporterConfig const& _config ) : CumulativeReporterBase( _config ), xml( _config.stream() ) {} ~JunitReporter(); static std::string getDescription() { return "Reports test results in an XML format that looks like Ant's junitreport target"; } virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} virtual ReporterPreferences getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = true; return prefs; } virtual void testRunStarting( TestRunInfo const& runInfo ) { CumulativeReporterBase::testRunStarting( runInfo ); xml.startElement( "testsuites" ); } virtual void testGroupStarting( GroupInfo const& groupInfo ) { suiteTimer.start(); stdOutForSuite.str(""); stdErrForSuite.str(""); unexpectedExceptions = 0; CumulativeReporterBase::testGroupStarting( groupInfo ); } virtual bool assertionEnded( AssertionStats const& assertionStats ) { if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) unexpectedExceptions++; return CumulativeReporterBase::assertionEnded( assertionStats ); } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { stdOutForSuite << testCaseStats.stdOut; stdErrForSuite << testCaseStats.stdErr; CumulativeReporterBase::testCaseEnded( testCaseStats ); } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { double suiteTime = suiteTimer.getElapsedSeconds(); CumulativeReporterBase::testGroupEnded( testGroupStats ); writeGroup( *m_testGroups.back(), suiteTime ); } virtual void testRunEnded() { xml.endElement(); } void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); TestGroupStats const& stats = groupNode.value; xml.writeAttribute( "name", stats.groupInfo.name ); xml.writeAttribute( "errors", unexpectedExceptions ); xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); xml.writeAttribute( "tests", stats.totals.assertions.total() ); xml.writeAttribute( "hostname", "tbd" ); // !TBD if( m_config->showDurations() == ShowDurations::Never ) xml.writeAttribute( "time", "" ); else xml.writeAttribute( "time", suiteTime ); xml.writeAttribute( "timestamp", "tbd" ); // !TBD // Write test cases for( TestGroupNode::ChildNodes::const_iterator it = groupNode.children.begin(), itEnd = groupNode.children.end(); it != itEnd; ++it ) writeTestCase( **it ); xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); } void writeTestCase( TestCaseNode const& testCaseNode ) { TestCaseStats const& stats = testCaseNode.value; // All test cases have exactly one section - which represents the // test case itself. That section may have 0-n nested sections assert( testCaseNode.children.size() == 1 ); SectionNode const& rootSection = *testCaseNode.children.front(); std::string className = stats.testInfo.className; if( className.empty() ) { if( rootSection.childSections.empty() ) className = "global"; } writeSection( className, "", rootSection ); } void writeSection( std::string const& className, std::string const& rootName, SectionNode const& sectionNode ) { std::string name = trim( sectionNode.stats.sectionInfo.name ); if( !rootName.empty() ) name = rootName + "/" + name; if( !sectionNode.assertions.empty() || !sectionNode.stdOut.empty() || !sectionNode.stdErr.empty() ) { XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); if( className.empty() ) { xml.writeAttribute( "classname", name ); xml.writeAttribute( "name", "root" ); } else { xml.writeAttribute( "classname", className ); xml.writeAttribute( "name", name ); } xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) ); writeAssertions( sectionNode ); if( !sectionNode.stdOut.empty() ) xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); if( !sectionNode.stdErr.empty() ) xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); } for( SectionNode::ChildSections::const_iterator it = sectionNode.childSections.begin(), itEnd = sectionNode.childSections.end(); it != itEnd; ++it ) if( className.empty() ) writeSection( name, "", **it ); else writeSection( className, name, **it ); } void writeAssertions( SectionNode const& sectionNode ) { for( SectionNode::Assertions::const_iterator it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); it != itEnd; ++it ) writeAssertion( *it ); } void writeAssertion( AssertionStats const& stats ) { AssertionResult const& result = stats.assertionResult; if( !result.isOk() ) { std::string elementName; switch( result.getResultType() ) { case ResultWas::ThrewException: elementName = "error"; break; case ResultWas::ExplicitFailure: elementName = "failure"; break; case ResultWas::ExpressionFailed: elementName = "failure"; break; case ResultWas::DidntThrowException: elementName = "failure"; break; // We should never see these here: case ResultWas::Info: case ResultWas::Warning: case ResultWas::Ok: case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: elementName = "internalError"; break; } XmlWriter::ScopedElement e = xml.scopedElement( elementName ); xml.writeAttribute( "message", result.getExpandedExpression() ); xml.writeAttribute( "type", result.getTestMacroName() ); std::ostringstream oss; if( !result.getMessage().empty() ) oss << result.getMessage() << "\n"; for( std::vector::const_iterator it = stats.infoMessages.begin(), itEnd = stats.infoMessages.end(); it != itEnd; ++it ) if( it->type == ResultWas::Info ) oss << it->message << "\n"; oss << "at " << result.getSourceInfo(); xml.writeText( oss.str(), false ); } } XmlWriter xml; Timer suiteTimer; std::ostringstream stdOutForSuite; std::ostringstream stdErrForSuite; unsigned int unexpectedExceptions; }; INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) } // end namespace Catch #endif // TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/include/reporters/catch_reporter_xml.hpp000066400000000000000000000137611221513074500273720ustar00rootroot00000000000000/* * Created by Phil on 28/10/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED #define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED #include "../internal/catch_capture.hpp" #include "../internal/catch_interfaces_reporter.h" #include "../internal/catch_reporter_registrars.hpp" #include "../internal/catch_xmlwriter.hpp" namespace Catch { class XmlReporter : public SharedImpl { public: XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} static std::string getDescription() { return "Reports test results as an XML document"; } virtual ~XmlReporter(); private: // IReporter virtual bool shouldRedirectStdout() const { return true; } virtual void StartTesting() { m_xml = XmlWriter( m_config.stream() ); m_xml.startElement( "Catch" ); if( !m_config.fullConfig()->name().empty() ) m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); } virtual void EndTesting( const Totals& totals ) { m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", totals.assertions.passed ) .writeAttribute( "failures", totals.assertions.failed ); m_xml.endElement(); } virtual void StartGroup( const std::string& groupName ) { m_xml.startElement( "Group" ) .writeAttribute( "name", groupName ); } virtual void EndGroup( const std::string&, const Totals& totals ) { m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", totals.assertions.passed ) .writeAttribute( "failures", totals.assertions.failed ); m_xml.endElement(); } virtual void StartSection( const std::string& sectionName, const std::string& description ) { if( m_sectionDepth++ > 0 ) { m_xml.startElement( "Section" ) .writeAttribute( "name", sectionName ) .writeAttribute( "description", description ); } } virtual void NoAssertionsInSection( const std::string& ) {} virtual void NoAssertionsInTestCase( const std::string& ) {} virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { if( --m_sectionDepth > 0 ) { m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", assertions.passed ) .writeAttribute( "failures", assertions.failed ); m_xml.endElement(); } } virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { m_xml.startElement( "TestCase" ).writeAttribute( "name", testInfo.name ); m_currentTestSuccess = true; } virtual void Result( const Catch::AssertionResult& assertionResult ) { if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) return; if( assertionResult.hasExpression() ) { m_xml.startElement( "Expression" ) .writeAttribute( "success", assertionResult.succeeded() ) .writeAttribute( "filename", assertionResult.getSourceInfo().file ) .writeAttribute( "line", assertionResult.getSourceInfo().line ); m_xml.scopedElement( "Original" ) .writeText( assertionResult.getExpression() ); m_xml.scopedElement( "Expanded" ) .writeText( assertionResult.getExpandedExpression() ); m_currentTestSuccess &= assertionResult.succeeded(); } switch( assertionResult.getResultType() ) { case ResultWas::ThrewException: m_xml.scopedElement( "Exception" ) .writeAttribute( "filename", assertionResult.getSourceInfo().file ) .writeAttribute( "line", assertionResult.getSourceInfo().line ) .writeText( assertionResult.getMessage() ); m_currentTestSuccess = false; break; case ResultWas::Info: m_xml.scopedElement( "Info" ) .writeText( assertionResult.getMessage() ); break; case ResultWas::Warning: m_xml.scopedElement( "Warning" ) .writeText( assertionResult.getMessage() ); break; case ResultWas::ExplicitFailure: m_xml.scopedElement( "Failure" ) .writeText( assertionResult.getMessage() ); m_currentTestSuccess = false; break; case ResultWas::Unknown: case ResultWas::Ok: case ResultWas::FailureBit: case ResultWas::ExpressionFailed: case ResultWas::Exception: case ResultWas::DidntThrowException: break; } if( assertionResult.hasExpression() ) m_xml.endElement(); } virtual void Aborted() { // !TBD } virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); m_xml.endElement(); } private: ReporterConfig m_config; bool m_currentTestSuccess; XmlWriter m_xml; int m_sectionDepth; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/000077500000000000000000000000001221513074500211465ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/000077500000000000000000000000001221513074500226775ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/ApproxTests.cpp000066400000000000000000000053561221513074500257100ustar00rootroot00000000000000/* * Created by Phil on 28/04/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch.hpp" /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/Approx/simple", "Some simple comparisons between doubles" ) { double d = 1.23; REQUIRE( d == Approx( 1.23 ) ); REQUIRE( d != Approx( 1.22 ) ); REQUIRE( d != Approx( 1.24 ) ); REQUIRE( Approx( d ) == 1.23 ); REQUIRE( Approx( d ) != 1.22 ); REQUIRE( Approx( d ) != 1.24 ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/Approx/epsilon", "Approximate comparisons with different epsilons" ) { double d = 1.23; REQUIRE( d != Approx( 1.231 ) ); REQUIRE( d == Approx( 1.231 ).epsilon( 0.1 ) ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/Approx/float", "Approximate comparisons with floats" ) { REQUIRE( 1.23f == Approx( 1.23f ) ); REQUIRE( 0.0f == Approx( 0.0f ) ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/Approx/int", "Approximate comparisons with ints" ) { REQUIRE( 1 == Approx( 1 ) ); REQUIRE( 0 == Approx( 0 ) ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/Approx/mixed", "Approximate comparisons with mixed numeric types" ) { const double dZero = 0; const double dSmall = 0.00001; const double dMedium = 1.234; REQUIRE( 1.0f == Approx( 1 ) ); REQUIRE( 0 == Approx( dZero) ); REQUIRE( 0 == Approx( dSmall ).epsilon( 0.001 ) ); REQUIRE( 1.234f == Approx( dMedium ) ); REQUIRE( dMedium == Approx( 1.234f ) ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/Approx/custom", "Use a custom approx" ) { double d = 1.23; Approx approx = Approx::custom().epsilon( 0.005 ); REQUIRE( d == approx( 1.23 ) ); REQUIRE( d == approx( 1.22 ) ); REQUIRE( d == approx( 1.24 ) ); REQUIRE( d != approx( 1.25 ) ); REQUIRE( approx( d ) == 1.23 ); REQUIRE( approx( d ) == 1.22 ); REQUIRE( approx( d ) == 1.24 ); REQUIRE( approx( d ) != 1.25 ); } inline double divide( double a, double b ) { return a/b; } TEST_CASE( "Approximate PI", "[Approx][PI]" ) { REQUIRE( divide( 22, 7 ) == Approx( 3.141 ).epsilon( 0.001 ) ); REQUIRE( divide( 22, 7 ) != Approx( 3.141 ).epsilon( 0.0001 ) ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/BDDTests.cpp000066400000000000000000000047511221513074500250260ustar00rootroot00000000000000/* * Created by Phil on 29/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch.hpp" inline bool itDoesThis(){ return true; } inline bool itDoesThat(){ return true; } SCENARIO( "Do that thing with the thing", "[Tags]" ) { GIVEN( "This stuff exists" ) { // make stuff exist WHEN( "I do this" ) { // do this THEN( "it should do this") { REQUIRE( itDoesThis() ); AND_THEN( "do that") REQUIRE( itDoesThat() ); } } } } SCENARIO( "Vector resizing affects size and capacity", "[vector][bdd][size][capacity]" ) { GIVEN( "an empty vector" ) { std::vector v; REQUIRE( v.size() == 0 ); WHEN( "it is made larger" ) { v.resize( 10 ); THEN( "the size and capacity go up" ) { REQUIRE( v.size() == 10 ); REQUIRE( v.capacity() >= 10 ); AND_WHEN( "it is made smaller again" ) { v.resize( 5 ); THEN( "the size goes down but the capacity stays the same" ) { REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 10 ); } } } } WHEN( "we reserve more space" ) { v.reserve( 10 ); THEN( "The capacity is increased but the size remains the same" ) { REQUIRE( v.capacity() >= 10 ); REQUIRE( v.size() == 0 ); } } } } SCENARIO( "This is a really long scenario name to see how the list command deals with wrapping", "[very long tags][lots][long][tags][verbose]" "[one very long tag name that should cause line wrapping writing out using the list command]" "[anotherReallyLongTagNameButThisOneHasNoObviousWrapPointsSoShouldSplitWithinAWordUsingADashCharacter]" ) { GIVEN( "A section name that is so long that it cannot fit in a single console width" ) WHEN( "The test headers are printed as part of the normal running of the scenario" ) THEN( "The, deliberately very long and overly verbose (you see what I did there?) section names must wrap, along with an indent" ) SUCCEED("boo!"); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/Baselines/000077500000000000000000000000001221513074500246045ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/Baselines/approvedResults.txt000066400000000000000000016125041221513074500305600ustar00rootroot00000000000000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CatchSelfTest is a Catch v1.0 b10 host application. Run with -? for options ------------------------------------------------------------------------------- ./failing/TestClass/failingCase ------------------------------------------------------------------------------- ClassTests.cpp ............................................................................... ClassTests.cpp: FAILED: REQUIRE( s == "world" ) with expansion: "hello" == "world" ------------------------------------------------------------------------------- ./failing/Fixture/failingCase ------------------------------------------------------------------------------- ClassTests.cpp ............................................................................... ClassTests.cpp: FAILED: REQUIRE( m_a == 2 ) with expansion: 1 == 2 ------------------------------------------------------------------------------- ./failing/conditions/equality ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( data.int_seven == 6 ) with expansion: 7 == 6 ConditionTests.cpp: FAILED: CHECK( data.int_seven == 8 ) with expansion: 7 == 8 ConditionTests.cpp: FAILED: CHECK( data.int_seven == 0 ) with expansion: 7 == 0 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 9.11f ) ) with expansion: 9.1 == Approx( 9.11 ) ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 9.0f ) ) with expansion: 9.1 == Approx( 9 ) ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 1 ) ) with expansion: 9.1 == Approx( 1 ) ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 0 ) ) with expansion: 9.1 == Approx( 0 ) ConditionTests.cpp: FAILED: CHECK( data.double_pi == Approx( 3.1415 ) ) with expansion: 3.1415926535 == Approx( 3.1415 ) ConditionTests.cpp: FAILED: CHECK( data.str_hello == "goodbye" ) with expansion: "hello" == "goodbye" ConditionTests.cpp: FAILED: CHECK( data.str_hello == "hell" ) with expansion: "hello" == "hell" ConditionTests.cpp: FAILED: CHECK( data.str_hello == "hello1" ) with expansion: "hello" == "hello1" ConditionTests.cpp: FAILED: CHECK( data.str_hello.size() == 6 ) with expansion: 5 == 6 ConditionTests.cpp: FAILED: CHECK( x == Approx( 1.301 ) ) with expansion: 1.3 == Approx( 1.301 ) ------------------------------------------------------------------------------- ./failing/conditions/inequality ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( data.int_seven != 7 ) with expansion: 7 != 7 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one != Approx( 9.1f ) ) with expansion: 9.1 != Approx( 9.1 ) ConditionTests.cpp: FAILED: CHECK( data.double_pi != Approx( 3.1415926535 ) ) with expansion: 3.1415926535 != Approx( 3.14159 ) ConditionTests.cpp: FAILED: CHECK( data.str_hello != "hello" ) with expansion: "hello" != "hello" ConditionTests.cpp: FAILED: CHECK( data.str_hello.size() != 5 ) with expansion: 5 != 5 ------------------------------------------------------------------------------- ./failing/conditions/ordered ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( data.int_seven > 7 ) with expansion: 7 > 7 ConditionTests.cpp: FAILED: CHECK( data.int_seven < 7 ) with expansion: 7 < 7 ConditionTests.cpp: FAILED: CHECK( data.int_seven > 8 ) with expansion: 7 > 8 ConditionTests.cpp: FAILED: CHECK( data.int_seven < 6 ) with expansion: 7 < 6 ConditionTests.cpp: FAILED: CHECK( data.int_seven < 0 ) with expansion: 7 < 0 ConditionTests.cpp: FAILED: CHECK( data.int_seven < -1 ) with expansion: 7 < -1 ConditionTests.cpp: FAILED: CHECK( data.int_seven >= 8 ) with expansion: 7 >= 8 ConditionTests.cpp: FAILED: CHECK( data.int_seven <= 6 ) with expansion: 7 <= 6 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one < 9 ) with expansion: 9.1 < 9 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one > 10 ) with expansion: 9.1 > 10 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one > 9.2 ) with expansion: 9.1 > 9.2 ConditionTests.cpp: FAILED: CHECK( data.str_hello > "hello" ) with expansion: "hello" > "hello" ConditionTests.cpp: FAILED: CHECK( data.str_hello < "hello" ) with expansion: "hello" < "hello" ConditionTests.cpp: FAILED: CHECK( data.str_hello > "hellp" ) with expansion: "hello" > "hellp" ConditionTests.cpp: FAILED: CHECK( data.str_hello > "z" ) with expansion: "hello" > "z" ConditionTests.cpp: FAILED: CHECK( data.str_hello < "hellm" ) with expansion: "hello" < "hellm" ConditionTests.cpp: FAILED: CHECK( data.str_hello < "a" ) with expansion: "hello" < "a" ConditionTests.cpp: FAILED: CHECK( data.str_hello >= "z" ) with expansion: "hello" >= "z" ConditionTests.cpp: FAILED: CHECK( data.str_hello <= "a" ) with expansion: "hello" <= "a" ------------------------------------------------------------------------------- ./failing/conditions/not ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( false != false ) ConditionTests.cpp: FAILED: CHECK( true != true ) ConditionTests.cpp: FAILED: CHECK( !true ) with expansion: false ConditionTests.cpp: FAILED: CHECK_FALSE( true ) ConditionTests.cpp: FAILED: CHECK( !trueValue ) with expansion: false ConditionTests.cpp: FAILED: CHECK_FALSE( trueValue ) with expansion: !true ConditionTests.cpp: FAILED: CHECK( !(1 == 1) ) with expansion: false ConditionTests.cpp: FAILED: CHECK_FALSE( 1 == 1 ) with expansion: !(1 == 1) ------------------------------------------------------------------------------- ./failing/exceptions/explicit ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: CHECK_THROWS_AS( thisThrows() ) due to unexpected exception with message: expected exception ExceptionTests.cpp: FAILED: CHECK_THROWS_AS( thisDoesntThrow() ) because no exception was thrown where one was expected: ExceptionTests.cpp: FAILED: CHECK_NOTHROW( thisThrows() ) due to unexpected exception with message: expected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: unexpected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit/2 ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: {Unknown expression after the reported line} due to unexpected exception with message: unexpected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit/3 section name ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: unexpected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit/4 ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: CHECK( thisThrows() == 0 ) due to unexpected exception with message: expected exception ------------------------------------------------------------------------------- ./failing/exceptions/custom ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: custom exception ------------------------------------------------------------------------------- ./failing/exceptions/custom/nothrow ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: REQUIRE_NOTHROW( throwCustom() ) due to unexpected exception with message: custom exception - not std ------------------------------------------------------------------------------- ./failing/exceptions/custom/throw ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: REQUIRE_THROWS_AS( throwCustom() ) due to unexpected exception with message: custom exception - not std ------------------------------------------------------------------------------- ./failing/exceptions/custom/double ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: 3.14 ------------------------------------------------------------------------------- ./failing/message/info/1 ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: REQUIRE( a == 1 ) with expansion: 2 == 1 with messages: this message should be logged so should this ------------------------------------------------------------------------------- ./mixed/message/info/2 ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: CHECK( a == 1 ) with expansion: 2 == 1 with messages: this message may be logged later this message should be logged MessageTests.cpp: FAILED: CHECK( a == 0 ) with expansion: 2 == 0 with message: and this, but later ------------------------------------------------------------------------------- ./failing/message/fail ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: This is a failure ------------------------------------------------------------------------------- ./failing/message/sections one ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: Message from section one ------------------------------------------------------------------------------- ./failing/message/sections two ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: Message from section two Message from section one Message from section two ------------------------------------------------------------------------------- ./mixed/message/scoped ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: REQUIRE( i < 10 ) with expansion: 10 < 10 with messages: current counter 10 i := 10 ------------------------------------------------------------------------------- just failure ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: Previous info should not be seen ------------------------------------------------------------------------------- ./mixed/Misc/Sections/nested2 s1 s2 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: REQUIRE( a == b ) with expansion: 1 == 2 ------------------------------------------------------------------------------- ./mixed/Misc/Sections/loops s1 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK( b > a ) with expansion: 0 > 1 ------------------------------------------------------------------------------- ./mixed/Misc/loops ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[0] (1) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[1] (1) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[3] (3) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[4] (5) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[6] (13) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[7] (21) is even Some information An error ------------------------------------------------------------------------------- ./failing/info ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: REQUIRE( false ) with messages: hi i := 7 ------------------------------------------------------------------------------- ./failing/checkedif ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECKED_IF( flag ) with expansion: false MiscTests.cpp: FAILED: REQUIRE( testCheckedIf( false ) ) with expansion: false ------------------------------------------------------------------------------- ./failing/checkedelse ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECKED_ELSE( flag ) with expansion: false MiscTests.cpp: FAILED: REQUIRE( testCheckedElse( false ) ) with expansion: false ------------------------------------------------------------------------------- ./manual/onechar ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: REQUIRE( false ) with message: 3 ------------------------------------------------------------------------------- ./failing/matchers/Contains ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() Contains( "not there" ) ) with expansion: "this string contains 'abc' as a substring" contains: "not there" ------------------------------------------------------------------------------- ./failing/matchers/StartsWith ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() StartsWith( "string" ) ) with expansion: "this string contains 'abc' as a substring" starts with: "string" ------------------------------------------------------------------------------- ./failing/matchers/EndsWith ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() EndsWith( "this" ) ) with expansion: "this string contains 'abc' as a substring" ends with: "this" ------------------------------------------------------------------------------- ./failing/matchers/Equals ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() Equals( "something else" ) ) with expansion: "this string contains 'abc' as a substring" equals: "something else" ------------------------------------------------------------------------------- ./failing/CatchSectionInfiniteLoop ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: explicitly with message: to infinity and beyond ------------------------------------------------------------------------------- ./failing/CatchSectionInfiniteLoop ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: explicitly with message: to infinity and beyond ------------------------------------------------------------------------------- ./failing/CatchSectionInfiniteLoop ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: explicitly with message: to infinity and beyond Message from section one Message from section two Some information An error Message from section one Message from section two Some information An error hello hello ------------------------------------------------------------------------------- ./failing/Tricky/non streamable type ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: FAILED: CHECK( &o1 == &o2 ) with expansion: 0x == 0x TrickyTests.cpp: FAILED: CHECK( o1 == o2 ) with expansion: {?} == {?} ------------------------------------------------------------------------------- ./failing/string literals ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: FAILED: REQUIRE( std::string( "first" ) == "second" ) with expansion: "first" == "second" =============================================================================== 121 test cases - 35 failed (737 assertions - 90 failed) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CatchSelfTest is a Catch v1.0 b10 host application. Run with -? for options ------------------------------------------------------------------------------- ./succeeding/Approx/simple ------------------------------------------------------------------------------- ApproxTests.cpp ............................................................................... ApproxTests.cpp: PASSED: REQUIRE( d == Approx( 1.23 ) ) with expansion: 1.23 == Approx( 1.23 ) ApproxTests.cpp: PASSED: REQUIRE( d != Approx( 1.22 ) ) with expansion: 1.23 != Approx( 1.22 ) ApproxTests.cpp: PASSED: REQUIRE( d != Approx( 1.24 ) ) with expansion: 1.23 != Approx( 1.24 ) ApproxTests.cpp: PASSED: REQUIRE( Approx( d ) == 1.23 ) with expansion: Approx( 1.23 ) == 1.23 ApproxTests.cpp: PASSED: REQUIRE( Approx( d ) != 1.22 ) with expansion: Approx( 1.23 ) != 1.22 ApproxTests.cpp: PASSED: REQUIRE( Approx( d ) != 1.24 ) with expansion: Approx( 1.23 ) != 1.24 ------------------------------------------------------------------------------- ./succeeding/Approx/epsilon ------------------------------------------------------------------------------- ApproxTests.cpp ............................................................................... ApproxTests.cpp: PASSED: REQUIRE( d != Approx( 1.231 ) ) with expansion: 1.23 != Approx( 1.231 ) ApproxTests.cpp: PASSED: REQUIRE( d == Approx( 1.231 ).epsilon( 0.1 ) ) with expansion: 1.23 == Approx( 1.231 ) ------------------------------------------------------------------------------- ./succeeding/Approx/float ------------------------------------------------------------------------------- ApproxTests.cpp ............................................................................... ApproxTests.cpp: PASSED: REQUIRE( 1.23f == Approx( 1.23f ) ) with expansion: 1.23 == Approx( 1.23 ) ApproxTests.cpp: PASSED: REQUIRE( 0.0f == Approx( 0.0f ) ) with expansion: 0 == Approx( 0 ) ------------------------------------------------------------------------------- ./succeeding/Approx/int ------------------------------------------------------------------------------- ApproxTests.cpp ............................................................................... ApproxTests.cpp: PASSED: REQUIRE( 1 == Approx( 1 ) ) ApproxTests.cpp: PASSED: REQUIRE( 0 == Approx( 0 ) ) ------------------------------------------------------------------------------- ./succeeding/Approx/mixed ------------------------------------------------------------------------------- ApproxTests.cpp ............................................................................... ApproxTests.cpp: PASSED: REQUIRE( 1.0f == Approx( 1 ) ) with expansion: 1 == Approx( 1 ) ApproxTests.cpp: PASSED: REQUIRE( 0 == Approx( dZero) ) with expansion: 0 == Approx( 0 ) ApproxTests.cpp: PASSED: REQUIRE( 0 == Approx( dSmall ).epsilon( 0.001 ) ) with expansion: 0 == Approx( 1e-05 ) ApproxTests.cpp: PASSED: REQUIRE( 1.234f == Approx( dMedium ) ) with expansion: 1.234 == Approx( 1.234 ) ApproxTests.cpp: PASSED: REQUIRE( dMedium == Approx( 1.234f ) ) with expansion: 1.234 == Approx( 1.234 ) ------------------------------------------------------------------------------- ./succeeding/Approx/custom ------------------------------------------------------------------------------- ApproxTests.cpp ............................................................................... ApproxTests.cpp: PASSED: REQUIRE( d == approx( 1.23 ) ) with expansion: 1.23 == Approx( 1.23 ) ApproxTests.cpp: PASSED: REQUIRE( d == approx( 1.22 ) ) with expansion: 1.23 == Approx( 1.22 ) ApproxTests.cpp: PASSED: REQUIRE( d == approx( 1.24 ) ) with expansion: 1.23 == Approx( 1.24 ) ApproxTests.cpp: PASSED: REQUIRE( d != approx( 1.25 ) ) with expansion: 1.23 != Approx( 1.25 ) ApproxTests.cpp: PASSED: REQUIRE( approx( d ) == 1.23 ) with expansion: Approx( 1.23 ) == 1.23 ApproxTests.cpp: PASSED: REQUIRE( approx( d ) == 1.22 ) with expansion: Approx( 1.23 ) == 1.22 ApproxTests.cpp: PASSED: REQUIRE( approx( d ) == 1.24 ) with expansion: Approx( 1.23 ) == 1.24 ApproxTests.cpp: PASSED: REQUIRE( approx( d ) != 1.25 ) with expansion: Approx( 1.23 ) != 1.25 ------------------------------------------------------------------------------- Approximate PI ------------------------------------------------------------------------------- ApproxTests.cpp ............................................................................... ApproxTests.cpp: PASSED: REQUIRE( divide( 22, 7 ) == Approx( 3.141 ).epsilon( 0.001 ) ) with expansion: 3.1428571429 == Approx( 3.141 ) ApproxTests.cpp: PASSED: REQUIRE( divide( 22, 7 ) != Approx( 3.141 ).epsilon( 0.0001 ) ) with expansion: 3.1428571429 != Approx( 3.141 ) ------------------------------------------------------------------------------- ./succeeding/TestClass/succeedingCase ------------------------------------------------------------------------------- ClassTests.cpp ............................................................................... ClassTests.cpp: PASSED: REQUIRE( s == "hello" ) with expansion: "hello" == "hello" ------------------------------------------------------------------------------- ./failing/TestClass/failingCase ------------------------------------------------------------------------------- ClassTests.cpp ............................................................................... ClassTests.cpp: FAILED: REQUIRE( s == "world" ) with expansion: "hello" == "world" ------------------------------------------------------------------------------- ./succeeding/Fixture/succeedingCase ------------------------------------------------------------------------------- ClassTests.cpp ............................................................................... ClassTests.cpp: PASSED: REQUIRE( m_a == 1 ) with expansion: 1 == 1 ------------------------------------------------------------------------------- ./failing/Fixture/failingCase ------------------------------------------------------------------------------- ClassTests.cpp ............................................................................... ClassTests.cpp: FAILED: REQUIRE( m_a == 2 ) with expansion: 1 == 2 ------------------------------------------------------------------------------- ./succeeding/conditions/equality ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( data.int_seven == 7 ) with expansion: 7 == 7 ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one == Approx( 9.1f ) ) with expansion: 9.1 == Approx( 9.1 ) ConditionTests.cpp: PASSED: REQUIRE( data.double_pi == Approx( 3.1415926535 ) ) with expansion: 3.1415926535 == Approx( 3.14159 ) ConditionTests.cpp: PASSED: REQUIRE( data.str_hello == "hello" ) with expansion: "hello" == "hello" ConditionTests.cpp: PASSED: REQUIRE( "hello" == data.str_hello ) with expansion: "hello" == "hello" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello.size() == 5 ) with expansion: 5 == 5 ConditionTests.cpp: PASSED: REQUIRE( x == Approx( 1.3 ) ) with expansion: 1.3 == Approx( 1.3 ) ------------------------------------------------------------------------------- ./failing/conditions/equality ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( data.int_seven == 6 ) with expansion: 7 == 6 ConditionTests.cpp: FAILED: CHECK( data.int_seven == 8 ) with expansion: 7 == 8 ConditionTests.cpp: FAILED: CHECK( data.int_seven == 0 ) with expansion: 7 == 0 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 9.11f ) ) with expansion: 9.1 == Approx( 9.11 ) ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 9.0f ) ) with expansion: 9.1 == Approx( 9 ) ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 1 ) ) with expansion: 9.1 == Approx( 1 ) ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one == Approx( 0 ) ) with expansion: 9.1 == Approx( 0 ) ConditionTests.cpp: FAILED: CHECK( data.double_pi == Approx( 3.1415 ) ) with expansion: 3.1415926535 == Approx( 3.1415 ) ConditionTests.cpp: FAILED: CHECK( data.str_hello == "goodbye" ) with expansion: "hello" == "goodbye" ConditionTests.cpp: FAILED: CHECK( data.str_hello == "hell" ) with expansion: "hello" == "hell" ConditionTests.cpp: FAILED: CHECK( data.str_hello == "hello1" ) with expansion: "hello" == "hello1" ConditionTests.cpp: FAILED: CHECK( data.str_hello.size() == 6 ) with expansion: 5 == 6 ConditionTests.cpp: FAILED: CHECK( x == Approx( 1.301 ) ) with expansion: 1.3 == Approx( 1.301 ) ------------------------------------------------------------------------------- ./succeeding/conditions/inequality ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( data.int_seven != 6 ) with expansion: 7 != 6 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven != 8 ) with expansion: 7 != 8 ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one != Approx( 9.11f ) ) with expansion: 9.1 != Approx( 9.11 ) ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one != Approx( 9.0f ) ) with expansion: 9.1 != Approx( 9 ) ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one != Approx( 1 ) ) with expansion: 9.1 != Approx( 1 ) ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one != Approx( 0 ) ) with expansion: 9.1 != Approx( 0 ) ConditionTests.cpp: PASSED: REQUIRE( data.double_pi != Approx( 3.1415 ) ) with expansion: 3.1415926535 != Approx( 3.1415 ) ConditionTests.cpp: PASSED: REQUIRE( data.str_hello != "goodbye" ) with expansion: "hello" != "goodbye" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello != "hell" ) with expansion: "hello" != "hell" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello != "hello1" ) with expansion: "hello" != "hello1" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello.size() != 6 ) with expansion: 5 != 6 ------------------------------------------------------------------------------- ./failing/conditions/inequality ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( data.int_seven != 7 ) with expansion: 7 != 7 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one != Approx( 9.1f ) ) with expansion: 9.1 != Approx( 9.1 ) ConditionTests.cpp: FAILED: CHECK( data.double_pi != Approx( 3.1415926535 ) ) with expansion: 3.1415926535 != Approx( 3.14159 ) ConditionTests.cpp: FAILED: CHECK( data.str_hello != "hello" ) with expansion: "hello" != "hello" ConditionTests.cpp: FAILED: CHECK( data.str_hello.size() != 5 ) with expansion: 5 != 5 ------------------------------------------------------------------------------- ./succeeding/conditions/ordered ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( data.int_seven < 8 ) with expansion: 7 < 8 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven > 6 ) with expansion: 7 > 6 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven > 0 ) with expansion: 7 > 0 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven > -1 ) with expansion: 7 > -1 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven >= 7 ) with expansion: 7 >= 7 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven >= 6 ) with expansion: 7 >= 6 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven <= 7 ) with expansion: 7 <= 7 ConditionTests.cpp: PASSED: REQUIRE( data.int_seven <= 8 ) with expansion: 7 <= 8 ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one > 9 ) with expansion: 9.1 > 9 ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one < 10 ) with expansion: 9.1 < 10 ConditionTests.cpp: PASSED: REQUIRE( data.float_nine_point_one < 9.2 ) with expansion: 9.1 < 9.2 ConditionTests.cpp: PASSED: REQUIRE( data.str_hello <= "hello" ) with expansion: "hello" <= "hello" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello >= "hello" ) with expansion: "hello" >= "hello" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello < "hellp" ) with expansion: "hello" < "hellp" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello < "zebra" ) with expansion: "hello" < "zebra" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello > "hellm" ) with expansion: "hello" > "hellm" ConditionTests.cpp: PASSED: REQUIRE( data.str_hello > "a" ) with expansion: "hello" > "a" ------------------------------------------------------------------------------- ./failing/conditions/ordered ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( data.int_seven > 7 ) with expansion: 7 > 7 ConditionTests.cpp: FAILED: CHECK( data.int_seven < 7 ) with expansion: 7 < 7 ConditionTests.cpp: FAILED: CHECK( data.int_seven > 8 ) with expansion: 7 > 8 ConditionTests.cpp: FAILED: CHECK( data.int_seven < 6 ) with expansion: 7 < 6 ConditionTests.cpp: FAILED: CHECK( data.int_seven < 0 ) with expansion: 7 < 0 ConditionTests.cpp: FAILED: CHECK( data.int_seven < -1 ) with expansion: 7 < -1 ConditionTests.cpp: FAILED: CHECK( data.int_seven >= 8 ) with expansion: 7 >= 8 ConditionTests.cpp: FAILED: CHECK( data.int_seven <= 6 ) with expansion: 7 <= 6 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one < 9 ) with expansion: 9.1 < 9 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one > 10 ) with expansion: 9.1 > 10 ConditionTests.cpp: FAILED: CHECK( data.float_nine_point_one > 9.2 ) with expansion: 9.1 > 9.2 ConditionTests.cpp: FAILED: CHECK( data.str_hello > "hello" ) with expansion: "hello" > "hello" ConditionTests.cpp: FAILED: CHECK( data.str_hello < "hello" ) with expansion: "hello" < "hello" ConditionTests.cpp: FAILED: CHECK( data.str_hello > "hellp" ) with expansion: "hello" > "hellp" ConditionTests.cpp: FAILED: CHECK( data.str_hello > "z" ) with expansion: "hello" > "z" ConditionTests.cpp: FAILED: CHECK( data.str_hello < "hellm" ) with expansion: "hello" < "hellm" ConditionTests.cpp: FAILED: CHECK( data.str_hello < "a" ) with expansion: "hello" < "a" ConditionTests.cpp: FAILED: CHECK( data.str_hello >= "z" ) with expansion: "hello" >= "z" ConditionTests.cpp: FAILED: CHECK( data.str_hello <= "a" ) with expansion: "hello" <= "a" ------------------------------------------------------------------------------- ./succeeding/conditions/int literals ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( i == 1 ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( ui == 2 ) with expansion: 2 == 2 ConditionTests.cpp: PASSED: REQUIRE( l == 3 ) with expansion: 3 == 3 ConditionTests.cpp: PASSED: REQUIRE( ul == 4 ) with expansion: 4 == 4 ConditionTests.cpp: PASSED: REQUIRE( c == 5 ) with expansion: 5 == 5 ConditionTests.cpp: PASSED: REQUIRE( uc == 6 ) with expansion: 6 == 6 ConditionTests.cpp: PASSED: REQUIRE( 1 == i ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( 2 == ui ) with expansion: 2 == 2 ConditionTests.cpp: PASSED: REQUIRE( 3 == l ) with expansion: 3 == 3 ConditionTests.cpp: PASSED: REQUIRE( 4 == ul ) with expansion: 4 == 4 ConditionTests.cpp: PASSED: REQUIRE( 5 == c ) with expansion: 5 == 5 ConditionTests.cpp: PASSED: REQUIRE( 6 == uc ) with expansion: 6 == 6 ConditionTests.cpp: PASSED: REQUIRE( (std::numeric_limits::max)() > ul ) with expansion: 0x > 4 ------------------------------------------------------------------------------- ./succeeding/conditions//long_to_unsigned_x ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( long_var == unsigned_char_var ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( long_var == unsigned_short_var ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( long_var == unsigned_int_var ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( long_var == unsigned_long_var ) with expansion: 1 == 1 ------------------------------------------------------------------------------- ./succeeding/conditions/const ints to int literal ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( unsigned_char_var == 1 ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( unsigned_short_var == 1 ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( unsigned_int_var == 1 ) with expansion: 1 == 1 ConditionTests.cpp: PASSED: REQUIRE( unsigned_long_var == 1 ) with expansion: 1 == 1 ------------------------------------------------------------------------------- ./succeeding/conditions/negative ints ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: CHECK( ( -1 > 2u ) ) with expansion: true ConditionTests.cpp: PASSED: CHECK( -1 > 2u ) with expansion: -1 > 2 ConditionTests.cpp: PASSED: CHECK( ( 2u < -1 ) ) with expansion: true ConditionTests.cpp: PASSED: CHECK( 2u < -1 ) with expansion: 2 < -1 ConditionTests.cpp: PASSED: CHECK( ( minInt > 2u ) ) with expansion: true ConditionTests.cpp: PASSED: CHECK( minInt > 2u ) with expansion: -2147483648 > 2 ------------------------------------------------------------------------------- ./succeeding/conditions/computed ints ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: CHECK( 54 == 6*9 ) with expansion: 54 == 54 ------------------------------------------------------------------------------- ./succeeding/conditions/ptr ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( p == __null ) with expansion: __null == 0 ConditionTests.cpp: PASSED: REQUIRE( p == pNULL ) with expansion: __null == __null ConditionTests.cpp: PASSED: REQUIRE( p != __null ) with expansion: 0x != 0 ConditionTests.cpp: PASSED: REQUIRE( cp != __null ) with expansion: 0x != 0 ConditionTests.cpp: PASSED: REQUIRE( cpc != __null ) with expansion: 0x != 0 ConditionTests.cpp: PASSED: REQUIRE( returnsNull() == __null ) with expansion: {null string} == 0 ConditionTests.cpp: PASSED: REQUIRE( returnsConstNull() == __null ) with expansion: {null string} == 0 ConditionTests.cpp: PASSED: REQUIRE( __null != p ) with expansion: 0 != 0x ------------------------------------------------------------------------------- ./succeeding/conditions/not ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: PASSED: REQUIRE( false == false ) ConditionTests.cpp: PASSED: REQUIRE( true == true ) ConditionTests.cpp: PASSED: REQUIRE( !false ) with expansion: true ConditionTests.cpp: PASSED: REQUIRE_FALSE( false ) ConditionTests.cpp: PASSED: REQUIRE( !falseValue ) with expansion: true ConditionTests.cpp: PASSED: REQUIRE_FALSE( falseValue ) with expansion: !false ConditionTests.cpp: PASSED: REQUIRE( !(1 == 2) ) with expansion: true ConditionTests.cpp: PASSED: REQUIRE_FALSE( 1 == 2 ) with expansion: !(1 == 2) ------------------------------------------------------------------------------- ./failing/conditions/not ------------------------------------------------------------------------------- ConditionTests.cpp ............................................................................... ConditionTests.cpp: FAILED: CHECK( false != false ) ConditionTests.cpp: FAILED: CHECK( true != true ) ConditionTests.cpp: FAILED: CHECK( !true ) with expansion: false ConditionTests.cpp: FAILED: CHECK_FALSE( true ) ConditionTests.cpp: FAILED: CHECK( !trueValue ) with expansion: false ConditionTests.cpp: FAILED: CHECK_FALSE( trueValue ) with expansion: !true ConditionTests.cpp: FAILED: CHECK( !(1 == 1) ) with expansion: false ConditionTests.cpp: FAILED: CHECK_FALSE( 1 == 1 ) with expansion: !(1 == 1) ------------------------------------------------------------------------------- ./succeeding/exceptions/explicit ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: PASSED: REQUIRE_THROWS_AS( thisThrows() ) ExceptionTests.cpp: PASSED: REQUIRE_NOTHROW( thisDoesntThrow() ) ExceptionTests.cpp: PASSED: REQUIRE_THROWS( thisThrows() ) ------------------------------------------------------------------------------- ./failing/exceptions/explicit ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: CHECK_THROWS_AS( thisThrows() ) due to unexpected exception with message: expected exception ExceptionTests.cpp: FAILED: CHECK_THROWS_AS( thisDoesntThrow() ) because no exception was thrown where one was expected: ExceptionTests.cpp: FAILED: CHECK_NOTHROW( thisThrows() ) due to unexpected exception with message: expected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: unexpected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit/2 ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: PASSED: CHECK( 1 == 1 ) ExceptionTests.cpp: FAILED: {Unknown expression after the reported line} due to unexpected exception with message: unexpected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit/3 section name ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: unexpected exception ------------------------------------------------------------------------------- ./failing/exceptions/implicit/4 ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: CHECK( thisThrows() == 0 ) due to unexpected exception with message: expected exception ------------------------------------------------------------------------------- ./succeeding/exceptions/implicit ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... No assertions in test case './succeeding/exceptions/implicit' ------------------------------------------------------------------------------- ./failing/exceptions/custom ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: custom exception ------------------------------------------------------------------------------- ./failing/exceptions/custom/nothrow ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: REQUIRE_NOTHROW( throwCustom() ) due to unexpected exception with message: custom exception - not std ------------------------------------------------------------------------------- ./failing/exceptions/custom/throw ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: REQUIRE_THROWS_AS( throwCustom() ) due to unexpected exception with message: custom exception - not std ------------------------------------------------------------------------------- ./failing/exceptions/custom/double ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: FAILED: due to unexpected exception with message: 3.14 ------------------------------------------------------------------------------- ./succeeding/exceptions/notimplemented ------------------------------------------------------------------------------- ExceptionTests.cpp ............................................................................... ExceptionTests.cpp: PASSED: REQUIRE_THROWS( thisFunctionNotImplemented( 7 ) ) ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 200 == 200 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 202 == 202 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 204 == 204 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 206 == 206 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 208 == 208 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 210 == 210 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 212 == 212 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 2 == 2 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 4 == 4 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 6 == 6 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 8 == 8 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 10 == 10 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 30 == 30 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 40 == 40 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 42 == 42 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/1 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( i, 2 ) == i*2 ) with expansion: 72 == 72 GeneratorTests.cpp: PASSED: CATCH_REQUIRE( multiply( j, 2 ) == j*2 ) with expansion: 214 == 214 ------------------------------------------------------------------------------- ./succeeding/generators/2 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( i->first == i->second-1 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- ./succeeding/generators/2 ------------------------------------------------------------------------------- GeneratorTests.cpp ............................................................................... GeneratorTests.cpp: PASSED: CATCH_REQUIRE( i->first == i->second-1 ) with expansion: 2 == 2 ------------------------------------------------------------------------------- ./succeeding/message ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: warning: this is a message this is a warning No assertions in test case './succeeding/message' ------------------------------------------------------------------------------- ./succeeding/succeed ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: PASSED: with message: this is a success ------------------------------------------------------------------------------- ./failing/message/info/1 ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: REQUIRE( a == 1 ) with expansion: 2 == 1 with messages: this message should be logged so should this ------------------------------------------------------------------------------- ./mixed/message/info/2 ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: PASSED: CHECK( a == 2 ) with expansion: 2 == 2 with message: this message may be logged later MessageTests.cpp: FAILED: CHECK( a == 1 ) with expansion: 2 == 1 with message: this message should be logged MessageTests.cpp: FAILED: CHECK( a == 0 ) with expansion: 2 == 0 with message: and this, but later MessageTests.cpp: PASSED: CHECK( a == 2 ) with expansion: 2 == 2 with message: but not this ------------------------------------------------------------------------------- ./failing/message/fail ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: This is a failure ------------------------------------------------------------------------------- ./failing/message/sections one ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: Message from section one ------------------------------------------------------------------------------- ./failing/message/sections two ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: Message from section two Message from section one ------------------------------------------------------------------------------- ./succeeding/message/sections/stdout one ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... No assertions in section 'one' Message from section two ------------------------------------------------------------------------------- ./succeeding/message/sections/stdout two ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... No assertions in section 'two' ------------------------------------------------------------------------------- ./mixed/message/scoped ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 0 < 10 with messages: current counter 0 i := 0 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 1 < 10 with messages: current counter 1 i := 1 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 2 < 10 with messages: current counter 2 i := 2 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 3 < 10 with messages: current counter 3 i := 3 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 4 < 10 with messages: current counter 4 i := 4 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 5 < 10 with messages: current counter 5 i := 5 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 6 < 10 with messages: current counter 6 i := 6 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 7 < 10 with messages: current counter 7 i := 7 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 8 < 10 with messages: current counter 8 i := 8 MessageTests.cpp: PASSED: REQUIRE( i < 10 ) with expansion: 9 < 10 with messages: current counter 9 i := 9 MessageTests.cpp: FAILED: REQUIRE( i < 10 ) with expansion: 10 < 10 with messages: current counter 10 i := 10 ------------------------------------------------------------------------------- ./succeeding/nofail ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED - but was ok: CHECK_NOFAIL( 1 == 2 ) No assertions in test case './succeeding/nofail' ------------------------------------------------------------------------------- just info ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... No assertions in test case 'just info' ------------------------------------------------------------------------------- just failure ------------------------------------------------------------------------------- MessageTests.cpp ............................................................................... MessageTests.cpp: FAILED: explicitly with message: Previous info should not be seen ------------------------------------------------------------------------------- ./succeeding/Misc/Sections s1 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( a != b ) with expansion: 1 != 2 MiscTests.cpp: PASSED: REQUIRE( b != a ) with expansion: 2 != 1 ------------------------------------------------------------------------------- ./succeeding/Misc/Sections s2 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( a != b ) with expansion: 1 != 2 ------------------------------------------------------------------------------- ./succeeding/Misc/Sections/nested s1 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( a != b ) with expansion: 1 != 2 MiscTests.cpp: PASSED: REQUIRE( b != a ) with expansion: 2 != 1 ------------------------------------------------------------------------------- ./succeeding/Misc/Sections/nested s1 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( a != b ) with expansion: 1 != 2 MiscTests.cpp: PASSED: REQUIRE( b != a ) with expansion: 2 != 1 ------------------------------------------------------------------------------- ./succeeding/Misc/Sections/nested s1 s2 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( a != b ) with expansion: 1 != 2 ------------------------------------------------------------------------------- ./mixed/Misc/Sections/nested2 s1 s2 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: REQUIRE( a == b ) with expansion: 1 == 2 ------------------------------------------------------------------------------- ./mixed/Misc/Sections/nested2 s1 s3 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( a != b ) with expansion: 1 != 2 ------------------------------------------------------------------------------- ./mixed/Misc/Sections/nested2 s1 s4 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( a < b ) with expansion: 1 < 2 ------------------------------------------------------------------------------- ./Sections/nested/a/b c d (leaf) ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in section 'd (leaf)' ------------------------------------------------------------------------------- ./Sections/nested/a/b c e (leaf) ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in section 'e (leaf)' ------------------------------------------------------------------------------- ./Sections/nested/a/b f (leaf) ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in section 'f (leaf)' ------------------------------------------------------------------------------- ./mixed/Misc/Sections/loops s1 ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK( b > a ) with expansion: 0 > 1 ------------------------------------------------------------------------------- ./mixed/Misc/loops ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[0] (1) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[1] (1) is even MiscTests.cpp: PASSED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 0 == 0 with message: Testing if fib[2] (2) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[3] (3) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[4] (5) is even MiscTests.cpp: PASSED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 0 == 0 with message: Testing if fib[5] (8) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[6] (13) is even MiscTests.cpp: FAILED: CHECK( ( fib[i] % 2 ) == 0 ) with expansion: 1 == 0 with message: Testing if fib[7] (21) is even Some information An error ------------------------------------------------------------------------------- ./succeeding/Misc/stdout,stderr ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in test case './succeeding/Misc/stdout,stderr' ------------------------------------------------------------------------------- ./succeeding/Misc/null strings ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( makeString( false ) != static_cast(__null) ) with expansion: "valid string" != {null string} MiscTests.cpp: PASSED: REQUIRE( makeString( true ) == static_cast(__null) ) with expansion: {null string} == {null string} ------------------------------------------------------------------------------- ./failing/info ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: REQUIRE( false ) with messages: hi i := 7 ------------------------------------------------------------------------------- ./succeeding/checkedif ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: CHECKED_IF( flag ) with expansion: true MiscTests.cpp: PASSED: REQUIRE( testCheckedIf( true ) ) with expansion: true ------------------------------------------------------------------------------- ./failing/checkedif ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECKED_IF( flag ) with expansion: false MiscTests.cpp: FAILED: REQUIRE( testCheckedIf( false ) ) with expansion: false ------------------------------------------------------------------------------- ./succeeding/checkedelse ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: CHECKED_ELSE( flag ) with expansion: true MiscTests.cpp: PASSED: REQUIRE( testCheckedElse( true ) ) with expansion: true ------------------------------------------------------------------------------- ./failing/checkedelse ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECKED_ELSE( flag ) with expansion: false MiscTests.cpp: FAILED: REQUIRE( testCheckedElse( false ) ) with expansion: false ------------------------------------------------------------------------------- ./misc/xmlentitycheck embedded xml ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in section 'embedded xml' ------------------------------------------------------------------------------- ./misc/xmlentitycheck encoded chars ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in section 'encoded chars' ------------------------------------------------------------------------------- ./manual/onechar ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: REQUIRE( false ) with message: 3 ------------------------------------------------------------------------------- ./succeeding/atomic if ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( x == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- ./succeeding/matchers ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE_THAT( testStringForMatching() Contains( "string" ) ) with expansion: "this string contains 'abc' as a substring" contains: "string" MiscTests.cpp: PASSED: CHECK_THAT( testStringForMatching() Contains( "abc" ) ) with expansion: "this string contains 'abc' as a substring" contains: "abc" MiscTests.cpp: PASSED: CHECK_THAT( testStringForMatching() StartsWith( "this" ) ) with expansion: "this string contains 'abc' as a substring" starts with: "this" MiscTests.cpp: PASSED: CHECK_THAT( testStringForMatching() EndsWith( "substring" ) ) with expansion: "this string contains 'abc' as a substring" ends with: "substring" ------------------------------------------------------------------------------- ./failing/matchers/Contains ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() Contains( "not there" ) ) with expansion: "this string contains 'abc' as a substring" contains: "not there" ------------------------------------------------------------------------------- ./failing/matchers/StartsWith ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() StartsWith( "string" ) ) with expansion: "this string contains 'abc' as a substring" starts with: "string" ------------------------------------------------------------------------------- ./failing/matchers/EndsWith ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() EndsWith( "this" ) ) with expansion: "this string contains 'abc' as a substring" ends with: "this" ------------------------------------------------------------------------------- ./failing/matchers/Equals ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: CHECK_THAT( testStringForMatching() Equals( "something else" ) ) with expansion: "this string contains 'abc' as a substring" equals: "something else" ------------------------------------------------------------------------------- string ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE_THAT( "" Equals(__null) ) with expansion: "" equals: "" ------------------------------------------------------------------------------- ./succeeding/matchers/AllOf ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: CHECK_THAT( testStringForMatching() AllOf( Catch::Contains( "string" ), Catch::Contains( "abc" ) ) ) with expansion: "this string contains 'abc' as a substring" ( contains: "string" and contains: "abc" ) ------------------------------------------------------------------------------- ./succeeding/matchers/AnyOf ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: CHECK_THAT( testStringForMatching() AnyOf( Catch::Contains( "string" ), Catch::Contains( "not there" ) ) ) with expansion: "this string contains 'abc' as a substring" ( contains: "string" or contains: "not there" ) MiscTests.cpp: PASSED: CHECK_THAT( testStringForMatching() AnyOf( Catch::Contains( "not there" ), Catch::Contains( "string" ) ) ) with expansion: "this string contains 'abc' as a substring" ( contains: "not there" or contains: "string" ) ------------------------------------------------------------------------------- ./succeeding/matchers/Equals ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: CHECK_THAT( testStringForMatching() Equals( "this string contains 'abc' as a substring" ) ) with expansion: "this string contains 'abc' as a substring" equals: "this string contains 'abc' as a substring" ------------------------------------------------------------------------------- Factorials are computed ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( Factorial(0) == 1 ) with expansion: 1 == 1 MiscTests.cpp: PASSED: REQUIRE( Factorial(1) == 1 ) with expansion: 1 == 1 MiscTests.cpp: PASSED: REQUIRE( Factorial(2) == 2 ) with expansion: 2 == 2 MiscTests.cpp: PASSED: REQUIRE( Factorial(3) == 6 ) with expansion: 6 == 6 MiscTests.cpp: PASSED: REQUIRE( Factorial(10) == 3628800 ) with expansion: 0x == 3628800 ------------------------------------------------------------------------------- empty ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in test case 'empty' ------------------------------------------------------------------------------- Nice descriptive name ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: warning: This one ran No assertions in test case 'Nice descriptive name' ------------------------------------------------------------------------------- first tag ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in test case 'first tag' ------------------------------------------------------------------------------- second tag ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... No assertions in test case 'second tag' ------------------------------------------------------------------------------- vectors can be sized and resized ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized resizing bigger changes size and capacity ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 10 ) with expansion: 10 == 10 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 10 ) with expansion: 10 >= 10 ------------------------------------------------------------------------------- vectors can be sized and resized ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized resizing smaller changes size but not capacity ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized resizing smaller changes size but not capacity ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized resizing smaller changes size but not capacity We can use the 'swap trick' to reset the capacity ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.capacity() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- vectors can be sized and resized ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized reserving bigger changes capacity but not size ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 10 ) with expansion: 10 >= 10 ------------------------------------------------------------------------------- vectors can be sized and resized ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- vectors can be sized and resized reserving smaller does not change size or capacity ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 MiscTests.cpp: PASSED: REQUIRE( v.capacity() >= 5 ) with expansion: 5 >= 5 ------------------------------------------------------------------------------- ./failing/CatchSectionInfiniteLoop ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: explicitly with message: to infinity and beyond ------------------------------------------------------------------------------- ./failing/CatchSectionInfiniteLoop ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: explicitly with message: to infinity and beyond ------------------------------------------------------------------------------- ./failing/CatchSectionInfiniteLoop Outer Inner ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: PASSED: with message: that's not flying - that's failing in style ------------------------------------------------------------------------------- ./failing/CatchSectionInfiniteLoop ------------------------------------------------------------------------------- MiscTests.cpp ............................................................................... MiscTests.cpp: FAILED: explicitly with message: to infinity and beyond ------------------------------------------------------------------------------- selftest/main selftest/expected result selftest/expected result/failing tests ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected catch_self_test.hpp: PASSED: with message: Tests failed, as expected ------------------------------------------------------------------------------- selftest/main selftest/expected result selftest/expected result/succeeding tests ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected Message from section one Message from section two catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected Some information An error catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected catch_self_test.hpp: PASSED: with message: Tests passed, as expected Message from section one Message from section two Some information An error ------------------------------------------------------------------------------- selftest/main selftest/test counts selftest/test counts/succeeding tests ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( totals.assertions.passed == 298 ) with expansion: 298 == 298 TestMain.cpp: PASSED: CHECK( totals.assertions.failed == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- selftest/main selftest/test counts selftest/test counts/failing tests ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( totals.assertions.passed == 2 ) with expansion: 2 == 2 TestMain.cpp: PASSED: CHECK( totals.assertions.failed == 77 ) with expansion: 77 == 77 ------------------------------------------------------------------------------- meta/Misc/Sections ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( totals.assertions.passed == 2 ) with expansion: 2 == 2 TestMain.cpp: PASSED: CHECK( totals.assertions.failed == 1 ) with expansion: 1 == 1 ------------------------------------------------------------------------------- Process can be configured on command line default - no arguments ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: CHECK( config.shouldDebugBreak == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( config.abortAfter == -1 ) with expansion: -1 == -1 TestMain.cpp: PASSED: CHECK( config.noThrow == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( config.reporterName.empty() ) with expansion: true ------------------------------------------------------------------------------- Process can be configured on command line test lists 1 test ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( cfg.filters().size() == 1 ) with expansion: 1 == 1 TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false ) with expansion: false == false TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) ) with expansion: true ------------------------------------------------------------------------------- Process can be configured on command line test lists Specify one test case exclusion using exclude: ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( cfg.filters().size() == 1 ) with expansion: 1 == 1 TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false ) with expansion: false == false TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) ) with expansion: true ------------------------------------------------------------------------------- Process can be configured on command line test lists Specify one test case exclusion using ~ ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( cfg.filters().size() == 1 ) with expansion: 1 == 1 TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false ) with expansion: false == false TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) ) with expansion: true ------------------------------------------------------------------------------- Process can be configured on command line test lists Specify two test cases using -t ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( cfg.filters().size() == 1 ) with expansion: 1 == 1 TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false ) with expansion: false == false TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) ) with expansion: true TestMain.cpp: PASSED: REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test2" ) ) ) with expansion: true ------------------------------------------------------------------------------- Process can be configured on command line reporter -r/console ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.reporterName == "console" ) with expansion: "console" == "console" ------------------------------------------------------------------------------- Process can be configured on command line reporter -r/xml ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.reporterName == "xml" ) with expansion: "xml" == "xml" ------------------------------------------------------------------------------- Process can be configured on command line reporter --reporter/junit ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.reporterName == "junit" ) with expansion: "junit" == "junit" ------------------------------------------------------------------------------- Process can be configured on command line debugger -b ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.shouldDebugBreak == true ) with expansion: true == true ------------------------------------------------------------------------------- Process can be configured on command line debugger --break ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.shouldDebugBreak ) with expansion: true ------------------------------------------------------------------------------- Process can be configured on command line abort -a aborts after first failure ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.abortAfter == 1 ) with expansion: 1 == 1 ------------------------------------------------------------------------------- Process can be configured on command line abort -x 2 aborts after two failures ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.abortAfter == 2 ) with expansion: 2 == 2 ------------------------------------------------------------------------------- Process can be configured on command line abort -x must be greater than zero ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ) Contains( "greater than zero" ) ) with expansion: "Value after -x or --abortAfter must be greater than zero - while parsing: (-x, --abortx )" contains: "greater than zero" ------------------------------------------------------------------------------- Process can be configured on command line abort -x must be numeric ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ) Contains( "-x" ) ) with expansion: "Unable to convert oops to destination type - while parsing: (-x, --abortx )" contains: "-x" ------------------------------------------------------------------------------- Process can be configured on command line nothrow -e ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.noThrow == true ) with expansion: true == true ------------------------------------------------------------------------------- Process can be configured on command line nothrow --nothrow ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.noThrow == true ) with expansion: true == true ------------------------------------------------------------------------------- Process can be configured on command line output filename -o filename ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.outputFilename == "filename.ext" ) with expansion: "filename.ext" == "filename.ext" ------------------------------------------------------------------------------- Process can be configured on command line output filename --out ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: REQUIRE( config.outputFilename == "filename.ext" ) with expansion: "filename.ext" == "filename.ext" ------------------------------------------------------------------------------- Process can be configured on command line combinations Single character flags can be combined ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK_NOTHROW( parseIntoConfig( argv, config ) ) TestMain.cpp: PASSED: CHECK( config.abortAfter == 1 ) with expansion: 1 == 1 TestMain.cpp: PASSED: CHECK( config.shouldDebugBreak ) with expansion: true TestMain.cpp: PASSED: CHECK( config.noThrow == true ) with expansion: true == true ------------------------------------------------------------------------------- selftest/test filter ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( matchAny.shouldInclude( fakeTestCase( "any" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( matchNone.shouldInclude( fakeTestCase( "any" ) ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( matchHidden.shouldInclude( fakeTestCase( "any" ) ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( matchNonHidden.shouldInclude( fakeTestCase( "any" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( matchHidden.shouldInclude( fakeTestCase( "./any" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( matchNonHidden.shouldInclude( fakeTestCase( "./any" ) ) == false ) with expansion: false == false ------------------------------------------------------------------------------- selftest/test filters ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( matchHidden.shouldInclude( fakeTestCase( "./something" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( filters.shouldInclude( fakeTestCase( "any" ) ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( filters.shouldInclude( fakeTestCase( "./something" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( filters.shouldInclude( fakeTestCase( "./anything" ) ) == false ) with expansion: false == false ------------------------------------------------------------------------------- selftest/filter/prefix wildcard ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( matchBadgers.shouldInclude( fakeTestCase( "big badger" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) == false ) with expansion: false == false ------------------------------------------------------------------------------- selftest/filter/wildcard at both ends ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( matchBadgers.shouldInclude( fakeTestCase( "big badger" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( matchBadgers.shouldInclude( fakeTestCase( "badgers are big" ) ) ) with expansion: true TestMain.cpp: PASSED: CHECK( matchBadgers.shouldInclude( fakeTestCase( "hedgehogs" ) ) == false ) with expansion: false == false ------------------------------------------------------------------------------- selftest/tags one tag ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( oneTag.getTestCaseInfo().description == "" ) with expansion: "" == "" TestMain.cpp: PASSED: CHECK( oneTag.hasTag( "one" ) ) with expansion: true TestMain.cpp: PASSED: CHECK( oneTag.getTags().size() == 1 ) with expansion: 1 == 1 TestMain.cpp: PASSED: CHECK( oneTag.matchesTags( p1 ) == true ) with expansion: true == true TestMain.cpp: PASSED: CHECK( oneTag.matchesTags( p2 ) == true ) with expansion: true == true TestMain.cpp: PASSED: CHECK( oneTag.matchesTags( p3 ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( oneTag.matchesTags( p4 ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( oneTag.matchesTags( p5 ) == false ) with expansion: false == false ------------------------------------------------------------------------------- selftest/tags two tags ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( twoTags.getTestCaseInfo().description == "" ) with expansion: "" == "" TestMain.cpp: PASSED: CHECK( twoTags.hasTag( "one" ) ) with expansion: true TestMain.cpp: PASSED: CHECK( twoTags.hasTag( "two" ) ) with expansion: true TestMain.cpp: PASSED: CHECK( twoTags.hasTag( "Two" ) ) with expansion: true TestMain.cpp: PASSED: CHECK( twoTags.hasTag( "three" ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( twoTags.getTags().size() == 2 ) with expansion: 2 == 2 TestMain.cpp: PASSED: CHECK( twoTags.matchesTags( p1 ) == true ) with expansion: true == true TestMain.cpp: PASSED: CHECK( twoTags.matchesTags( p2 ) == true ) with expansion: true == true TestMain.cpp: PASSED: CHECK( twoTags.matchesTags( p3 ) == true ) with expansion: true == true TestMain.cpp: PASSED: CHECK( twoTags.matchesTags( p4 ) == true ) with expansion: true == true TestMain.cpp: PASSED: CHECK( twoTags.matchesTags( p5 ) == true ) with expansion: true == true ------------------------------------------------------------------------------- selftest/tags one tag with characters either side ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( oneTagWithExtras.getTestCaseInfo().description == "1234" ) with expansion: "1234" == "1234" TestMain.cpp: PASSED: CHECK( oneTagWithExtras.hasTag( "one" ) ) with expansion: true TestMain.cpp: PASSED: CHECK( oneTagWithExtras.hasTag( "two" ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( oneTagWithExtras.getTags().size() == 1 ) with expansion: 1 == 1 ------------------------------------------------------------------------------- selftest/tags start of a tag, but not closed ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( oneTagOpen.getTestCaseInfo().description == "[one" ) with expansion: "[one" == "[one" TestMain.cpp: PASSED: CHECK( oneTagOpen.hasTag( "one" ) == false ) with expansion: false == false TestMain.cpp: PASSED: CHECK( oneTagOpen.getTags().size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- selftest/tags hidden ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( oneTag.getTestCaseInfo().description == "" ) with expansion: "" == "" TestMain.cpp: PASSED: CHECK( oneTag.hasTag( "." ) ) with expansion: true TestMain.cpp: PASSED: CHECK( oneTag.isHidden() ) with expansion: true TestMain.cpp: PASSED: CHECK( oneTag.matchesTags( "~[.]" ) == false ) with expansion: false == false ------------------------------------------------------------------------------- Long strings can be wrapped plain string No wrapping ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString ) with expansion: "one two three four" == "one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped plain string Wrapped once ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 17 ) ).toString() == "one two three\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 16 ) ).toString() == "one two three\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 14 ) ).toString() == "one two three\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 13 ) ).toString() == "one two three\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 12 ) ).toString() == "one two\nthree four" ) with expansion: "one two three four" == "one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped plain string Wrapped twice ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" ) with expansion: "one two three four" == "one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped plain string Wrapped three times ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 5 ) ).toString() == "one\ntwo\nthree\nfour" ) with expansion: "one two three four" == "one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped plain string Short wrap ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( "abcdef", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef" ) with expansion: "abc- def" == "abc- def" TestMain.cpp: PASSED: CHECK( Text( "abcdefg", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndefg" ) with expansion: "abc- defg" == "abc- defg" TestMain.cpp: PASSED: CHECK( Text( "abcdefgh", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef-\ngh" ) with expansion: "abc- def- gh" == "abc- def- gh" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 4 ) ).toString() == "one\ntwo\nthr-\nee\nfour" ) with expansion: "one two thr- ee four" == "one two thr- ee four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 3 ) ).toString() == "one\ntwo\nth-\nree\nfo-\nur" ) with expansion: "one two th- ree fo- ur" == "one two th- ree fo- ur" ------------------------------------------------------------------------------- Long strings can be wrapped plain string As container ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: REQUIRE( text.size() == 4 ) with expansion: 4 == 4 TestMain.cpp: PASSED: CHECK( text[0] == "one" ) with expansion: "one" == "one" TestMain.cpp: PASSED: CHECK( text[1] == "two" ) with expansion: "two" == "two" TestMain.cpp: PASSED: CHECK( text[2] == "three" ) with expansion: "three" == "three" TestMain.cpp: PASSED: CHECK( text[3] == "four" ) with expansion: "four" == "four" ------------------------------------------------------------------------------- Long strings can be wrapped plain string Indent first line differently ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( text.toString() == " one two\n three\n four" ) with expansion: " one two three four" == " one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped With newlines No wrapping ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 10 ) ).toString() == testString ) with expansion: "one two three four" == "one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped With newlines Trailing newline ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( "abcdef\n", TextAttributes().setWidth( 10 ) ).toString() == "abcdef\n" ) with expansion: "abcdef " == "abcdef " TestMain.cpp: PASSED: CHECK( Text( "abcdef", TextAttributes().setWidth( 6 ) ).toString() == "abcdef" ) with expansion: "abcdef" == "abcdef" TestMain.cpp: PASSED: CHECK( Text( "abcdef\n", TextAttributes().setWidth( 6 ) ).toString() == "abcdef\n" ) with expansion: "abcdef " == "abcdef " ------------------------------------------------------------------------------- Long strings can be wrapped With newlines Wrapped once ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" ) with expansion: "one two three four" == "one two three four" TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" ) with expansion: "one two three four" == "one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped With newlines Wrapped twice ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" ) with expansion: "one two three four" == "one two three four" ------------------------------------------------------------------------------- Long strings can be wrapped With tabs ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( testString, TextAttributes().setWidth( 15 ) ).toString() == "one two three\n four\n five\n six" ) with expansion: "one two three four five six" == "one two three four five six" hello hello ------------------------------------------------------------------------------- Strings can be rendered with colour ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... No assertions in test case 'Strings can be rendered with colour' ------------------------------------------------------------------------------- Text can be formatted using the Text class ------------------------------------------------------------------------------- TestMain.cpp ............................................................................... TestMain.cpp: PASSED: CHECK( Text( "hi there" ).toString() == "hi there" ) with expansion: "hi there" == "hi there" TestMain.cpp: PASSED: CHECK( Text( "hi there", narrow ).toString() == "hi\nthere" ) with expansion: "hi there" == "hi there" ------------------------------------------------------------------------------- ./succeeding/Tricky/std::pair ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( (std::pair( 1, 2 )) == aNicePair ) with expansion: std::pair( 1, 2 ) == std::pair( 1, 2 ) ------------------------------------------------------------------------------- ./inprogress/failing/Tricky/trailing expression ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: warning: Uncomment the code in this test to check that it gives a sensible compiler error No assertions in test case './inprogress/failing/Tricky/trailing expression' ------------------------------------------------------------------------------- ./inprogress/failing/Tricky/compound lhs ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: warning: Uncomment the code in this test to check that it gives a sensible compiler error No assertions in test case './inprogress/failing/Tricky/compound lhs' ------------------------------------------------------------------------------- ./failing/Tricky/non streamable type ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: FAILED: CHECK( &o1 == &o2 ) with expansion: 0x == 0x TrickyTests.cpp: FAILED: CHECK( o1 == o2 ) with expansion: {?} == {?} ------------------------------------------------------------------------------- ./failing/string literals ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: FAILED: REQUIRE( std::string( "first" ) == "second" ) with expansion: "first" == "second" ------------------------------------------------------------------------------- ./succeeding/side-effects ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( i++ == 7 ) with expansion: 7 == 7 TrickyTests.cpp: PASSED: REQUIRE( i++ == 8 ) with expansion: 8 == 8 ------------------------------------------------------------------------------- ./succeeding/koenig ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( 0x == o ) with expansion: 0x == {?} ------------------------------------------------------------------------------- ./succeeding/non-const== ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( t == 1u ) with expansion: {?} == 1 ------------------------------------------------------------------------------- ./succeeding/enum/bits ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( 0x == bit30and31 ) with expansion: 0x == 3221225472 ------------------------------------------------------------------------------- ./succeeding/boolean member ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( obj.prop != __null ) with expansion: 0x != 0 ------------------------------------------------------------------------------- ./succeeding/unimplemented static bool compare to true ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( is_true::value == true ) with expansion: true == true TrickyTests.cpp: PASSED: REQUIRE( true == is_true::value ) with expansion: true == true ------------------------------------------------------------------------------- ./succeeding/unimplemented static bool compare to false ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( is_true::value == false ) with expansion: false == false TrickyTests.cpp: PASSED: REQUIRE( false == is_true::value ) with expansion: false == false ------------------------------------------------------------------------------- ./succeeding/unimplemented static bool negation ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( !is_true::value ) with expansion: true ------------------------------------------------------------------------------- ./succeeding/unimplemented static bool double negation ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( !!is_true::value ) with expansion: true ------------------------------------------------------------------------------- ./succeeding/unimplemented static bool direct ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( is_true::value ) with expansion: true TrickyTests.cpp: PASSED: REQUIRE_FALSE( is_true::value ) with expansion: !false ------------------------------------------------------------------------------- ./succeeding/SafeBool ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: CHECK( True ) with expansion: true TrickyTests.cpp: PASSED: CHECK( !False ) with expansion: true TrickyTests.cpp: PASSED: CHECK_FALSE( False ) with expansion: !false ------------------------------------------------------------------------------- Assertions then sections ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections A section ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections A section ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections A section Another section ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections A section ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- Assertions then sections A section Another other section ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( Catch::isTrue( true ) ) with expansion: true ------------------------------------------------------------------------------- non streamable - with conv. op ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( s == "7" ) with expansion: "7" == "7" ------------------------------------------------------------------------------- Comparing function pointers ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( a ) with expansion: true TrickyTests.cpp: PASSED: REQUIRE( a == &foo ) with expansion: 1 == 1 ------------------------------------------------------------------------------- pointer to class ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: REQUIRE( p == 0 ) with expansion: __null == 0 ------------------------------------------------------------------------------- X/level/0/a ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: ------------------------------------------------------------------------------- X/level/0/b ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: ------------------------------------------------------------------------------- X/level/1/a ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: ------------------------------------------------------------------------------- X/level/1/b ------------------------------------------------------------------------------- TrickyTests.cpp ............................................................................... TrickyTests.cpp: PASSED: ------------------------------------------------------------------------------- Anonymous test case 1 ------------------------------------------------------------------------------- VariadicMacrosTests.cpp ............................................................................... VariadicMacrosTests.cpp: PASSED: with message: anonymous test case ------------------------------------------------------------------------------- Test case with one argument ------------------------------------------------------------------------------- VariadicMacrosTests.cpp ............................................................................... VariadicMacrosTests.cpp: PASSED: with message: no assertions ------------------------------------------------------------------------------- Variadic macros Section with one argument ------------------------------------------------------------------------------- VariadicMacrosTests.cpp ............................................................................... VariadicMacrosTests.cpp: PASSED: with message: no assertions ------------------------------------------------------------------------------- Scenario: Do that thing with the thing Given: This stuff exists When: I do this Then: it should do this ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( itDoesThis() ) with expansion: true ------------------------------------------------------------------------------- Scenario: Do that thing with the thing Given: This stuff exists When: I do this Then: it should do this ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( itDoesThis() ) with expansion: true ------------------------------------------------------------------------------- Scenario: Do that thing with the thing Given: This stuff exists When: I do this Then: it should do this And: do that ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( itDoesThat() ) with expansion: true ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector When: it is made larger Then: the size and capacity go up ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 10 ) with expansion: 10 == 10 BDDTests.cpp: PASSED: REQUIRE( v.capacity() >= 10 ) with expansion: 10 >= 10 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector When: it is made larger Then: the size and capacity go up ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 10 ) with expansion: 10 == 10 BDDTests.cpp: PASSED: REQUIRE( v.capacity() >= 10 ) with expansion: 10 >= 10 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector When: it is made larger Then: the size and capacity go up ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 10 ) with expansion: 10 == 10 BDDTests.cpp: PASSED: REQUIRE( v.capacity() >= 10 ) with expansion: 10 >= 10 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector When: it is made larger Then: the size and capacity go up And when: it is made smaller again Then: the size goes down but the capacity stays the same ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 5 ) with expansion: 5 == 5 BDDTests.cpp: PASSED: REQUIRE( v.capacity() >= 10 ) with expansion: 10 >= 10 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: Vector resizing affects size and capacity Given: an empty vector When: we reserve more space Then: The capacity is increased but the size remains the same ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: REQUIRE( v.capacity() >= 10 ) with expansion: 10 >= 10 BDDTests.cpp: PASSED: REQUIRE( v.size() == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- Scenario: This is a really long scenario name to see how the list command deals with wrapping Given: A section name that is so long that it cannot fit in a single console width When: The test headers are printed as part of the normal running of the scenario Then: The, deliberately very long and overly verbose (you see what I did there?) section names must wrap, along with an indent ------------------------------------------------------------------------------- BDDTests.cpp ............................................................................... BDDTests.cpp: PASSED: with message: boo! ------------------------------------------------------------------------------- cmdline process name ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK( config.processName == "test" ) with expansion: "test" == "test" ------------------------------------------------------------------------------- cmdline arg separated by spaces ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK( config.fileName == "filename.ext" ) with expansion: "filename.ext" == "filename.ext" ------------------------------------------------------------------------------- cmdline arg separated by colon ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK( config.fileName == "filename.ext" ) with expansion: "filename.ext" == "filename.ext" ------------------------------------------------------------------------------- cmdline arg separated by = ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK( config.fileName == "filename.ext" ) with expansion: "filename.ext" == "filename.ext" ------------------------------------------------------------------------------- cmdline long opt ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK( config.fileName == "%stdout" ) with expansion: "%stdout" == "%stdout" ------------------------------------------------------------------------------- cmdline a number ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK( config.number == 42 ) with expansion: 42 == 42 ------------------------------------------------------------------------------- cmdline not a number ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK_THROWS( parseInto( cli, argv, config ) ) CmdLineTests.cpp: PASSED: CHECK( config.number == 0 ) with expansion: 0 == 0 ------------------------------------------------------------------------------- cmdline two parsers ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: CHECK( config1.number == 42 ) with expansion: 42 == 42 CmdLineTests.cpp: PASSED: REQUIRE_FALSE( unusedTokens.empty() ) with expansion: !false CmdLineTests.cpp: PASSED: CHECK( config2.description == "some text" ) with expansion: "some text" == "some text" ------------------------------------------------------------------------------- cmdline methods in range ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: REQUIRE( config.index == 3 ) with expansion: 3 == 3 ------------------------------------------------------------------------------- cmdline methods out of range ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: REQUIRE_THROWS( parseInto( cli, argv, config ) ) ------------------------------------------------------------------------------- cmdline flags set ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: REQUIRE( config.flag ) with expansion: true ------------------------------------------------------------------------------- cmdline flags not set ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: REQUIRE( config.flag == false ) with expansion: false == false ------------------------------------------------------------------------------- cmdline positional ------------------------------------------------------------------------------- CmdLineTests.cpp ............................................................................... CmdLineTests.cpp: PASSED: REQUIRE( config.firstPos == "1st" ) with expansion: "1st" == "1st" CmdLineTests.cpp: PASSED: REQUIRE( config.secondPos == "2nd" ) with expansion: "2nd" == "2nd" CmdLineTests.cpp: PASSED: REQUIRE( config.unpositional == "3rd" ) with expansion: "3rd" == "3rd" ------------------------------------------------------------------------------- section tracking ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false ------------------------------------------------------------------------------- section tracking ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false ------------------------------------------------------------------------------- section tracking test case with no sections ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.isCompleted() ) with expansion: true ------------------------------------------------------------------------------- section tracking ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false ------------------------------------------------------------------------------- section tracking test case with one section ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.enterSection( section1Name ) ) with expansion: true SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.isCompleted() ) with expansion: true ------------------------------------------------------------------------------- section tracking ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false ------------------------------------------------------------------------------- section tracking test case with two consecutive sections ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.enterSection( section1Name ) ) with expansion: true SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.enterSection( section2Name ) ) with expansion: true SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.isCompleted() ) with expansion: true ------------------------------------------------------------------------------- section tracking ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false ------------------------------------------------------------------------------- section tracking test case with one section within another ------------------------------------------------------------------------------- SectionTrackerTests.cpp ............................................................................... SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.enterSection( section1Name ) ) with expansion: true SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK_FALSE( testCaseTracker.isCompleted() ) with expansion: !false SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.enterSection( section1Name ) ) with expansion: true SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.enterSection( section2Name ) ) with expansion: true SectionTrackerTests.cpp: PASSED: CHECK( testCaseTracker.isCompleted() ) with expansion: true =============================================================================== 121 test cases - 50 failed (756 assertions - 109 failed) No test cases matched '~dummy 4' No tests ran ClassTests.cpp ClassTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp ConditionTests.cpp expected exception ExceptionTests.cpp ExceptionTests.cpp expected exception ExceptionTests.cpp unexpected exception ExceptionTests.cpp unexpected exception ExceptionTests.cpp unexpected exception ExceptionTests.cpp expected exception ExceptionTests.cpp custom exception ExceptionTests.cpp custom exception - not std ExceptionTests.cpp custom exception - not std ExceptionTests.cpp 3.14 ExceptionTests.cpp this message should be logged so should this MessageTests.cpp this message should be logged MessageTests.cpp and this, but later MessageTests.cpp This is a failure MessageTests.cpp Message from section one MessageTests.cpp Message from section two MessageTests.cpp Message from section one Message from section two current counter 10 i := 10 MessageTests.cpp Previous info should not be seen MessageTests.cpp MiscTests.cpp MiscTests.cpp Testing if fib[0] (1) is even MiscTests.cpp Testing if fib[1] (1) is even MiscTests.cpp Testing if fib[3] (3) is even MiscTests.cpp Testing if fib[4] (5) is even MiscTests.cpp Testing if fib[6] (13) is even MiscTests.cpp Testing if fib[7] (21) is even MiscTests.cpp Some information An error hi i := 7 MiscTests.cpp MiscTests.cpp MiscTests.cpp MiscTests.cpp MiscTests.cpp 3 MiscTests.cpp MiscTests.cpp MiscTests.cpp MiscTests.cpp MiscTests.cpp to infinity and beyond MiscTests.cpp to infinity and beyond MiscTests.cpp to infinity and beyond MiscTests.cpp Message from section one Message from section two Some information Message from section one Message from section two Some information An error An error hello hello TrickyTests.cpp TrickyTests.cpp TrickyTests.cpp Message from section one Message from section two Some information Message from section one Message from section two Some information Message from section one Message from section two Some information hello hello An error An error An error d == Approx( 1.23 ) 1.23 == Approx( 1.23 ) d != Approx( 1.22 ) 1.23 != Approx( 1.22 ) d != Approx( 1.24 ) 1.23 != Approx( 1.24 ) Approx( d ) == 1.23 Approx( 1.23 ) == 1.23 Approx( d ) != 1.22 Approx( 1.23 ) != 1.22 Approx( d ) != 1.24 Approx( 1.23 ) != 1.24 d != Approx( 1.231 ) 1.23 != Approx( 1.231 ) d == Approx( 1.231 ).epsilon( 0.1 ) 1.23 == Approx( 1.231 ) 1.23f == Approx( 1.23f ) 1.23 == Approx( 1.23 ) 0.0f == Approx( 0.0f ) 0 == Approx( 0 ) 1 == Approx( 1 ) 1 == Approx( 1 ) 0 == Approx( 0 ) 0 == Approx( 0 ) 1.0f == Approx( 1 ) 1 == Approx( 1 ) 0 == Approx( dZero) 0 == Approx( 0 ) 0 == Approx( dSmall ).epsilon( 0.001 ) 0 == Approx( 1e-05 ) 1.234f == Approx( dMedium ) 1.234 == Approx( 1.234 ) dMedium == Approx( 1.234f ) 1.234 == Approx( 1.234 ) d == approx( 1.23 ) 1.23 == Approx( 1.23 ) d == approx( 1.22 ) 1.23 == Approx( 1.22 ) d == approx( 1.24 ) 1.23 == Approx( 1.24 ) d != approx( 1.25 ) 1.23 != Approx( 1.25 ) approx( d ) == 1.23 Approx( 1.23 ) == 1.23 approx( d ) == 1.22 Approx( 1.23 ) == 1.22 approx( d ) == 1.24 Approx( 1.23 ) == 1.24 approx( d ) != 1.25 Approx( 1.23 ) != 1.25 divide( 22, 7 ) == Approx( 3.141 ).epsilon( 0.001 ) 3.1428571429 == Approx( 3.141 ) divide( 22, 7 ) != Approx( 3.141 ).epsilon( 0.0001 ) 3.1428571429 != Approx( 3.141 ) s == "hello" "hello" == "hello" s == "world" "hello" == "world" m_a == 1 1 == 1 m_a == 2 1 == 2 data.int_seven == 7 7 == 7 data.float_nine_point_one == Approx( 9.1f ) 9.1 == Approx( 9.1 ) data.double_pi == Approx( 3.1415926535 ) 3.1415926535 == Approx( 3.14159 ) data.str_hello == "hello" "hello" == "hello" "hello" == data.str_hello "hello" == "hello" data.str_hello.size() == 5 5 == 5 x == Approx( 1.3 ) 1.3 == Approx( 1.3 ) data.int_seven == 6 7 == 6 data.int_seven == 8 7 == 8 data.int_seven == 0 7 == 0 data.float_nine_point_one == Approx( 9.11f ) 9.1 == Approx( 9.11 ) data.float_nine_point_one == Approx( 9.0f ) 9.1 == Approx( 9 ) data.float_nine_point_one == Approx( 1 ) 9.1 == Approx( 1 ) data.float_nine_point_one == Approx( 0 ) 9.1 == Approx( 0 ) data.double_pi == Approx( 3.1415 ) 3.1415926535 == Approx( 3.1415 ) data.str_hello == "goodbye" "hello" == "goodbye" data.str_hello == "hell" "hello" == "hell" data.str_hello == "hello1" "hello" == "hello1" data.str_hello.size() == 6 5 == 6 x == Approx( 1.301 ) 1.3 == Approx( 1.301 ) data.int_seven != 6 7 != 6 data.int_seven != 8 7 != 8 data.float_nine_point_one != Approx( 9.11f ) 9.1 != Approx( 9.11 ) data.float_nine_point_one != Approx( 9.0f ) 9.1 != Approx( 9 ) data.float_nine_point_one != Approx( 1 ) 9.1 != Approx( 1 ) data.float_nine_point_one != Approx( 0 ) 9.1 != Approx( 0 ) data.double_pi != Approx( 3.1415 ) 3.1415926535 != Approx( 3.1415 ) data.str_hello != "goodbye" "hello" != "goodbye" data.str_hello != "hell" "hello" != "hell" data.str_hello != "hello1" "hello" != "hello1" data.str_hello.size() != 6 5 != 6 data.int_seven != 7 7 != 7 data.float_nine_point_one != Approx( 9.1f ) 9.1 != Approx( 9.1 ) data.double_pi != Approx( 3.1415926535 ) 3.1415926535 != Approx( 3.14159 ) data.str_hello != "hello" "hello" != "hello" data.str_hello.size() != 5 5 != 5 data.int_seven < 8 7 < 8 data.int_seven > 6 7 > 6 data.int_seven > 0 7 > 0 data.int_seven > -1 7 > -1 data.int_seven >= 7 7 >= 7 data.int_seven >= 6 7 >= 6 data.int_seven <= 7 7 <= 7 data.int_seven <= 8 7 <= 8 data.float_nine_point_one > 9 9.1 > 9 data.float_nine_point_one < 10 9.1 < 10 data.float_nine_point_one < 9.2 9.1 < 9.2 data.str_hello <= "hello" "hello" <= "hello" data.str_hello >= "hello" "hello" >= "hello" data.str_hello < "hellp" "hello" < "hellp" data.str_hello < "zebra" "hello" < "zebra" data.str_hello > "hellm" "hello" > "hellm" data.str_hello > "a" "hello" > "a" data.int_seven > 7 7 > 7 data.int_seven < 7 7 < 7 data.int_seven > 8 7 > 8 data.int_seven < 6 7 < 6 data.int_seven < 0 7 < 0 data.int_seven < -1 7 < -1 data.int_seven >= 8 7 >= 8 data.int_seven <= 6 7 <= 6 data.float_nine_point_one < 9 9.1 < 9 data.float_nine_point_one > 10 9.1 > 10 data.float_nine_point_one > 9.2 9.1 > 9.2 data.str_hello > "hello" "hello" > "hello" data.str_hello < "hello" "hello" < "hello" data.str_hello > "hellp" "hello" > "hellp" data.str_hello > "z" "hello" > "z" data.str_hello < "hellm" "hello" < "hellm" data.str_hello < "a" "hello" < "a" data.str_hello >= "z" "hello" >= "z" data.str_hello <= "a" "hello" <= "a" i == 1 1 == 1 ui == 2 2 == 2 l == 3 3 == 3 ul == 4 4 == 4 c == 5 5 == 5 uc == 6 6 == 6 1 == i 1 == 1 2 == ui 2 == 2 3 == l 3 == 3 4 == ul 4 == 4 5 == c 5 == 5 6 == uc 6 == 6 (std::numeric_limits<unsigned long>::max)() > ul 0x > 4 long_var == unsigned_char_var 1 == 1 long_var == unsigned_short_var 1 == 1 long_var == unsigned_int_var 1 == 1 long_var == unsigned_long_var 1 == 1 unsigned_char_var == 1 1 == 1 unsigned_short_var == 1 1 == 1 unsigned_int_var == 1 1 == 1 unsigned_long_var == 1 1 == 1 ( -1 > 2u ) true -1 > 2u -1 > 2 ( 2u < -1 ) true 2u < -1 2 < -1 ( minInt > 2u ) true minInt > 2u -2147483648 > 2 54 == 6*9 54 == 54 p == __null __null == 0 p == pNULL __null == __null p != __null 0x != 0 cp != __null 0x != 0 cpc != __null 0x != 0 returnsNull() == __null {null string} == 0 returnsConstNull() == __null {null string} == 0 __null != p 0 != 0x false == false false == false true == true true == true !false true !false !false !falseValue true !falseValue !false !(1 == 2) true !1 == 2 !(1 == 2) false != false false != false true != true true != true !true false !true !true !trueValue false !trueValue !true !(1 == 1) false !1 == 1 !(1 == 1) thisThrows() thisThrows() thisDoesntThrow() thisDoesntThrow() thisThrows() thisThrows() thisThrows() thisThrows() expected exception thisDoesntThrow() thisDoesntThrow() thisThrows() thisThrows() expected exception unexpected exception 1 == 1 1 == 1 {Unknown expression after the reported line} {Unknown expression after the reported line} unexpected exception
unexpected exception
thisThrows() == 0 thisThrows() == 0 expected exception custom exception throwCustom() throwCustom() custom exception - not std throwCustom() throwCustom() custom exception - not std 3.14 thisFunctionNotImplemented( 7 ) thisFunctionNotImplemented( 7 ) multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 200 == 200 multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 202 == 202 multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 204 == 204 multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 206 == 206 multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 208 == 208 multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 210 == 210 multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 212 == 212 multiply( i, 2 ) == i*2 2 == 2 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 4 == 4 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 6 == 6 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 8 == 8 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 10 == 10 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 30 == 30 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 40 == 40 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 42 == 42 multiply( j, 2 ) == j*2 214 == 214 multiply( i, 2 ) == i*2 72 == 72 multiply( j, 2 ) == j*2 214 == 214 i->first == i->second-1 0 == 0 i->first == i->second-1 2 == 2 this is a message this is a warning this message should be logged so should this a == 1 2 == 1 a == 2 2 == 2 this message should be logged a == 1 2 == 1 and this, but later a == 0 2 == 0 a == 2 2 == 2 This is a failure
Message from section one
Message from section two
i < 10 0 < 10 i < 10 1 < 10 i < 10 2 < 10 i < 10 3 < 10 i < 10 4 < 10 i < 10 5 < 10 i < 10 6 < 10 i < 10 7 < 10 i < 10 8 < 10 i < 10 9 < 10 current counter 10 i := 10 i < 10 10 < 10 1 == 2 1 == 2 Previous info should not be seen
a != b 1 != 2 b != a 2 != 1
a != b 1 != 2
a != b 1 != 2 b != a 2 != 1
a != b 1 != 2 b != a 2 != 1
a != b 1 != 2
a == b 1 == 2
a != b 1 != 2
a < b 1 < 2
b > a 0 > 1
Testing if fib[0] (1) is even ( fib[i] % 2 ) == 0 1 == 0 Testing if fib[1] (1) is even ( fib[i] % 2 ) == 0 1 == 0 ( fib[i] % 2 ) == 0 0 == 0 Testing if fib[3] (3) is even ( fib[i] % 2 ) == 0 1 == 0 Testing if fib[4] (5) is even ( fib[i] % 2 ) == 0 1 == 0 ( fib[i] % 2 ) == 0 0 == 0 Testing if fib[6] (13) is even ( fib[i] % 2 ) == 0 1 == 0 Testing if fib[7] (21) is even ( fib[i] % 2 ) == 0 1 == 0 makeString( false ) != static_cast<char*>(__null) "valid string" != {null string} makeString( true ) == static_cast<char*>(__null) {null string} == {null string} hi i := 7 false false flag true testCheckedIf( true ) true flag false testCheckedIf( false ) false flag true testCheckedElse( true ) true flag false testCheckedElse( false ) false
3 false false x == 0 0 == 0 testStringForMatching() Contains( "string" ) "this string contains 'abc' as a substring" contains: "string" testStringForMatching() Contains( "abc" ) "this string contains 'abc' as a substring" contains: "abc" testStringForMatching() StartsWith( "this" ) "this string contains 'abc' as a substring" starts with: "this" testStringForMatching() EndsWith( "substring" ) "this string contains 'abc' as a substring" ends with: "substring" testStringForMatching() Contains( "not there" ) "this string contains 'abc' as a substring" contains: "not there" testStringForMatching() StartsWith( "string" ) "this string contains 'abc' as a substring" starts with: "string" testStringForMatching() EndsWith( "this" ) "this string contains 'abc' as a substring" ends with: "this" testStringForMatching() Equals( "something else" ) "this string contains 'abc' as a substring" equals: "something else" "" Equals(__null) "" equals: "" testStringForMatching() AllOf( Catch::Contains( "string" ), Catch::Contains( "abc" ) ) "this string contains 'abc' as a substring" ( contains: "string" and contains: "abc" ) testStringForMatching() AnyOf( Catch::Contains( "string" ), Catch::Contains( "not there" ) ) "this string contains 'abc' as a substring" ( contains: "string" or contains: "not there" ) testStringForMatching() AnyOf( Catch::Contains( "not there" ), Catch::Contains( "string" ) ) "this string contains 'abc' as a substring" ( contains: "not there" or contains: "string" ) testStringForMatching() Equals( "this string contains 'abc' as a substring" ) "this string contains 'abc' as a substring" equals: "this string contains 'abc' as a substring" Factorial(0) == 1 1 == 1 Factorial(1) == 1 1 == 1 Factorial(2) == 2 2 == 2 Factorial(3) == 6 6 == 6 Factorial(10) == 3628800 0x == 3628800 This one ran v.size() == 5 5 == 5 v.capacity() >= 5 5 >= 5 v.size() == 5 5 == 5 v.capacity() >= 5 5 >= 5
v.size() == 10 10 == 10 v.capacity() >= 10 10 >= 10
v.size() == 5 5 == 5 v.capacity() >= 5 5 >= 5
v.size() == 0 0 == 0 v.capacity() >= 5 5 >= 5
v.size() == 5 5 == 5 v.capacity() >= 5 5 >= 5
v.size() == 0 0 == 0 v.capacity() >= 5 5 >= 5
v.capacity() == 0 0 == 0
v.size() == 5 5 == 5 v.capacity() >= 5 5 >= 5
v.size() == 5 5 == 5 v.capacity() >= 10 10 >= 10
v.size() == 5 5 == 5 v.capacity() >= 5 5 >= 5
v.size() == 5 5 == 5 v.capacity() >= 5 5 >= 5
to infinity and beyond
to infinity and beyond
to infinity and beyond
totals.assertions.passed == 298 298 == 298 totals.assertions.failed == 0 0 == 0
totals.assertions.passed == 2 2 == 2 totals.assertions.failed == 77 77 == 77
totals.assertions.passed == 2 2 == 2 totals.assertions.failed == 1 1 == 1
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.shouldDebugBreak == false false == false config.abortAfter == -1 -1 == -1 config.noThrow == false false == false config.reporterName.empty() true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) cfg.filters().size() == 1 1 == 1 cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false false == false cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) cfg.filters().size() == 1 1 == 1 cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false false == false cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) cfg.filters().size() == 1 1 == 1 cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false false == false cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) cfg.filters().size() == 1 1 == 1 cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false false == false cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) true cfg.filters()[0].shouldInclude( fakeTestCase( "test2" ) ) true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.reporterName == "console" "console" == "console"
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.reporterName == "xml" "xml" == "xml"
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.reporterName == "junit" "junit" == "junit"
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.shouldDebugBreak == true true == true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.shouldDebugBreak true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.abortAfter == 1 1 == 1
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.abortAfter == 2 2 == 2
parseIntoConfigAndReturnError( argv, config ) Contains( "greater than zero" ) "Value after -x or --abortAfter must be greater than zero - while parsing: (-x, --abortx <number of failures>)" contains: "greater than zero"
parseIntoConfigAndReturnError( argv, config ) Contains( "-x" ) "Unable to convert oops to destination type - while parsing: (-x, --abortx <number of failures>)" contains: "-x"
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.noThrow == true true == true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.noThrow == true true == true
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.outputFilename == "filename.ext" "filename.ext" == "filename.ext"
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.outputFilename == "filename.ext" "filename.ext" == "filename.ext"
parseIntoConfig( argv, config ) parseIntoConfig( argv, config ) config.abortAfter == 1 1 == 1 config.shouldDebugBreak true config.noThrow == true true == true
matchAny.shouldInclude( fakeTestCase( "any" ) ) true matchNone.shouldInclude( fakeTestCase( "any" ) ) == false false == false matchHidden.shouldInclude( fakeTestCase( "any" ) ) == false false == false matchNonHidden.shouldInclude( fakeTestCase( "any" ) ) true matchHidden.shouldInclude( fakeTestCase( "./any" ) ) true matchNonHidden.shouldInclude( fakeTestCase( "./any" ) ) == false false == false matchHidden.shouldInclude( fakeTestCase( "./something" ) ) true filters.shouldInclude( fakeTestCase( "any" ) ) == false false == false filters.shouldInclude( fakeTestCase( "./something" ) ) true filters.shouldInclude( fakeTestCase( "./anything" ) ) == false false == false matchBadgers.shouldInclude( fakeTestCase( "big badger" ) ) true matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) == false false == false matchBadgers.shouldInclude( fakeTestCase( "big badger" ) ) true matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) true matchBadgers.shouldInclude( fakeTestCase( "badgers are big" ) ) true matchBadgers.shouldInclude( fakeTestCase( "hedgehogs" ) ) == false false == false
oneTag.getTestCaseInfo().description == "" "" == "" oneTag.hasTag( "one" ) true oneTag.getTags().size() == 1 1 == 1 oneTag.matchesTags( p1 ) == true true == true oneTag.matchesTags( p2 ) == true true == true oneTag.matchesTags( p3 ) == false false == false oneTag.matchesTags( p4 ) == false false == false oneTag.matchesTags( p5 ) == false false == false
twoTags.getTestCaseInfo().description == "" "" == "" twoTags.hasTag( "one" ) true twoTags.hasTag( "two" ) true twoTags.hasTag( "Two" ) true twoTags.hasTag( "three" ) == false false == false twoTags.getTags().size() == 2 2 == 2 twoTags.matchesTags( p1 ) == true true == true twoTags.matchesTags( p2 ) == true true == true twoTags.matchesTags( p3 ) == true true == true twoTags.matchesTags( p4 ) == true true == true twoTags.matchesTags( p5 ) == true true == true
oneTagWithExtras.getTestCaseInfo().description == "1234" "1234" == "1234" oneTagWithExtras.hasTag( "one" ) true oneTagWithExtras.hasTag( "two" ) == false false == false oneTagWithExtras.getTags().size() == 1 1 == 1
oneTagOpen.getTestCaseInfo().description == "[one" "[one" == "[one" oneTagOpen.hasTag( "one" ) == false false == false oneTagOpen.getTags().size() == 0 0 == 0
oneTag.getTestCaseInfo().description == "" "" == "" oneTag.hasTag( "." ) true oneTag.isHidden() true oneTag.matchesTags( "~[.]" ) == false false == false
Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString "one two three four" == "one two three four"
Text( testString, TextAttributes().setWidth( 17 ) ).toString() == "one two three\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 16 ) ).toString() == "one two three\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 14 ) ).toString() == "one two three\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 13 ) ).toString() == "one two three\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 12 ) ).toString() == "one two\nthree four" "one two three four" == "one two three four"
Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" "one two three four" == "one two three four"
Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 5 ) ).toString() == "one\ntwo\nthree\nfour" "one two three four" == "one two three four"
Text( "abcdef", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef" "abc- def" == "abc- def" Text( "abcdefg", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndefg" "abc- defg" == "abc- defg" Text( "abcdefgh", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef-\ngh" "abc- def- gh" == "abc- def- gh" Text( testString, TextAttributes().setWidth( 4 ) ).toString() == "one\ntwo\nthr-\nee\nfour" "one two thr- ee four" == "one two thr- ee four" Text( testString, TextAttributes().setWidth( 3 ) ).toString() == "one\ntwo\nth-\nree\nfo-\nur" "one two th- ree fo- ur" == "one two th- ree fo- ur"
text.size() == 4 4 == 4 text[0] == "one" "one" == "one" text[1] == "two" "two" == "two" text[2] == "three" "three" == "three" text[3] == "four" "four" == "four"
text.toString() == " one two\n three\n four" " one two three four" == " one two three four"
Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 10 ) ).toString() == testString "one two three four" == "one two three four"
Text( "abcdef\n", TextAttributes().setWidth( 10 ) ).toString() == "abcdef\n" "abcdef " == "abcdef " Text( "abcdef", TextAttributes().setWidth( 6 ) ).toString() == "abcdef" "abcdef" == "abcdef" Text( "abcdef\n", TextAttributes().setWidth( 6 ) ).toString() == "abcdef\n" "abcdef " == "abcdef "
Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" "one two three four" == "one two three four" Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" "one two three four" == "one two three four"
Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" "one two three four" == "one two three four"
Text( testString, TextAttributes().setWidth( 15 ) ).toString() == "one two three\n four\n five\n six" "one two three four five six" == "one two three four five six"
Text( "hi there" ).toString() == "hi there" "hi there" == "hi there" Text( "hi there", narrow ).toString() == "hi\nthere" "hi there" == "hi there" (std::pair<int, int>( 1, 2 )) == aNicePair std::pair( 1, 2 ) == std::pair( 1, 2 ) Uncomment the code in this test to check that it gives a sensible compiler error Uncomment the code in this test to check that it gives a sensible compiler error &o1 == &o2 0x == 0x o1 == o2 {?} == {?} std::string( "first" ) == "second" "first" == "second" i++ == 7 7 == 7 i++ == 8 8 == 8 0x == o 0x == {?} t == 1u {?} == 1 0x == bit30and31 0x == 3221225472 obj.prop != __null 0x != 0
is_true<true>::value == true true == true true == is_true<true>::value true == true
is_true<false>::value == false false == false false == is_true<false>::value false == false
!is_true<false>::value true
!!is_true<true>::value true
is_true<true>::value true !is_true<false>::value !false
True true !False true !False !false Catch::isTrue( true ) true Catch::isTrue( true ) true
Catch::isTrue( true ) true
Catch::isTrue( true ) true
Catch::isTrue( true ) true
Catch::isTrue( true ) true
Catch::isTrue( true ) true
Catch::isTrue( true ) true
Catch::isTrue( true ) true
s == "7" "7" == "7" a true a == &foo 1 == 1 p == 0 __null == 0
itDoesThis() true
itDoesThis() true
itDoesThat() true
v.size() == 0 0 == 0
v.size() == 0 0 == 0
v.size() == 0 0 == 0
v.size() == 10 10 == 10 v.capacity() >= 10 10 >= 10
v.size() == 0 0 == 0
v.size() == 10 10 == 10 v.capacity() >= 10 10 >= 10
v.size() == 0 0 == 0
v.size() == 10 10 == 10 v.capacity() >= 10 10 >= 10
v.size() == 5 5 == 5 v.capacity() >= 10 10 >= 10
v.size() == 0 0 == 0
v.size() == 0 0 == 0
v.capacity() >= 10 10 >= 10 v.size() == 0 0 == 0
config.processName == "test" "test" == "test"
config.fileName == "filename.ext" "filename.ext" == "filename.ext"
config.fileName == "filename.ext" "filename.ext" == "filename.ext"
config.fileName == "filename.ext" "filename.ext" == "filename.ext"
config.fileName == "%stdout" "%stdout" == "%stdout"
config.number == 42 42 == 42
parseInto( cli, argv, config ) parseInto( cli, argv, config ) config.number == 0 0 == 0
config1.number == 42 42 == 42 !unusedTokens.empty() !false config2.description == "some text" "some text" == "some text"
config.index == 3 3 == 3
parseInto( cli, argv, config ) parseInto( cli, argv, config )
config.flag true
config.flag == false false == false
config.firstPos == "1st" "1st" == "1st" config.secondPos == "2nd" "2nd" == "2nd" config.unpositional == "3rd" "3rd" == "3rd"
!testCaseTracker.isCompleted() !false !testCaseTracker.isCompleted() !false
!testCaseTracker.isCompleted() !false testCaseTracker.isCompleted() true
!testCaseTracker.isCompleted() !false
!testCaseTracker.enterSection( section1Name ) !false !testCaseTracker.isCompleted() !false !testCaseTracker.isCompleted() !false testCaseTracker.enterSection( section1Name ) true testCaseTracker.isCompleted() true
!testCaseTracker.isCompleted() !false
!testCaseTracker.enterSection( section1Name ) !false !testCaseTracker.enterSection( section2Name ) !false !testCaseTracker.isCompleted() !false testCaseTracker.enterSection( section1Name ) true !testCaseTracker.enterSection( section2Name ) !false !testCaseTracker.isCompleted() !false !testCaseTracker.enterSection( section1Name ) !false testCaseTracker.enterSection( section2Name ) true testCaseTracker.isCompleted() true
!testCaseTracker.isCompleted() !false
!testCaseTracker.enterSection( section1Name ) !false !testCaseTracker.isCompleted() !false testCaseTracker.enterSection( section1Name ) true !testCaseTracker.enterSection( section2Name ) !false !testCaseTracker.isCompleted() !false testCaseTracker.enterSection( section1Name ) true testCaseTracker.enterSection( section2Name ) true testCaseTracker.isCompleted() true
Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/ClassTests.cpp000066400000000000000000000025421221513074500254760ustar00rootroot00000000000000/* * Created by Phil on 09/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch.hpp" namespace { class TestClass { std::string s; public: TestClass() : s( "hello" ) {} void succeedingCase() { REQUIRE( s == "hello" ); } void failingCase() { REQUIRE( s == "world" ); } }; } METHOD_AS_TEST_CASE( TestClass::succeedingCase, "./succeeding/TestClass/succeedingCase", "A method based test run that succeeds [class]" ) METHOD_AS_TEST_CASE( TestClass::failingCase, "./failing/TestClass/failingCase", "A method based test run that fails [class]" ) struct Fixture { Fixture() : m_a( 1 ) {} int m_a; }; TEST_CASE_METHOD( Fixture, "./succeeding/Fixture/succeedingCase", "A method based test run that succeeds [class]" ) { REQUIRE( m_a == 1 ); } // We should be able to write our tests within a different namespace namespace Inner { TEST_CASE_METHOD( Fixture, "./failing/Fixture/failingCase", "A method based test run that fails [class]" ) { REQUIRE( m_a == 2 ); } } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/CmdLineTests.cpp000066400000000000000000000124711221513074500257460ustar00rootroot00000000000000/* * Created by Phil on 22/10/2010. * Copyright 2010 Two Blue Cubes Ltd * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifdef __clang__ #pragma clang diagnostic ignored "-Wpadded" #endif #include "internal/clara.h" #include "catch.hpp" // Helper to deduce size from array literals and pass on to parser template std::vector parseInto( Clara::CommandLine& cli, char const * (&argv)[size], ConfigT& config ) { return cli.parseInto( size, argv, config ); } struct TestOpt { TestOpt() : number( 0 ), index( 0 ), flag( false ) {} std::string processName; std::string fileName; int number; int index; bool flag; std::string firstPos; std::string secondPos; std::string unpositional; void setValidIndex( int i ) { if( i < 0 || i > 10 ) throw std::domain_error( "index must be between 0 and 10" ); index = i; } }; struct TestOpt2 { std::string description; }; #ifdef CATCH_CONFIG_VARIADIC_MACROS TEST_CASE( "cmdline" ) { TestOpt config; Clara::CommandLine cli; cli.bindProcessName( &TestOpt::processName ); cli.bind( &TestOpt::fileName ) .describe( "specifies output file" ) .shortOpt( "o" ) .longOpt( "output" ) .hint( "filename" ); SECTION( "process name" ) { char const * argv[] = { "test", "-o filename.ext" }; parseInto( cli, argv, config ); CHECK( config.processName == "test" ); } SECTION( "arg separated by spaces" ) { char const * argv[] = { "test", "-o filename.ext" }; parseInto( cli, argv, config ); CHECK( config.fileName == "filename.ext" ); } SECTION( "arg separated by colon" ) { const char* argv[] = { "test", "-o:filename.ext" }; parseInto( cli, argv, config ); CHECK( config.fileName == "filename.ext" ); } SECTION( "arg separated by =" ) { const char* argv[] = { "test", "-o=filename.ext" }; parseInto( cli, argv, config ); CHECK( config.fileName == "filename.ext" ); } SECTION( "long opt" ) { const char* argv[] = { "test", "--output %stdout" }; parseInto( cli, argv, config ); CHECK( config.fileName == "%stdout" ); } cli.bind( &TestOpt::number ) .shortOpt( "n" ) .hint( "an integral value" ); SECTION( "a number" ) { const char* argv[] = { "test", "-n 42" }; parseInto( cli, argv, config ); CHECK( config.number == 42 ); } SECTION( "not a number" ) { const char* argv[] = { "test", "-n forty-two" }; CHECK_THROWS( parseInto( cli, argv, config ) ); CHECK( config.number == 0 ); } SECTION( "two parsers" ) { TestOpt config1; TestOpt2 config2; Clara::CommandLine cli2; cli2.bind( &TestOpt2::description ) .describe( "description" ) .shortOpt( "d" ) .longOpt( "description" ) .hint( "some text" ); const char* argv[] = { "test", "-n 42", "-d some text" }; std::vector unusedTokens = parseInto( cli, argv, config1 ); CHECK( config1.number == 42 ); REQUIRE_FALSE( unusedTokens.empty() ); cli2.populate( unusedTokens, config2 ); CHECK( config2.description == "some text" ); } SECTION( "methods" ) { cli.bind( &TestOpt::setValidIndex ) .describe( "An index, which is an integer between 0 and 10, inclusive" ) .shortOpt( "i" ) .hint( "index" ); SECTION( "in range" ) { const char* argv[] = { "test", "-i 3" }; parseInto( cli, argv, config ); REQUIRE( config.index == 3 ); } SECTION( "out of range" ) { const char* argv[] = { "test", "-i 42" }; REQUIRE_THROWS( parseInto( cli, argv, config ) ); } } SECTION( "flags" ) { cli.bind( &TestOpt::flag ) .describe( "A flag" ) .shortOpt( "f" ); SECTION( "set" ) { const char* argv[] = { "test", "-f" }; parseInto( cli, argv, config ); REQUIRE( config.flag ); } SECTION( "not set" ) { const char* argv[] = { "test" }; parseInto( cli, argv, config ); REQUIRE( config.flag == false ); } } SECTION( "positional" ) { cli.bind( &TestOpt::secondPos ) .describe( "Second position" ) .hint( "second arg" ) .position( 2 ); cli.bind( &TestOpt::unpositional ) .hint( "any arg" ) .describe( "Unpositional" ); cli.bind( &TestOpt::firstPos ) .describe( "First position" ) .hint( "first arg" ) .position( 1 ); // std::cout << cli.usage( "testApp" ) << std::endl; const char* argv[] = { "test", "-f", "1st", "-o", "filename", "2nd", "3rd" }; parseInto( cli, argv, config ); REQUIRE( config.firstPos == "1st" ); REQUIRE( config.secondPos == "2nd" ); REQUIRE( config.unpositional == "3rd" ); } } #endif Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/ConditionTests.cpp000066400000000000000000000224531221513074500263620ustar00rootroot00000000000000/* * Created by Phil on 08/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifdef __clang__ #pragma clang diagnostic ignored "-Wpadded" #endif #include "catch.hpp" #include #include struct TestData { TestData() : int_seven( 7 ), str_hello( "hello" ), float_nine_point_one( 9.1f ), double_pi( 3.1415926535 ) {} int int_seven; std::string str_hello; float float_nine_point_one; double double_pi; }; struct TestDef { TestDef& operator + ( const std::string& ) { return *this; } TestDef& operator[]( const std::string& ) { return *this; } }; // The "failing" tests all use the CHECK macro, which continues if the specific test fails. // This allows us to see all results, even if an earlier check fails // Equality tests TEST_CASE( "./succeeding/conditions/equality", "Equality checks that should succeed" ) { TestDef td; td + "hello" + "hello"; TestData data; REQUIRE( data.int_seven == 7 ); REQUIRE( data.float_nine_point_one == Approx( 9.1f ) ); REQUIRE( data.double_pi == Approx( 3.1415926535 ) ); REQUIRE( data.str_hello == "hello" ); REQUIRE( "hello" == data.str_hello ); REQUIRE( data.str_hello.size() == 5 ); double x = 1.1 + 0.1 + 0.1; REQUIRE( x == Approx( 1.3 ) ); } TEST_CASE( "./failing/conditions/equality", "Equality checks that should fail" ) { TestData data; CHECK( data.int_seven == 6 ); CHECK( data.int_seven == 8 ); CHECK( data.int_seven == 0 ); CHECK( data.float_nine_point_one == Approx( 9.11f ) ); CHECK( data.float_nine_point_one == Approx( 9.0f ) ); CHECK( data.float_nine_point_one == Approx( 1 ) ); CHECK( data.float_nine_point_one == Approx( 0 ) ); CHECK( data.double_pi == Approx( 3.1415 ) ); CHECK( data.str_hello == "goodbye" ); CHECK( data.str_hello == "hell" ); CHECK( data.str_hello == "hello1" ); CHECK( data.str_hello.size() == 6 ); double x = 1.1 + 0.1 + 0.1; CHECK( x == Approx( 1.301 ) ); } TEST_CASE( "./succeeding/conditions/inequality", "Inequality checks that should succeed" ) { TestData data; REQUIRE( data.int_seven != 6 ); REQUIRE( data.int_seven != 8 ); REQUIRE( data.float_nine_point_one != Approx( 9.11f ) ); REQUIRE( data.float_nine_point_one != Approx( 9.0f ) ); REQUIRE( data.float_nine_point_one != Approx( 1 ) ); REQUIRE( data.float_nine_point_one != Approx( 0 ) ); REQUIRE( data.double_pi != Approx( 3.1415 ) ); REQUIRE( data.str_hello != "goodbye" ); REQUIRE( data.str_hello != "hell" ); REQUIRE( data.str_hello != "hello1" ); REQUIRE( data.str_hello.size() != 6 ); } TEST_CASE( "./failing/conditions/inequality", "Inequality checks that should fails" ) { TestData data; CHECK( data.int_seven != 7 ); CHECK( data.float_nine_point_one != Approx( 9.1f ) ); CHECK( data.double_pi != Approx( 3.1415926535 ) ); CHECK( data.str_hello != "hello" ); CHECK( data.str_hello.size() != 5 ); } // Ordering comparison tests TEST_CASE( "./succeeding/conditions/ordered", "Ordering comparison checks that should succeed" ) { TestData data; REQUIRE( data.int_seven < 8 ); REQUIRE( data.int_seven > 6 ); REQUIRE( data.int_seven > 0 ); REQUIRE( data.int_seven > -1 ); REQUIRE( data.int_seven >= 7 ); REQUIRE( data.int_seven >= 6 ); REQUIRE( data.int_seven <= 7 ); REQUIRE( data.int_seven <= 8 ); REQUIRE( data.float_nine_point_one > 9 ); REQUIRE( data.float_nine_point_one < 10 ); REQUIRE( data.float_nine_point_one < 9.2 ); REQUIRE( data.str_hello <= "hello" ); REQUIRE( data.str_hello >= "hello" ); REQUIRE( data.str_hello < "hellp" ); REQUIRE( data.str_hello < "zebra" ); REQUIRE( data.str_hello > "hellm" ); REQUIRE( data.str_hello > "a" ); } TEST_CASE( "./failing/conditions/ordered", "Ordering comparison checks that should fail" ) { TestData data; CHECK( data.int_seven > 7 ); CHECK( data.int_seven < 7 ); CHECK( data.int_seven > 8 ); CHECK( data.int_seven < 6 ); CHECK( data.int_seven < 0 ); CHECK( data.int_seven < -1 ); CHECK( data.int_seven >= 8 ); CHECK( data.int_seven <= 6 ); CHECK( data.float_nine_point_one < 9 ); CHECK( data.float_nine_point_one > 10 ); CHECK( data.float_nine_point_one > 9.2 ); CHECK( data.str_hello > "hello" ); CHECK( data.str_hello < "hello" ); CHECK( data.str_hello > "hellp" ); CHECK( data.str_hello > "z" ); CHECK( data.str_hello < "hellm" ); CHECK( data.str_hello < "a" ); CHECK( data.str_hello >= "z" ); CHECK( data.str_hello <= "a" ); } // Comparisons with int literals TEST_CASE( "./succeeding/conditions/int literals", "Comparisons with int literals don't warn when mixing signed/ unsigned" ) { int i = 1; unsigned int ui = 2; long l = 3; unsigned long ul = 4; char c = 5; unsigned char uc = 6; REQUIRE( i == 1 ); REQUIRE( ui == 2 ); REQUIRE( l == 3 ); REQUIRE( ul == 4 ); REQUIRE( c == 5 ); REQUIRE( uc == 6 ); REQUIRE( 1 == i ); REQUIRE( 2 == ui ); REQUIRE( 3 == l ); REQUIRE( 4 == ul ); REQUIRE( 5 == c ); REQUIRE( 6 == uc ); REQUIRE( (std::numeric_limits::max)() > ul ); } // Disable warnings about sign conversions for the next two tests // (as we are deliberately invoking them) // - Currently only disabled for GCC/ LLVM. Should add VC++ too #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wsign-conversion" #endif #ifdef _MSC_VER #pragma warning(disable:4389) // '==' : signed/unsigned mismatch #endif TEST_CASE( "./succeeding/conditions//long_to_unsigned_x", "comparisons between int variables" ) { long long_var = 1L; unsigned char unsigned_char_var = 1; unsigned short unsigned_short_var = 1; unsigned int unsigned_int_var = 1; unsigned long unsigned_long_var = 1L; REQUIRE( long_var == unsigned_char_var ); REQUIRE( long_var == unsigned_short_var ); REQUIRE( long_var == unsigned_int_var ); REQUIRE( long_var == unsigned_long_var ); } TEST_CASE( "./succeeding/conditions/const ints to int literal", "comparisons between const int variables" ) { const unsigned char unsigned_char_var = 1; const unsigned short unsigned_short_var = 1; const unsigned int unsigned_int_var = 1; const unsigned long unsigned_long_var = 1L; REQUIRE( unsigned_char_var == 1 ); REQUIRE( unsigned_short_var == 1 ); REQUIRE( unsigned_int_var == 1 ); REQUIRE( unsigned_long_var == 1 ); } TEST_CASE( "./succeeding/conditions/negative ints", "Comparisons between unsigned ints and negative signed ints match c++ standard behaviour" ) { CHECK( ( -1 > 2u ) ); CHECK( -1 > 2u ); CHECK( ( 2u < -1 ) ); CHECK( 2u < -1 ); const int minInt = (std::numeric_limits::min)(); CHECK( ( minInt > 2u ) ); CHECK( minInt > 2u ); } template struct Ex { Ex( T ){} bool operator == ( const T& ) const { return true; } T operator * ( const T& ) const { return T(); } }; TEST_CASE( "./succeeding/conditions/computed ints", "Comparisons between ints where one side is computed" ) { CHECK( 54 == 6*9 ); } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif inline const char* returnsConstNull(){ return NULL; } inline char* returnsNull(){ return NULL; } TEST_CASE( "./succeeding/conditions/ptr", "Pointers can be compared to null" ) { TestData* p = NULL; TestData* pNULL = NULL; REQUIRE( p == NULL ); REQUIRE( p == pNULL ); TestData data; p = &data; REQUIRE( p != NULL ); const TestData* cp = p; REQUIRE( cp != NULL ); const TestData* const cpc = p; REQUIRE( cpc != NULL ); REQUIRE( returnsNull() == NULL ); REQUIRE( returnsConstNull() == NULL ); REQUIRE( NULL != p ); } // Not (!) tests // The problem with the ! operator is that it has right-to-left associativity. // This means we can't isolate it when we decompose. The simple REQUIRE( !false ) form, therefore, // cannot have the operand value extracted. The test will work correctly, and the situation // is detected and a warning issued. // An alternative form of the macros (CHECK_FALSE and REQUIRE_FALSE) can be used instead to capture // the operand value. TEST_CASE( "./succeeding/conditions/not", "'Not' checks that should succeed" ) { bool falseValue = false; REQUIRE( false == false ); REQUIRE( true == true ); REQUIRE( !false ); REQUIRE_FALSE( false ); REQUIRE( !falseValue ); REQUIRE_FALSE( falseValue ); REQUIRE( !(1 == 2) ); REQUIRE_FALSE( 1 == 2 ); } TEST_CASE( "./failing/conditions/not", "'Not' checks that should fail" ) { bool trueValue = true; CHECK( false != false ); CHECK( true != true ); CHECK( !true ); CHECK_FALSE( true ); CHECK( !trueValue ); CHECK_FALSE( trueValue ); CHECK( !(1 == 1) ); CHECK_FALSE( 1 == 1 ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/ExceptionTests.cpp000066400000000000000000000067171221513074500263770ustar00rootroot00000000000000/* * Created by Phil on 09/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch.hpp" #include #include #include "catch_self_test.hpp" namespace { inline int thisThrows() { if( Catch::isTrue( true ) ) throw std::domain_error( "expected exception" ); return 1; } int thisDoesntThrow() { return 0; } } TEST_CASE( "./succeeding/exceptions/explicit", "When checked exceptions are thrown they can be expected or unexpected" ) { REQUIRE_THROWS_AS( thisThrows(), std::domain_error ); REQUIRE_NOTHROW( thisDoesntThrow() ); REQUIRE_THROWS( thisThrows() ); } TEST_CASE( "./failing/exceptions/explicit", "When checked exceptions are thrown they can be expected or unexpected" ) { CHECK_THROWS_AS( thisThrows(), std::string ); CHECK_THROWS_AS( thisDoesntThrow(), std::domain_error ); CHECK_NOTHROW( thisThrows() ); } TEST_CASE( "./failing/exceptions/implicit", "When unchecked exceptions are thrown they are always failures" ) { if( Catch::isTrue( true ) ) throw std::domain_error( "unexpected exception" ); } TEST_CASE( "./failing/exceptions/implicit/2", "An unchecked exception reports the line of the last assertion" ) { CHECK( 1 == 1 ); if( Catch::isTrue( true ) ) throw std::domain_error( "unexpected exception" ); } TEST_CASE( "./failing/exceptions/implicit/3", "When unchecked exceptions are thrown they are always failures" ) { SECTION( "section name", "" ) { if( Catch::isTrue( true ) ) throw std::domain_error( "unexpected exception" ); } } TEST_CASE( "./failing/exceptions/implicit/4", "When unchecked exceptions are thrown they are always failures" ) { CHECK( thisThrows() == 0 ); } TEST_CASE( "./succeeding/exceptions/implicit", "When unchecked exceptions are thrown, but caught, they do not affect the test" ) { try { throw std::domain_error( "unexpected exception" ); } catch(...) { } } class CustomException { public: CustomException( const std::string& msg ) : m_msg( msg ) {} std::string getMessage() const { return m_msg; } private: std::string m_msg; }; CATCH_TRANSLATE_EXCEPTION( CustomException& ex ) { return ex.getMessage(); } CATCH_TRANSLATE_EXCEPTION( double& ex ) { return Catch::toString( ex ); } TEST_CASE( "./failing/exceptions/custom", "Unexpected custom exceptions can be translated" ) { if( Catch::isTrue( true ) ) throw CustomException( "custom exception" ); } inline void throwCustom() { if( Catch::isTrue( true ) ) throw CustomException( "custom exception - not std" ); } TEST_CASE( "./failing/exceptions/custom/nothrow", "Custom exceptions can be translated when testing for nothrow" ) { REQUIRE_NOTHROW( throwCustom() ); } TEST_CASE( "./failing/exceptions/custom/throw", "Custom exceptions can be translated when testing for throwing as something else" ) { REQUIRE_THROWS_AS( throwCustom(), std::exception ); } TEST_CASE( "./failing/exceptions/custom/double", "Unexpected custom exceptions can be translated" ) { if( Catch::isTrue( true ) ) throw double( 3.14 ); } inline int thisFunctionNotImplemented( int ) { CATCH_NOT_IMPLEMENTED; } TEST_CASE( "./succeeding/exceptions/notimplemented", "" ) { REQUIRE_THROWS( thisFunctionNotImplemented( 7 ) ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/GeneratorTests.cpp000066400000000000000000000022211221513074500263510ustar00rootroot00000000000000/* * Created by Phil on 28/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ // This define means we have to prefix all the CATCH macros with CATCH_ // We're using it here to test it out #define CATCH_CONFIG_PREFIX_ALL #include "catch.hpp" inline int multiply( int a, int b ) { return a*b; } CATCH_TEST_CASE( "./succeeding/generators/1", "Generators over two ranges" ) { using namespace Catch::Generators; int i = CATCH_GENERATE( between( 1, 5 ).then( values( 15, 20, 21 ).then( 36 ) ) ); int j = CATCH_GENERATE( between( 100, 107 ) ); CATCH_REQUIRE( multiply( i, 2 ) == i*2 ); CATCH_REQUIRE( multiply( j, 2 ) == j*2 ); } struct IntPair { int first, second; }; CATCH_TEST_CASE( "./succeeding/generators/2", "Generator over a range of pairs" ) { using namespace Catch::Generators; IntPair p[] = { { 0, 1 }, { 2, 3 } }; IntPair* i = CATCH_GENERATE( between( p, &p[1] ) ); CATCH_REQUIRE( i->first == i->second-1 ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/MessageTests.cpp000066400000000000000000000046461221513074500260240ustar00rootroot00000000000000/* * Created by Phil on 09/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch.hpp" TEST_CASE( "./succeeding/message", "INFO and WARN do not abort tests" ) { INFO( "this is a " << "message" ); // This should output the message if a failure occurs WARN( "this is a " << "warning" ); // This should always output the message but then continue } TEST_CASE( "./succeeding/succeed", "SUCCEED counts as a test pass" ) { SUCCEED( "this is a " << "success" ); } TEST_CASE( "./failing/message/info/1", "INFO gets logged on failure" ) { INFO( "this message should be logged" ); INFO( "so should this" ); int a = 2; REQUIRE( a == 1 ); } TEST_CASE( "./mixed/message/info/2", "INFO gets logged on failure" ) { INFO( "this message may be logged later" ); int a = 2; CHECK( a == 2 ); INFO( "this message should be logged" ); CHECK( a == 1 ); INFO( "and this, but later" ); CHECK( a == 0 ); INFO( "but not this" ); CHECK( a == 2 ); } TEST_CASE( "./failing/message/fail", "FAIL aborts the test" ) { if( Catch::isTrue( true ) ) FAIL( "This is a " << "failure" ); // This should output the message and abort } TEST_CASE( "./failing/message/sections", "Output from all sections is reported" ) { SECTION( "one", "" ) { FAIL( "Message from section one" ); } SECTION( "two", "" ) { FAIL( "Message from section two" ); } } TEST_CASE( "./succeeding/message/sections/stdout", "Output from all sections is reported" ) { SECTION( "one", "" ) { std::cout << "Message from section one" << std::endl; } SECTION( "two", "" ) { std::cout << "Message from section two" << std::endl; } } TEST_CASE( "./mixed/message/scoped", "" ) { for( int i=0; i<100; i++ ) { SCOPED_INFO( "current counter " << i ); SCOPED_CAPTURE( i ); REQUIRE( i < 10 ); } } TEST_CASE( "./succeeding/nofail", "The NO_FAIL macro reports a failure but does not fail the test" ) { CHECK_NOFAIL( 1 == 2 ); } TEST_CASE( "just info", "[info][isolated info][.]" ) { INFO( "this should never be seen" ); } TEST_CASE( "just failure", "[fail][isolated info][.]" ) { FAIL( "Previous info should not be seen" ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/MiscTests.cpp000066400000000000000000000201451221513074500253230ustar00rootroot00000000000000/* * Created by Phil on 29/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch.hpp" #include "catch_self_test.hpp" #include TEST_CASE( "./succeeding/Misc/Sections", "random SECTION tests" ) { int a = 1; int b = 2; SECTION( "s1", "doesn't equal" ) { REQUIRE( a != b ); REQUIRE( b != a ); } SECTION( "s2", "not equal" ) { REQUIRE( a != b); } } TEST_CASE( "./succeeding/Misc/Sections/nested", "nested SECTION tests" ) { int a = 1; int b = 2; SECTION( "s1", "doesn't equal" ) { REQUIRE( a != b ); REQUIRE( b != a ); SECTION( "s2", "not equal" ) { REQUIRE( a != b); } } } TEST_CASE( "./mixed/Misc/Sections/nested2", "nested SECTION tests" ) { int a = 1; int b = 2; SECTION( "s1", "doesn't equal" ) { SECTION( "s2", "equal" ) { REQUIRE( a == b ); } SECTION( "s3", "not equal" ) { REQUIRE( a != b ); } SECTION( "s4", "less than" ) { REQUIRE( a < b ); } } } TEST_CASE( "./Sections/nested/a/b", "nested SECTION tests" ) { SECTION( "c", "" ) { SECTION( "d (leaf)", "" ) { } SECTION( "e (leaf)", "" ) { } } SECTION( "f (leaf)", "" ) { } } TEST_CASE( "./mixed/Misc/Sections/loops", "looped SECTION tests" ) { int a = 1; for( int b = 0; b < 10; ++b ) { std::ostringstream oss; oss << "b is currently: " << b; SECTION( "s1", oss.str() ) { CHECK( b > a ); } } } TEST_CASE( "./mixed/Misc/loops", "looped tests" ) { static const int fib[] = { 1, 1, 2, 3, 5, 8, 13, 21 }; for( size_t i=0; i < sizeof(fib)/sizeof(int); ++i ) { INFO( "Testing if fib[" << i << "] (" << fib[i] << ") is even" ); CHECK( ( fib[i] % 2 ) == 0 ); } } TEST_CASE( "./succeeding/Misc/stdout,stderr", "Sends stuff to stdout and stderr" ) { std::cout << "Some information" << std::endl; std::cerr << "An error" << std::endl; } inline const char* makeString( bool makeNull ) { return makeNull ? NULL : "valid string"; } TEST_CASE( "./succeeding/Misc/null strings", "" ) { REQUIRE( makeString( false ) != static_cast(NULL)); REQUIRE( makeString( true ) == static_cast(NULL)); } TEST_CASE( "./failing/info", "sends information to INFO" ) { INFO( "hi" ); int i = 7; CAPTURE( i ); REQUIRE( false ); } inline bool testCheckedIf( bool flag ) { CHECKED_IF( flag ) return true; else return false; } TEST_CASE( "./succeeding/checkedif", "" ) { REQUIRE( testCheckedIf( true ) ); } TEST_CASE( "./failing/checkedif", "" ) { REQUIRE( testCheckedIf( false ) ); } inline bool testCheckedElse( bool flag ) { CHECKED_ELSE( flag ) return false; return true; } TEST_CASE( "./succeeding/checkedelse", "" ) { REQUIRE( testCheckedElse( true ) ); } TEST_CASE( "./failing/checkedelse", "" ) { REQUIRE( testCheckedElse( false ) ); } TEST_CASE( "./misc/xmlentitycheck", "" ) { SECTION( "embedded xml", "it should be possible to embed xml characters, such as <, \" or &, or even whole documents within an attribute" ) { // No test } SECTION( "encoded chars", "these should all be encoded: &&&\"\"\"<<<&\"<<&\"" ) { // No test } } TEST_CASE( "./manual/onechar", "send a single char to INFO" ) { INFO(3); REQUIRE(false); } TEST_CASE("./succeeding/atomic if", "") { size_t x = 0; if( x ) REQUIRE(x > 0); else REQUIRE(x == 0); } inline const char* testStringForMatching() { return "this string contains 'abc' as a substring"; } TEST_CASE("./succeeding/matchers", "") { REQUIRE_THAT( testStringForMatching(), Contains( "string" ) ); CHECK_THAT( testStringForMatching(), Contains( "abc" ) ); CHECK_THAT( testStringForMatching(), StartsWith( "this" ) ); CHECK_THAT( testStringForMatching(), EndsWith( "substring" ) ); } TEST_CASE("./failing/matchers/Contains", "") { CHECK_THAT( testStringForMatching(), Contains( "not there" ) ); } TEST_CASE("./failing/matchers/StartsWith", "") { CHECK_THAT( testStringForMatching(), StartsWith( "string" ) ); } TEST_CASE("./failing/matchers/EndsWith", "") { CHECK_THAT( testStringForMatching(), EndsWith( "this" ) ); } TEST_CASE("./failing/matchers/Equals", "") { CHECK_THAT( testStringForMatching(), Equals( "something else" ) ); } TEST_CASE("string", "Equals with NULL") { REQUIRE_THAT("", Equals(NULL)); } TEST_CASE("./succeeding/matchers/AllOf", "") { CHECK_THAT( testStringForMatching(), AllOf( Catch::Contains( "string" ), Catch::Contains( "abc" ) ) ); } TEST_CASE("./succeeding/matchers/AnyOf", "") { CHECK_THAT( testStringForMatching(), AnyOf( Catch::Contains( "string" ), Catch::Contains( "not there" ) ) ); CHECK_THAT( testStringForMatching(), AnyOf( Catch::Contains( "not there" ), Catch::Contains( "string" ) ) ); } TEST_CASE("./succeeding/matchers/Equals", "") { CHECK_THAT( testStringForMatching(), Equals( "this string contains 'abc' as a substring" ) ); } inline unsigned int Factorial( unsigned int number ) { // return number <= 1 ? number : Factorial(number-1)*number; return number > 1 ? Factorial(number-1)*number : 1; } TEST_CASE( "Factorials are computed", "[factorial]" ) { REQUIRE( Factorial(0) == 1 ); REQUIRE( Factorial(1) == 1 ); REQUIRE( Factorial(2) == 2 ); REQUIRE( Factorial(3) == 6 ); REQUIRE( Factorial(10) == 3628800 ); } TEST_CASE( "empty", "An empty test with no assertions" ) { } TEST_CASE( "Nice descriptive name", "[tag1][tag2][tag3][.]" ) { WARN( "This one ran" ); } TEST_CASE( "first tag", "[tag1]" ) { } TEST_CASE( "second tag", "[tag2]" ) { } // //TEST_CASE( "spawn a new process", "[.]" ) //{ // // !TBD Work in progress // char line[200]; // FILE* output = popen("./CatchSelfTest ./failing/matchers/StartsWith", "r"); // while ( fgets(line, 199, output) ) // std::cout << line; //} TEST_CASE( "vectors can be sized and resized", "[vector]" ) { std::vector v( 5 ); REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 5 ); SECTION( "resizing bigger changes size and capacity", "" ) { v.resize( 10 ); REQUIRE( v.size() == 10 ); REQUIRE( v.capacity() >= 10 ); } SECTION( "resizing smaller changes size but not capacity", "" ) { v.resize( 0 ); REQUIRE( v.size() == 0 ); REQUIRE( v.capacity() >= 5 ); SECTION( "We can use the 'swap trick' to reset the capacity", "" ) { std::vector empty; empty.swap( v ); REQUIRE( v.capacity() == 0 ); } } SECTION( "reserving bigger changes capacity but not size", "" ) { v.reserve( 10 ); REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 10 ); } SECTION( "reserving smaller does not change size or capacity", "" ) { v.reserve( 0 ); REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 5 ); } } // https://github.com/philsquared/Catch/issues/166 TEST_CASE("./failing/CatchSectionInfiniteLoop", "") { SECTION("Outer", "") SECTION("Inner", "") SUCCEED("that's not flying - that's failing in style"); FAIL("to infinity and beyond"); } //#include "internal/catch_timer.h" // //TEST_CASE( "Timer", "[work-in-progress]" ) //{ // Catch::Timer t; // t.start(); // // std::cout << "starting..." << std::endl; // // double d = 0; // for( int i = 0; i < 100000; ++i ) // for( int j = 0; j < 1000; ++j ) // d += (double)i*(double)j; // // double duration = t.getElapsedSeconds(); // // std::cout << "finished in " << duration << std::endl; // // SUCCEED("yay"); // //} Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SectionTrackerTests.cpp000066400000000000000000000114201221513074500273440ustar00rootroot00000000000000/* * Created by Phil on 20/07/2013. * Copyright 2013 Two Blue Cubes Ltd * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifdef __clang__ #pragma clang diagnostic ignored "-Wpadded" #endif #include "internal/catch_test_case_tracker.hpp" #include "catch.hpp" TEST_CASE( "section tracking" ) { using namespace Catch; TestCaseTracker testCaseTracker( "test case" ); const std::string section1Name = "section 1"; const std::string section2Name = "section 2"; CHECK_FALSE( testCaseTracker.isCompleted() ); SECTION( "test case with no sections" ) { { TestCaseTracker::Guard guard( testCaseTracker ); CHECK_FALSE( testCaseTracker.isCompleted() ); } CHECK( testCaseTracker.isCompleted() ); } SECTION( "test case with one section" ) { { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section? - no, not yet CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); CHECK_FALSE( testCaseTracker.isCompleted() ); // Leave test case - incomplete (still need to visit section) } CHECK_FALSE( testCaseTracker.isCompleted() ); // ... // Enter test case again { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section? - yes CHECK( testCaseTracker.enterSection( section1Name ) ); // Leave section and test case - now complete testCaseTracker.leaveSection(); } CHECK( testCaseTracker.isCompleted() ); } SECTION( "test case with two consecutive sections" ) { // Enter test case { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section 1? - no, not yet CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); // Enter section 2? - no, not yet CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ); // Leave test case - incomplete (still need to visit sections) } CHECK_FALSE( testCaseTracker.isCompleted() ); // ... // Enter test case again { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section 1? - yes CHECK( testCaseTracker.enterSection( section1Name ) ); testCaseTracker.leaveSection(); // Enter section 2? - no, not yet CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ); // Leave test case - incomplete (still need to visit section 2) } CHECK_FALSE( testCaseTracker.isCompleted() ); // ... // Enter test case again { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section 1? - no, already done now CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); // Enter section 2? - yes - finally CHECK( testCaseTracker.enterSection( section2Name ) ); testCaseTracker.leaveSection(); // Leave test case - now complete } CHECK( testCaseTracker.isCompleted() ); } SECTION( "test case with one section within another" ) { // Enter test case { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section 1? - no, not yet CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); // Leave test case - incomplete (still need to visit sections) } CHECK_FALSE( testCaseTracker.isCompleted() ); // ... // Enter test case again { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section 1? - yes CHECK( testCaseTracker.enterSection( section1Name ) ); // Enter section 2? - no, not yet CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ); testCaseTracker.leaveSection(); // section 1 - incomplete (section 2) // Leave test case - incomplete } CHECK_FALSE( testCaseTracker.isCompleted() ); // ... // Enter test case again { TestCaseTracker::Guard guard( testCaseTracker ); // Enter section 1? - yes - so we can execute section 2 CHECK( testCaseTracker.enterSection( section1Name ) ); // Enter section 2? - yes - finally CHECK( testCaseTracker.enterSection( section2Name ) ); testCaseTracker.leaveSection(); // section 2 testCaseTracker.leaveSection(); // section 1 // Leave test case - now complete } CHECK( testCaseTracker.isCompleted() ); } } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/000077500000000000000000000000001221513074500255005ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_common.cpp000066400000000000000000000001721221513074500306360ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_common.h" catch_console_colour.cpp000066400000000000000000000002041221513074500323100ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_console_colour.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_debugger.cpp000066400000000000000000000001761221513074500311360ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_debugger.hpp" catch_interfaces_capture.cpp000066400000000000000000000002061221513074500331330ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_interfaces_capture.h" catch_interfaces_config.cpp000066400000000000000000000000451221513074500327360ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps#include "catch_interfaces_config.h" catch_interfaces_exception.cpp000066400000000000000000000000501221513074500334630ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps#include "catch_interfaces_exception.h" catch_interfaces_generators.cpp000066400000000000000000000000511221513074500336370ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps#include "catch_interfaces_generators.h" catch_interfaces_registry_hub.cpp000066400000000000000000000002131221513074500341740ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_interfaces_registry_hub.h" catch_interfaces_reporter.cpp000066400000000000000000000000471221513074500333350ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps#include "catch_interfaces_reporter.h" catch_interfaces_runner.cpp000066400000000000000000000000451221513074500330020ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps#include "catch_interfaces_runner.h" catch_interfaces_testcase.cpp000066400000000000000000000000471221513074500333060ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps#include "catch_interfaces_testcase.h" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_message.cpp000066400000000000000000000001731221513074500307730ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_message.h" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_option.cpp000066400000000000000000000001741221513074500306600ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_option.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_ptr.cpp000066400000000000000000000001711221513074500301520ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_ptr.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_stream.cpp000066400000000000000000000001741221513074500306430ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_stream.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_streambuf.cpp000066400000000000000000000001751221513074500313410ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_streambuf.h" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_tags.cpp000066400000000000000000000001721221513074500303040ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_tags.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/SurrogateCpps/catch_xmlwriter.cpp000066400000000000000000000001771221513074500314100ustar00rootroot00000000000000// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_xmlwriter.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/TestMain.cpp000066400000000000000000000530071221513074500251340ustar00rootroot00000000000000/* * Created by Phil on 22/10/2010. * Copyright 2010 Two Blue Cubes Ltd * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifdef __clang__ #pragma clang diagnostic ignored "-Wpadded" #endif #include "catch_self_test.hpp" #include "internal/catch_text.h" #include "internal/catch_console_colour.hpp" TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results" ) { using namespace Catch; /////////////////////////////////////////////////////////////////////////// SECTION( "selftest/expected result", "Tests do what they claim" ) { SECTION( "selftest/expected result/failing tests", "Tests in the 'failing' branch fail" ) { MetaTestRunner::runMatching( "./failing/*", MetaTestRunner::Expected::ToFail, 0, 2 ); } SECTION( "selftest/expected result/succeeding tests", "Tests in the 'succeeding' branch succeed" ) { MetaTestRunner::runMatching( "./succeeding/*", MetaTestRunner::Expected::ToSucceed, 1, 2 ); } } /////////////////////////////////////////////////////////////////////////// SECTION( "selftest/test counts", "Number of test cases that run is fixed" ) { EmbeddedRunner runner; SECTION( "selftest/test counts/succeeding tests", "Number of 'succeeding' tests is fixed" ) { Totals totals = runner.runMatching( "./succeeding/*", 0, 2 ); CHECK( totals.assertions.passed == 298 ); CHECK( totals.assertions.failed == 0 ); } SECTION( "selftest/test counts/failing tests", "Number of 'failing' tests is fixed" ) { Totals totals = runner.runMatching( "./failing/*", 1, 2 ); CHECK( totals.assertions.passed == 2 ); CHECK( totals.assertions.failed == 77 ); } } } TEST_CASE( "meta/Misc/Sections", "looped tests" ) { Catch::EmbeddedRunner runner; Catch::Totals totals = runner.runMatching( "./mixed/Misc/Sections/nested2", 0, 1 ); CHECK( totals.assertions.passed == 2 ); CHECK( totals.assertions.failed == 1 ); } #ifdef __clang__ #pragma clang diagnostic ignored "-Wweak-vtables" #endif #include "../../include/internal/catch_commandline.hpp" #include "../../include/internal/catch_test_spec.h" #include "../../include/reporters/catch_reporter_xml.hpp" template void parseIntoConfig( const char * (&argv)[size], Catch::ConfigData& config ) { Clara::CommandLine parser = Catch::makeCommandLineParser(); parser.parseInto( size, argv, config ); } template std::string parseIntoConfigAndReturnError( const char * (&argv)[size], Catch::ConfigData& config ) { try { parseIntoConfig( argv, config ); FAIL( "expected exception" ); } catch( std::exception& ex ) { return ex.what(); } return ""; } inline Catch::TestCase fakeTestCase( const char* name ){ return Catch::makeTestCase( NULL, "", name, "", CATCH_INTERNAL_LINEINFO ); } TEST_CASE( "Process can be configured on command line", "[config][command-line]" ) { Catch::ConfigData config; SECTION( "default - no arguments", "" ) { const char* argv[] = { "test" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); CHECK( config.shouldDebugBreak == false ); CHECK( config.abortAfter == -1 ); CHECK( config.noThrow == false ); CHECK( config.reporterName.empty() ); } SECTION( "test lists", "" ) { SECTION( "1 test", "Specify one test case using" ) { const char* argv[] = { "test", "test1" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); Catch::Config cfg( config ); REQUIRE( cfg.filters().size() == 1 ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) ); } SECTION( "Specify one test case exclusion using exclude:", "" ) { const char* argv[] = { "test", "exclude:test1" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); Catch::Config cfg( config ); REQUIRE( cfg.filters().size() == 1 ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) ); } SECTION( "Specify one test case exclusion using ~", "" ) { const char* argv[] = { "test", "~test1" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); Catch::Config cfg( config ); REQUIRE( cfg.filters().size() == 1 ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) ); } SECTION( "Specify two test cases using -t", "" ) { const char* argv[] = { "test", "-t", "test1", "test2" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); Catch::Config cfg( config ); REQUIRE( cfg.filters().size() == 1 ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) ); REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test2" ) ) ); } } SECTION( "reporter", "" ) { SECTION( "-r/console", "" ) { const char* argv[] = { "test", "-r", "console" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.reporterName == "console" ); } SECTION( "-r/xml", "" ) { const char* argv[] = { "test", "-r", "xml" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.reporterName == "xml" ); } SECTION( "--reporter/junit", "" ) { const char* argv[] = { "test", "--reporter", "junit" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.reporterName == "junit" ); } } SECTION( "debugger", "" ) { SECTION( "-b", "" ) { const char* argv[] = { "test", "-b" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.shouldDebugBreak == true ); } SECTION( "--break", "" ) { const char* argv[] = { "test", "--break" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.shouldDebugBreak ); } } SECTION( "abort", "" ) { SECTION( "-a aborts after first failure", "" ) { const char* argv[] = { "test", "-a" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.abortAfter == 1 ); } SECTION( "-x 2 aborts after two failures", "" ) { const char* argv[] = { "test", "-x", "2" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.abortAfter == 2 ); } SECTION( "-x must be greater than zero", "" ) { const char* argv[] = { "test", "-x", "0" }; REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "greater than zero" ) ); } SECTION( "-x must be numeric", "" ) { const char* argv[] = { "test", "-x", "oops" }; REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "-x" ) ); } } SECTION( "nothrow", "" ) { SECTION( "-e", "" ) { const char* argv[] = { "test", "-e" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.noThrow == true ); } SECTION( "--nothrow", "" ) { const char* argv[] = { "test", "--nothrow" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.noThrow == true ); } } SECTION( "output filename", "" ) { SECTION( "-o filename", "" ) { const char* argv[] = { "test", "-o", "filename.ext" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.outputFilename == "filename.ext" ); } SECTION( "--out", "" ) { const char* argv[] = { "test", "--out", "filename.ext" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); REQUIRE( config.outputFilename == "filename.ext" ); } } SECTION( "combinations", "" ) { SECTION( "Single character flags can be combined", "" ) { const char* argv[] = { "test", "-abe" }; CHECK_NOTHROW( parseIntoConfig( argv, config ) ); CHECK( config.abortAfter == 1 ); CHECK( config.shouldDebugBreak ); CHECK( config.noThrow == true ); } } } TEST_CASE( "selftest/test filter", "Individual filters" ) { Catch::TestCaseFilter matchAny( "*" ); Catch::TestCaseFilter matchNone( "*", Catch::IfFilterMatches::ExcludeTests ); CHECK( matchAny.shouldInclude( fakeTestCase( "any" ) )); CHECK( matchNone.shouldInclude( fakeTestCase( "any" ) ) == false ); Catch::TestCaseFilter matchHidden( "./*" ); Catch::TestCaseFilter matchNonHidden( "./*", Catch::IfFilterMatches::ExcludeTests ); CHECK( matchHidden.shouldInclude( fakeTestCase( "any" ) ) == false ); CHECK( matchNonHidden.shouldInclude( fakeTestCase( "any" ) ) ); CHECK( matchHidden.shouldInclude( fakeTestCase( "./any" ) ) ); CHECK( matchNonHidden.shouldInclude( fakeTestCase( "./any" ) ) == false ); } TEST_CASE( "selftest/test filters", "Sets of filters" ) { Catch::TestCaseFilter matchHidden( "./*" ); Catch::TestCaseFilter dontMatchA( "./a*", Catch::IfFilterMatches::ExcludeTests ); Catch::TestCaseFilters filters( "" ); filters.addFilter( matchHidden ); filters.addFilter( dontMatchA ); CHECK( matchHidden.shouldInclude( fakeTestCase( "./something" ) ) ); CHECK( filters.shouldInclude( fakeTestCase( "any" ) ) == false ); CHECK( filters.shouldInclude( fakeTestCase( "./something" ) ) ); CHECK( filters.shouldInclude( fakeTestCase( "./anything" ) ) == false ); } TEST_CASE( "selftest/filter/prefix wildcard", "Individual filters with wildcards at the start" ) { Catch::TestCaseFilter matchBadgers( "*badger" ); CHECK( matchBadgers.shouldInclude( fakeTestCase( "big badger" ) )); CHECK( matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) == false ); } TEST_CASE( "selftest/filter/wildcard at both ends", "Individual filters with wildcards at both ends" ) { Catch::TestCaseFilter matchBadgers( "*badger*" ); CHECK( matchBadgers.shouldInclude( fakeTestCase( "big badger" ) )); CHECK( matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) ); CHECK( matchBadgers.shouldInclude( fakeTestCase( "badgers are big" ) ) ); CHECK( matchBadgers.shouldInclude( fakeTestCase( "hedgehogs" ) ) == false ); } template int getArgc( const char * (&)[size] ) { return size; } TEST_CASE( "selftest/tags", "" ) { std::string p1 = "[one]"; std::string p2 = "[one],[two]"; std::string p3 = "[one][two]"; std::string p4 = "[one][two],[three]"; std::string p5 = "[one][two]~[.],[three]"; SECTION( "one tag", "" ) { Catch::TestCase oneTag = makeTestCase( NULL, "", "test", "[one]", CATCH_INTERNAL_LINEINFO ); CHECK( oneTag.getTestCaseInfo().description == "" ); CHECK( oneTag.hasTag( "one" ) ); CHECK( oneTag.getTags().size() == 1 ); CHECK( oneTag.matchesTags( p1 ) == true ); CHECK( oneTag.matchesTags( p2 ) == true ); CHECK( oneTag.matchesTags( p3 ) == false ); CHECK( oneTag.matchesTags( p4 ) == false ); CHECK( oneTag.matchesTags( p5 ) == false ); } SECTION( "two tags", "" ) { Catch::TestCase twoTags= makeTestCase( NULL, "", "test", "[one][two]", CATCH_INTERNAL_LINEINFO ); CHECK( twoTags.getTestCaseInfo().description == "" ); CHECK( twoTags.hasTag( "one" ) ); CHECK( twoTags.hasTag( "two" ) ); CHECK( twoTags.hasTag( "Two" ) ); CHECK( twoTags.hasTag( "three" ) == false ); CHECK( twoTags.getTags().size() == 2 ); CHECK( twoTags.matchesTags( p1 ) == true ); CHECK( twoTags.matchesTags( p2 ) == true ); CHECK( twoTags.matchesTags( p3 ) == true ); CHECK( twoTags.matchesTags( p4 ) == true ); CHECK( twoTags.matchesTags( p5 ) == true ); } SECTION( "one tag with characters either side", "" ) { Catch::TestCase oneTagWithExtras = makeTestCase( NULL, "", "test", "12[one]34", CATCH_INTERNAL_LINEINFO ); CHECK( oneTagWithExtras.getTestCaseInfo().description == "1234" ); CHECK( oneTagWithExtras.hasTag( "one" ) ); CHECK( oneTagWithExtras.hasTag( "two" ) == false ); CHECK( oneTagWithExtras.getTags().size() == 1 ); } SECTION( "start of a tag, but not closed", "" ) { Catch::TestCase oneTagOpen = makeTestCase( NULL, "", "test", "[one", CATCH_INTERNAL_LINEINFO ); CHECK( oneTagOpen.getTestCaseInfo().description == "[one" ); CHECK( oneTagOpen.hasTag( "one" ) == false ); CHECK( oneTagOpen.getTags().size() == 0 ); } SECTION( "hidden", "" ) { Catch::TestCase oneTag = makeTestCase( NULL, "", "test", "[.]", CATCH_INTERNAL_LINEINFO ); CHECK( oneTag.getTestCaseInfo().description == "" ); CHECK( oneTag.hasTag( "." ) ); CHECK( oneTag.isHidden() ); CHECK( oneTag.matchesTags( "~[.]" ) == false ); } } TEST_CASE( "Long strings can be wrapped", "[wrap]" ) { using namespace Catch; SECTION( "plain string", "" ) { // guide: 123456789012345678 std::string testString = "one two three four"; SECTION( "No wrapping", "" ) { CHECK( Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString ); CHECK( Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString ); } SECTION( "Wrapped once", "" ) { CHECK( Text( testString, TextAttributes().setWidth( 17 ) ).toString() == "one two three\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 16 ) ).toString() == "one two three\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 14 ) ).toString() == "one two three\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 13 ) ).toString() == "one two three\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 12 ) ).toString() == "one two\nthree four" ); } SECTION( "Wrapped twice", "" ) { CHECK( Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" ); } SECTION( "Wrapped three times", "" ) { CHECK( Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 5 ) ).toString() == "one\ntwo\nthree\nfour" ); } SECTION( "Short wrap", "" ) { CHECK( Text( "abcdef", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef" ); CHECK( Text( "abcdefg", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndefg" ); CHECK( Text( "abcdefgh", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef-\ngh" ); CHECK( Text( testString, TextAttributes().setWidth( 4 ) ).toString() == "one\ntwo\nthr-\nee\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 3 ) ).toString() == "one\ntwo\nth-\nree\nfo-\nur" ); } SECTION( "As container", "" ) { Text text( testString, TextAttributes().setWidth( 6 ) ); REQUIRE( text.size() == 4 ); CHECK( text[0] == "one" ); CHECK( text[1] == "two" ); CHECK( text[2] == "three" ); CHECK( text[3] == "four" ); } SECTION( "Indent first line differently", "" ) { Text text( testString, TextAttributes() .setWidth( 10 ) .setIndent( 4 ) .setInitialIndent( 1 ) ); CHECK( text.toString() == " one two\n three\n four" ); } } SECTION( "With newlines", "" ) { // guide: 1234567890123456789 std::string testString = "one two\nthree four"; SECTION( "No wrapping" , "" ) { CHECK( Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString ); CHECK( Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString ); CHECK( Text( testString, TextAttributes().setWidth( 10 ) ).toString() == testString ); } SECTION( "Trailing newline" , "" ) { CHECK( Text( "abcdef\n", TextAttributes().setWidth( 10 ) ).toString() == "abcdef\n" ); CHECK( Text( "abcdef", TextAttributes().setWidth( 6 ) ).toString() == "abcdef" ); CHECK( Text( "abcdef\n", TextAttributes().setWidth( 6 ) ).toString() == "abcdef\n" ); } SECTION( "Wrapped once", "" ) { CHECK( Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" ); CHECK( Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" ); } SECTION( "Wrapped twice", "" ) { CHECK( Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" ); } } SECTION( "With tabs", "" ) { // guide: 1234567890123456789 std::string testString = "one two \tthree four five six"; CHECK( Text( testString, TextAttributes().setWidth( 15 ) ).toString() == "one two three\n four\n five\n six" ); } } using namespace Catch; class ColourString { public: struct ColourIndex { ColourIndex( Colour::Code _colour, std::size_t _fromIndex, std::size_t _toIndex ) : colour( _colour ), fromIndex( _fromIndex ), toIndex( _toIndex ) {} Colour::Code colour; std::size_t fromIndex; std::size_t toIndex; }; ColourString( std::string const& _string ) : string( _string ) {} ColourString( std::string const& _string, std::vector const& _colours ) : string( _string ), colours( _colours ) {} ColourString& addColour( Colour::Code colour, int _index ) { colours.push_back( ColourIndex( colour, resolveRelativeIndex( _index ), resolveRelativeIndex( _index )+1 ) ); return *this; } ColourString& addColour( Colour::Code colour, int _fromIndex, int _toIndex ) { colours.push_back( ColourIndex( colour, resolveRelativeIndex(_fromIndex), resolveLastRelativeIndex( _toIndex ) ) ); return *this; } void writeToStream( std::ostream& _stream ) const { std::size_t last = 0; for( std::size_t i = 0; i < colours.size(); ++i ) { ColourIndex const& index = colours[i]; if( index.fromIndex > last ) _stream << string.substr( last, index.fromIndex-last ); { Colour colourGuard( index.colour ); _stream << string.substr( index.fromIndex, index.toIndex-index.fromIndex ); } last = index.toIndex; } if( last < string.size() ) _stream << string.substr( last ); } friend std::ostream& operator << ( std::ostream& _stream, ColourString const& _colourString ) { _colourString.writeToStream( _stream ); return _stream; } private: std::size_t resolveLastRelativeIndex( int _index ) { std::size_t index = resolveRelativeIndex( _index ); return index == 0 ? string.size() : index; } std::size_t resolveRelativeIndex( int _index ) { return static_cast( _index >= 0 ? _index : static_cast( string.size() )+_index ); } std::string string; std::vector colours; }; // !TBD: This will be folded into Text class TEST_CASE( "Strings can be rendered with colour", "[colour]" ) { { ColourString cs( "hello" ); cs .addColour( Colour::Red, 0 ) .addColour( Colour::Green, -1 ); std::cout << cs << std::endl; } { ColourString cs( "hello" ); cs .addColour( Colour::Blue, 1, -2 ); std::cout << cs << std::endl; } } TEST_CASE( "Text can be formatted using the Text class", "" ) { CHECK( Text( "hi there" ).toString() == "hi there" ); TextAttributes narrow; narrow.setWidth( 6 ); CHECK( Text( "hi there", narrow ).toString() == "hi\nthere" ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/TrickyTests.cpp000066400000000000000000000177411221513074500257050ustar00rootroot00000000000000/* * Created by Phil on 09/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifdef __clang__ #pragma clang diagnostic ignored "-Wpadded" #endif #include "catch.hpp" namespace Catch { template<> std::string toString >( const std::pair& value ) { std::ostringstream oss; oss << "std::pair( " << value.first << ", " << value.second << " )"; return oss.str(); } } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/Tricky/std::pair", "Parsing a std::pair" ) { std::pair aNicePair( 1, 2 ); REQUIRE( (std::pair( 1, 2 )) == aNicePair ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./inprogress/failing/Tricky/trailing expression", "Where the is more to the expression after the RHS" ) { // int a = 1, b = 2; // REQUIRE( a == 2 || b == 2 ); WARN( "Uncomment the code in this test to check that it gives a sensible compiler error" ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./inprogress/failing/Tricky/compound lhs", "Where the LHS is not a simple value" ) { /* int a = 1; int b = 2; // This only captures part of the expression, but issues a warning about the rest REQUIRE( a+1 == b-1 ); */ WARN( "Uncomment the code in this test to check that it gives a sensible compiler error" ); } struct Opaque { int val; bool operator ==( const Opaque& o ) const { return val == o.val; } }; /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./failing/Tricky/non streamable type", "A failing expression with a non streamable type is still captured" ) { Opaque o1, o2; o1.val = 7; o2.val = 8; CHECK( &o1 == &o2 ); CHECK( o1 == o2 ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./failing/string literals", "string literals of different sizes can be compared" ) { REQUIRE( std::string( "first" ) == "second" ); } /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/side-effects", "An expression with side-effects should only be evaluated once" ) { int i = 7; REQUIRE( i++ == 7 ); REQUIRE( i++ == 8 ); } namespace A { struct X { X() : a(4), b(2), c(7) {} X(int v) : a(v), b(2), c(7) {} int a; int b; int c; }; } namespace B { struct Y { Y() : a(4), b(2), c(7) {} Y(int v) : a(v), b(2), c(7) {} int a; int b; int c; }; } inline bool operator==(const A::X& lhs, const B::Y& rhs) { return (lhs.a == rhs.a); } inline bool operator==(const B::Y& lhs, const A::X& rhs) { return (lhs.a == rhs.a); } /////////////////////////////////////////////////////////////////////////////// /* This, currently, does not compile with LLVM TEST_CASE ( "./succeeding/koenig", "Operators at different namespace levels not hijacked by Koenig lookup" ) { A::X x; B::Y y; REQUIRE( x == y ); } */ namespace ObjectWithConversions { struct Object { operator unsigned int() {return 0xc0000000;} }; /////////////////////////////////////////////////////////////////////////////// TEST_CASE ( "./succeeding/koenig", "Operators at different namespace levels not hijacked by Koenig lookup" ) { Object o; REQUIRE(0xc0000000 == o ); } } namespace ObjectWithNonConstEqualityOperator { struct Test { Test( unsigned int v ) : m_value(v) {} bool operator==( const Test&rhs ) { return (m_value == rhs.m_value); } bool operator==( const Test&rhs ) const { return (m_value != rhs.m_value); } unsigned int m_value; }; TEST_CASE("./succeeding/non-const==", "Demonstrate that a non-const == is not used") { Test t( 1 ); REQUIRE( t == 1u ); } } namespace EnumBitFieldTests { enum Bits {bit0 = 0x0001, bit1 = 0x0002, bit2 = 0x0004, bit3 = 0x0008, bit1and2 = 0x0006, bit30 = 0x40000000, bit31 = 0x80000000, bit30and31 = 0xc0000000}; TEST_CASE("./succeeding/enum/bits", "Test enum bit values") { REQUIRE( 0xc0000000 == bit30and31 ); } } struct Obj { Obj():prop(&p){} int p; int* prop; }; TEST_CASE("./succeeding/boolean member", "") { Obj obj; REQUIRE( obj.prop != NULL ); } // Tests for a problem submitted by Ralph McArdell // // The static bool value should not need to be defined outside the // struct it is declared in - but when evaluating it in a deduced // context it appears to require the extra definition. // The issue was fixed by adding bool overloads to bypass the // templates that were deduce it. template struct is_true { static const bool value = B; }; TEST_CASE( "./succeeding/unimplemented static bool", "static bools can be evaluated" ) { SECTION("compare to true","") { REQUIRE( is_true::value == true ); REQUIRE( true == is_true::value ); } SECTION("compare to false","") { REQUIRE( is_true::value == false ); REQUIRE( false == is_true::value ); } SECTION("negation", "") { REQUIRE( !is_true::value ); } SECTION("double negation","") { REQUIRE( !!is_true::value ); } SECTION("direct","") { REQUIRE( is_true::value ); REQUIRE_FALSE( is_true::value ); } } // Uncomment these tests to produce an error at test registration time /* TEST_CASE( "./sameName", "Tests with the same name are not allowed" ) { } TEST_CASE( "./sameName", "Tests with the same name are not allowed" ) { } */ struct Boolable { explicit Boolable( bool value ) : m_value( value ) {} operator Catch::SafeBool::type() const { return Catch::SafeBool::makeSafe( m_value ); } bool m_value; }; TEST_CASE( "./succeeding/SafeBool", "Objects that evaluated in boolean contexts can be checked") { Boolable True( true ); Boolable False( false ); CHECK( True ); CHECK( !False ); CHECK_FALSE( False ); } TEST_CASE( "Assertions then sections", "" ) { // This was causing a failure due to the way the console reporter was handling // the current section REQUIRE( Catch::isTrue( true ) ); SECTION( "A section", "" ) { REQUIRE( Catch::isTrue( true ) ); SECTION( "Another section", "" ) { REQUIRE( Catch::isTrue( true ) ); } SECTION( "Another other section", "" ) { REQUIRE( Catch::isTrue( true ) ); } } } struct Awkward { operator int() const { return 7; } }; TEST_CASE( "non streamable - with conv. op", "" ) { Awkward awkward; std::string s = Catch::toString( awkward ); REQUIRE( s == "7" ); } inline void foo() {} typedef void (*fooptr_t)(); TEST_CASE( "Comparing function pointers", "[function pointer]" ) { // This was giving a warning in VS2010 // #179 fooptr_t a = foo; REQUIRE( a ); REQUIRE( a == &foo ); } class ClassName {}; TEST_CASE( "pointer to class", "" ) { ClassName *p = 0; REQUIRE( p == 0 ); } #ifdef CATCH_CONFIG_CPP11_NULLPTR #include TEST_CASE( "null_ptr", "" ) { std::unique_ptr ptr; REQUIRE(ptr.get() == nullptr); } #endif TEST_CASE( "X/level/0/a", "" ) { SUCCEED(""); } TEST_CASE( "X/level/0/b", "[fizz]" ) { SUCCEED(""); } TEST_CASE( "X/level/1/a", "" ) { SUCCEED(""); } TEST_CASE( "X/level/1/b", "" ) { SUCCEED("");} Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/VariadicMacrosTests.cpp000066400000000000000000000011451221513074500273160ustar00rootroot00000000000000/* * Created by Phil on 15/03/2013. * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #include "catch.hpp" #ifdef CATCH_CONFIG_VARIADIC_MACROS TEST_CASE() { SUCCEED( "anonymous test case" ); } TEST_CASE( "Test case with one argument" ) { SUCCEED( "no assertions" ); } TEST_CASE( "Variadic macros", "[variadic][sections]" ) { SECTION( "Section with one argument" ) { SUCCEED( "no assertions" ); } } #endif Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/catch_self_test.cpp000066400000000000000000000017201221513074500265350ustar00rootroot00000000000000/* * Created by Phil on 14/02/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #define CATCH_CONFIG_MAIN #include "catch_self_test.hpp" namespace Catch{ NullStreamingReporter::~NullStreamingReporter() {} Totals EmbeddedRunner::runMatching( const std::string& rawTestSpec, std::size_t groupIndex, std::size_t groupsCount, const std::string& ) { std::ostringstream oss; Ptr config = new Config(); config->setStreamBuf( oss.rdbuf() ); Totals totals; // Scoped because RunContext doesn't report EndTesting until its destructor { RunContext runner( config.get(), m_reporter.get() ); totals = runner.runMatching( rawTestSpec, groupIndex, groupsCount ); } return totals; } } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/SelfTest/catch_self_test.hpp000066400000000000000000000141701221513074500265450ustar00rootroot00000000000000/* * Created by Phil on 14/01/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED #define TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED #include "catch.hpp" // Use this external guard here as if we're using the single header version // this will already be defined #ifndef TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED #include "catch_interfaces_registry_hub.h" #endif #include "set" #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { class NullStreamingReporter : public SharedImpl { public: virtual ~NullStreamingReporter(); static std::string getDescription() { return "null reporter"; } private: // IStreamingReporter virtual ReporterPreferences getPreferences() const { return ReporterPreferences(); } virtual void noMatchingTestCases( std::string const& ) {} virtual void testRunStarting( TestRunInfo const& ) {} virtual void testGroupStarting( GroupInfo const& ) {} virtual void testCaseStarting( TestCaseInfo const& ) {} virtual void sectionStarting( SectionInfo const& ) {} virtual void assertionStarting( AssertionInfo const& ) {} virtual bool assertionEnded( AssertionStats const& ) { return false; } virtual void sectionEnded( SectionStats const& ) {} virtual void testCaseEnded( TestCaseStats const& ) {} virtual void testGroupEnded( TestGroupStats const& ) {} virtual void testRunEnded( TestRunStats const& ) {} }; class EmbeddedRunner { public: EmbeddedRunner() : m_reporter( new NullStreamingReporter() ) {} Totals runMatching( const std::string& rawTestSpec, std::size_t groupIndex, std::size_t groupsCount, const std::string& reporter = "console" ); private: Ptr m_reporter; }; class MetaTestRunner { public: struct Expected { enum Result { ToSucceed, ToFail }; }; MetaTestRunner( Expected::Result expectedResult, std::size_t groupIndex, std::size_t groupsCount ) : m_expectedResult( expectedResult ), m_groupIndex( groupIndex ), m_groupsCount( groupsCount ) {} static void runMatching( const std::string& testSpec, Expected::Result expectedResult, std::size_t groupIndex, std::size_t groupsCount ) { forEach( getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec ), MetaTestRunner( expectedResult, groupIndex, groupsCount ) ); } void operator()( const TestCase& testCase ) { std::string name; Totals totals; { EmbeddedRunner runner; name = testCase.getTestCaseInfo().name; totals = runner.runMatching( name, m_groupIndex, m_groupsCount ); } switch( m_expectedResult ) { case Expected::ToSucceed: if( totals.assertions.failed > 0 ) { FAIL( "Expected test case '" << name << "' to succeed but there was/ were " << totals.assertions.failed << " failure(s)" ); } else { SUCCEED( "Tests passed, as expected" ); } break; case Expected::ToFail: if( totals.assertions.failed == 0 ) { FAIL( "Expected test case '" << name << "' to fail but there was/ were " << totals.assertions.passed << " success(es)" ); } else { SUCCEED( "Tests failed, as expected" ); } break; } } private: Expected::Result m_expectedResult; std::size_t m_groupIndex; std::size_t m_groupsCount; }; struct LineInfoRegistry { static LineInfoRegistry& get() { static LineInfoRegistry s_instance; return s_instance; } void registerLineInfo( const std::string& name, const SourceLineInfo& info ) { m_registry.insert( std::make_pair( name, info ) ); } const SourceLineInfo* find( const std::string& name ) const { std::map::const_iterator it = m_registry.find( name ); return it == m_registry.end() ? NULL : &(it->second); } const std::string infoForName( const std::string& name ) const { std::map::const_iterator it = m_registry.find( name ); if( it == m_registry.end() ) return ""; std::ostringstream oss; oss << it->second; return oss.str(); } std::map m_registry; }; struct LineInfoRegistrar { LineInfoRegistrar( const char* name, const SourceLineInfo& lineInfo ) { LineInfoRegistry::get().registerLineInfo( name, lineInfo ); } }; } #ifdef __clang__ #pragma clang diagnostic pop #endif #define CATCH_REGISTER_LINE_INFO( name ) ::Catch::LineInfoRegistrar INTERNAL_CATCH_UNIQUE_NAME( lineRegistrar )( name, ::Catch::SourceLineInfo( __FILE__, __LINE__ ) ); #define CATCH_GET_LINE_INFO( name ) ::Catch::LineInfoRegistry::get().infoForName( name ) #endif // TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/000077500000000000000000000000001221513074500220105ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/000077500000000000000000000000001221513074500236725ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/TestCatch.sln000066400000000000000000000015751221513074500263020ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCatch", "TestCatch\TestCatch.vcproj", "{A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Debug|Win32.ActiveCfg = Debug|Win32 {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Debug|Win32.Build.0 = Debug|Win32 {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Release|Win32.ActiveCfg = Release|Win32 {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/TestCatch/000077500000000000000000000000001221513074500255545ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/TestCatch/ReadMe.txt000066400000000000000000000024421221513074500274540ustar00rootroot00000000000000======================================================================== CONSOLE APPLICATION : TestCatch Project Overview ======================================================================== AppWizard has created this TestCatch application for you. This file contains a summary of what you will find in each of the files that make up your TestCatch application. TestCatch.vcproj This is the main project file for VC++ projects generated using an Application Wizard. It contains information about the version of Visual C++ that generated the file, and information about the platforms, configurations, and project features selected with the Application Wizard. TestCatch.cpp This is the main application source file. ///////////////////////////////////////////////////////////////////////////// Other standard files: StdAfx.h, StdAfx.cpp These files are used to build a precompiled header (PCH) file named TestCatch.pch and a precompiled types file named StdAfx.obj. ///////////////////////////////////////////////////////////////////////////// Other notes: AppWizard uses "TODO:" comments to indicate parts of the source code you should add to or customize. ///////////////////////////////////////////////////////////////////////////// Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/TestCatch/TestCatch.cpp000066400000000000000000000002051221513074500301370ustar00rootroot00000000000000// TestCatch.cpp : Defines the entry point for the console application. // int main(int argc, char* argv[]) { return 0; } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/TestCatch/TestCatch.vcproj000066400000000000000000000215561221513074500306740ustar00rootroot00000000000000 Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/UpgradeLog.XML000066400000000000000000000027461221513074500263160ustar00rootroot00000000000000 Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/_UpgradeReport_Files/000077500000000000000000000000001221513074500277365ustar00rootroot00000000000000UpgradeReport.css000066400000000000000000000064241221513074500331620ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/_UpgradeReport_FilesBODY { BACKGROUND-COLOR: white; FONT-FAMILY: "Verdana", sans-serif; FONT-SIZE: 100%; MARGIN-LEFT: 0px; MARGIN-TOP: 0px } P { FONT-FAMILY: "Verdana", sans-serif; FONT-SIZE: 70%; LINE-HEIGHT: 12pt; MARGIN-BOTTOM: 0px; MARGIN-LEFT: 10px; MARGIN-TOP: 10px } .note { BACKGROUND-COLOR: #ffffff; COLOR: #336699; FONT-FAMILY: "Verdana", sans-serif; FONT-SIZE: 100%; MARGIN-BOTTOM: 0px; MARGIN-LEFT: 0px; MARGIN-TOP: 0px; PADDING-RIGHT: 10px } .infotable { BACKGROUND-COLOR: #f0f0e0; BORDER-BOTTOM: #ffffff 0px solid; BORDER-COLLAPSE: collapse; BORDER-LEFT: #ffffff 0px solid; BORDER-RIGHT: #ffffff 0px solid; BORDER-TOP: #ffffff 0px solid; FONT-SIZE: 70%; MARGIN-LEFT: 10px } .issuetable { BACKGROUND-COLOR: #ffffe8; BORDER-COLLAPSE: collapse; COLOR: #000000; FONT-SIZE: 100%; MARGIN-BOTTOM: 10px; MARGIN-LEFT: 13px; MARGIN-TOP: 0px } .issuetitle { BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: #dcdcdc 1px solid; BORDER-TOP: #dcdcdc 1px; COLOR: #003366; FONT-WEIGHT: normal } .header { BACKGROUND-COLOR: #cecf9c; BORDER-BOTTOM: #ffffff 1px solid; BORDER-LEFT: #ffffff 1px solid; BORDER-RIGHT: #ffffff 1px solid; BORDER-TOP: #ffffff 1px solid; COLOR: #000000; FONT-WEIGHT: bold } .issuehdr { BACKGROUND-COLOR: #E0EBF5; BORDER-BOTTOM: #dcdcdc 1px solid; BORDER-TOP: #dcdcdc 1px solid; COLOR: #000000; FONT-WEIGHT: normal } .issuenone { BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-RIGHT: 0px; BORDER-TOP: 0px; COLOR: #000000; FONT-WEIGHT: normal } .content { BACKGROUND-COLOR: #e7e7ce; BORDER-BOTTOM: #ffffff 1px solid; BORDER-LEFT: #ffffff 1px solid; BORDER-RIGHT: #ffffff 1px solid; BORDER-TOP: #ffffff 1px solid; PADDING-LEFT: 3px } .issuecontent { BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: #dcdcdc 1px solid; BORDER-TOP: #dcdcdc 1px solid; PADDING-LEFT: 3px } A:link { COLOR: #cc6633; TEXT-DECORATION: underline } A:visited { COLOR: #cc6633; } A:active { COLOR: #cc6633; } A:hover { COLOR: #cc3300; TEXT-DECORATION: underline } H1 { BACKGROUND-COLOR: #003366; BORDER-BOTTOM: #336699 6px solid; COLOR: #ffffff; FONT-SIZE: 130%; FONT-WEIGHT: normal; MARGIN: 0em 0em 0em -20px; PADDING-BOTTOM: 8px; PADDING-LEFT: 30px; PADDING-TOP: 16px } H2 { COLOR: #000000; FONT-SIZE: 80%; FONT-WEIGHT: bold; MARGIN-BOTTOM: 3px; MARGIN-LEFT: 10px; MARGIN-TOP: 20px; PADDING-LEFT: 0px } H3 { COLOR: #000000; FONT-SIZE: 80%; FONT-WEIGHT: bold; MARGIN-BOTTOM: -5px; MARGIN-LEFT: 10px; MARGIN-TOP: 20px } H4 { COLOR: #000000; FONT-SIZE: 70%; FONT-WEIGHT: bold; MARGIN-BOTTOM: 0px; MARGIN-TOP: 15px; PADDING-BOTTOM: 0px } UL { COLOR: #000000; FONT-SIZE: 70%; LIST-STYLE: square; MARGIN-BOTTOM: 0pt; MARGIN-TOP: 0pt } OL { COLOR: #000000; FONT-SIZE: 70%; LIST-STYLE: square; MARGIN-BOTTOM: 0pt; MARGIN-TOP: 0pt } LI { LIST-STYLE: square; MARGIN-LEFT: 0px } .expandable { CURSOR: hand } .expanded { color: black } .collapsed { DISPLAY: none } .foot { BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: #cecf9c 1px solid; BORDER-TOP: #cecf9c 2px solid } .settings { MARGIN-LEFT: 25PX; } .help { TEXT-ALIGN: right; margin-right: 10px; } UpgradeReport.xslt000066400000000000000000000304431221513074500333620ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/_UpgradeReport_Files

Solution: Project:

src
Filename Status Errors Warnings
javascript:document.images[''].click()src Converted Converted
files 1 file Converted:
Not converted:
: Conversion Report <xsl:if test="Properties/Property[@Name='LogNumber']"> <xsl:value-of select="Properties/Property[@Name='LogNumber']/@Value"/> </xsl:if>

Conversion Report -

Time of Conversion:

Conversion Settings

UpgradeReport_Minus.gif000066400000000000000000000001051221513074500343000ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/_UpgradeReport_FilesGIF89a !, y`2:gaWA;UpgradeReport_Plus.gif000066400000000000000000000001071221513074500341320ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2008/TestCatch/_UpgradeReport_FilesGIF89a !, y`D -TW8;Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2010/000077500000000000000000000000001221513074500220015ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2010/TestCatch/000077500000000000000000000000001221513074500236635ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2010/TestCatch/TestCatch.sln000066400000000000000000000015761221513074500262740ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCatch", "TestCatch\TestCatch.vcxproj", "{A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Debug|Win32.ActiveCfg = Debug|Win32 {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Debug|Win32.Build.0 = Debug|Win32 {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Release|Win32.ActiveCfg = Release|Win32 {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2010/TestCatch/TestCatch/000077500000000000000000000000001221513074500255455ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2010/TestCatch/TestCatch/ReadMe.txt000066400000000000000000000024421221513074500274450ustar00rootroot00000000000000======================================================================== CONSOLE APPLICATION : TestCatch Project Overview ======================================================================== AppWizard has created this TestCatch application for you. This file contains a summary of what you will find in each of the files that make up your TestCatch application. TestCatch.vcproj This is the main project file for VC++ projects generated using an Application Wizard. It contains information about the version of Visual C++ that generated the file, and information about the platforms, configurations, and project features selected with the Application Wizard. TestCatch.cpp This is the main application source file. ///////////////////////////////////////////////////////////////////////////// Other standard files: StdAfx.h, StdAfx.cpp These files are used to build a precompiled header (PCH) file named TestCatch.pch and a precompiled types file named StdAfx.obj. ///////////////////////////////////////////////////////////////////////////// Other notes: AppWizard uses "TODO:" comments to indicate parts of the source code you should add to or customize. ///////////////////////////////////////////////////////////////////////////// Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2010/TestCatch/TestCatch/TestCatch.cpp000066400000000000000000000002051221513074500301300ustar00rootroot00000000000000// TestCatch.cpp : Defines the entry point for the console application. // int main(int argc, char* argv[]) { return 0; } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/VS2010/TestCatch/TestCatch/TestCatch.vcxproj000066400000000000000000000216641221513074500310550ustar00rootroot00000000000000 Debug Win32 Release Win32 {A2F23B19-9CF7-4246-AE58-BC65E39C6F7E} TestCatch Win32Proj Application Unicode true Application Unicode <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ $(Configuration)\ true $(SolutionDir)$(Configuration)\ $(Configuration)\ false AllRules.ruleset AllRules.ruleset Disabled ..\..\..\..\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true Console MachineX86 MaxSpeed true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase ..\..\..\..\include;%(AdditionalIncludeDirectories) true Console true true MachineX86 Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/000077500000000000000000000000001221513074500222335ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/000077500000000000000000000000001221513074500267235ustar00rootroot00000000000000project.pbxproj000066400000000000000000000610771221513074500317330ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ 4A060CEC1362030B00BBA8F8 /* TestMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CE41362030B00BBA8F8 /* TestMain.cpp */; }; 4A060CED1362030B00BBA8F8 /* TrickyTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CE51362030B00BBA8F8 /* TrickyTests.cpp */; }; 4A060CEE1362030B00BBA8F8 /* ExceptionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CE61362030B00BBA8F8 /* ExceptionTests.cpp */; }; 4A060CEF1362030B00BBA8F8 /* ClassTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CE71362030B00BBA8F8 /* ClassTests.cpp */; }; 4A060CF01362030B00BBA8F8 /* MiscTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CE81362030B00BBA8F8 /* MiscTests.cpp */; }; 4A060CF11362030B00BBA8F8 /* ConditionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CE91362030B00BBA8F8 /* ConditionTests.cpp */; }; 4A060CF21362030B00BBA8F8 /* MessageTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CEA1362030B00BBA8F8 /* MessageTests.cpp */; }; 4A060CF31362030B00BBA8F8 /* GeneratorTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A060CEB1362030B00BBA8F8 /* GeneratorTests.cpp */; }; 4A1A232913694D53002FDDE0 /* ApproxTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A1A232813694D53002FDDE0 /* ApproxTests.cpp */; }; 8DD76F6A0486A84900D96B5E /* Test.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* Test.1 */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 8DD76F690486A84900D96B5E /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( 8DD76F6A0486A84900D96B5E /* Test.1 in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 4A060CE41362030B00BBA8F8 /* TestMain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestMain.cpp; path = ../SelfTest/TestMain.cpp; sourceTree = SOURCE_ROOT; }; 4A060CE51362030B00BBA8F8 /* TrickyTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TrickyTests.cpp; path = ../SelfTest/TrickyTests.cpp; sourceTree = SOURCE_ROOT; }; 4A060CE61362030B00BBA8F8 /* ExceptionTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ExceptionTests.cpp; path = ../SelfTest/ExceptionTests.cpp; sourceTree = SOURCE_ROOT; }; 4A060CE71362030B00BBA8F8 /* ClassTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClassTests.cpp; path = ../SelfTest/ClassTests.cpp; sourceTree = SOURCE_ROOT; }; 4A060CE81362030B00BBA8F8 /* MiscTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MiscTests.cpp; path = ../SelfTest/MiscTests.cpp; sourceTree = SOURCE_ROOT; }; 4A060CE91362030B00BBA8F8 /* ConditionTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ConditionTests.cpp; path = ../SelfTest/ConditionTests.cpp; sourceTree = SOURCE_ROOT; }; 4A060CEA1362030B00BBA8F8 /* MessageTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MessageTests.cpp; path = ../SelfTest/MessageTests.cpp; sourceTree = SOURCE_ROOT; }; 4A060CEB1362030B00BBA8F8 /* GeneratorTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GeneratorTests.cpp; path = ../SelfTest/GeneratorTests.cpp; sourceTree = SOURCE_ROOT; }; 4A060CF41362033300BBA8F8 /* catch.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch.hpp; path = ../../include/catch.hpp; sourceTree = SOURCE_ROOT; }; 4A060CF51362033300BBA8F8 /* catch_runner.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_runner.hpp; path = ../../include/catch_runner.hpp; sourceTree = SOURCE_ROOT; }; 4A060CF61362033300BBA8F8 /* catch_with_main.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_with_main.hpp; path = ../../include/catch_with_main.hpp; sourceTree = SOURCE_ROOT; }; 4A060CF71362036F00BBA8F8 /* catch_reporter_xml.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_reporter_xml.hpp; path = ../../include/reporters/catch_reporter_xml.hpp; sourceTree = SOURCE_ROOT; }; 4A060CF81362036F00BBA8F8 /* catch_reporter_basic.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_reporter_basic.hpp; path = ../../include/reporters/catch_reporter_basic.hpp; sourceTree = SOURCE_ROOT; }; 4A060CF91362036F00BBA8F8 /* catch_reporter_junit.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_reporter_junit.hpp; path = ../../include/reporters/catch_reporter_junit.hpp; sourceTree = SOURCE_ROOT; }; 4A060CFA1362038F00BBA8F8 /* catch_exception_translator_registry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_exception_translator_registry.hpp; path = ../../include/internal/catch_exception_translator_registry.hpp; sourceTree = SOURCE_ROOT; }; 4A060CFB1362038F00BBA8F8 /* catch_interfaces_exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_interfaces_exception.h; path = ../../include/internal/catch_interfaces_exception.h; sourceTree = SOURCE_ROOT; }; 4A060CFC136203B800BBA8F8 /* catch_section.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_section.hpp; path = ../../include/internal/catch_section.hpp; sourceTree = SOURCE_ROOT; }; 4A060CFD136203B800BBA8F8 /* catch_runner_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_runner_impl.hpp; path = ../../include/internal/catch_runner_impl.hpp; sourceTree = SOURCE_ROOT; }; 4A060CFE136203B800BBA8F8 /* catch_interfaces_capture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_interfaces_capture.h; path = ../../include/internal/catch_interfaces_capture.h; sourceTree = SOURCE_ROOT; }; 4A060CFF136203B800BBA8F8 /* catch_test_case_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_test_case_info.hpp; path = ../../include/internal/catch_test_case_info.hpp; sourceTree = SOURCE_ROOT; }; 4A060D00136203B800BBA8F8 /* catch_test_registry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_test_registry.hpp; path = ../../include/internal/catch_test_registry.hpp; sourceTree = SOURCE_ROOT; }; 4A060D01136203B800BBA8F8 /* catch_test_case_registry_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_test_case_registry_impl.hpp; path = ../../include/internal/catch_test_case_registry_impl.hpp; sourceTree = SOURCE_ROOT; }; 4A060D02136203B800BBA8F8 /* catch_capture.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_capture.hpp; path = ../../include/internal/catch_capture.hpp; sourceTree = SOURCE_ROOT; }; 4A060D03136203B800BBA8F8 /* catch_hub_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_hub_impl.hpp; path = ../../include/internal/catch_hub_impl.hpp; sourceTree = SOURCE_ROOT; }; 4A060D04136203B800BBA8F8 /* catch_hub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_hub.h; path = ../../include/internal/catch_hub.h; sourceTree = SOURCE_ROOT; }; 4A060D05136203B800BBA8F8 /* catch_interfaces_reporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_interfaces_reporter.h; path = ../../include/internal/catch_interfaces_reporter.h; sourceTree = SOURCE_ROOT; }; 4A060D06136203B800BBA8F8 /* catch_commandline.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_commandline.hpp; path = ../../include/internal/catch_commandline.hpp; sourceTree = SOURCE_ROOT; }; 4A060D07136203B800BBA8F8 /* catch_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_config.hpp; path = ../../include/internal/catch_config.hpp; sourceTree = SOURCE_ROOT; }; 4A060D09136203B800BBA8F8 /* catch_resultinfo.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_resultinfo.hpp; path = ../../include/internal/catch_resultinfo.hpp; sourceTree = SOURCE_ROOT; }; 4A060D0A136203B800BBA8F8 /* catch_result_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_result_type.h; path = ../../include/internal/catch_result_type.h; sourceTree = SOURCE_ROOT; }; 4A060D0B136203B800BBA8F8 /* catch_interfaces_testcase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_interfaces_testcase.h; path = ../../include/internal/catch_interfaces_testcase.h; sourceTree = SOURCE_ROOT; }; 4A060D0C136203B800BBA8F8 /* catch_interfaces_runner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_interfaces_runner.h; path = ../../include/internal/catch_interfaces_runner.h; sourceTree = SOURCE_ROOT; }; 4A060D0D136203B800BBA8F8 /* catch_generators.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_generators.hpp; path = ../../include/internal/catch_generators.hpp; sourceTree = SOURCE_ROOT; }; 4A060D0E136203B800BBA8F8 /* catch_evaluate.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_evaluate.hpp; path = ../../include/internal/catch_evaluate.hpp; sourceTree = SOURCE_ROOT; }; 4A060D0F136203B800BBA8F8 /* catch_debugger.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_debugger.hpp; path = ../../include/internal/catch_debugger.hpp; sourceTree = SOURCE_ROOT; }; 4A060D10136203B800BBA8F8 /* catch_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = catch_common.h; path = ../../include/internal/catch_common.h; sourceTree = SOURCE_ROOT; }; 4A060D11136203B800BBA8F8 /* catch_stream.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_stream.hpp; path = ../../include/internal/catch_stream.hpp; sourceTree = SOURCE_ROOT; }; 4A060D12136203B800BBA8F8 /* catch_list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_list.hpp; path = ../../include/internal/catch_list.hpp; sourceTree = SOURCE_ROOT; }; 4A060D13136203B800BBA8F8 /* catch_reporter_registry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_reporter_registry.hpp; path = ../../include/internal/catch_reporter_registry.hpp; sourceTree = SOURCE_ROOT; }; 4A060D14136203B800BBA8F8 /* catch_reporter_registrars.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_reporter_registrars.hpp; path = ../../include/internal/catch_reporter_registrars.hpp; sourceTree = SOURCE_ROOT; }; 4A060D15136203B800BBA8F8 /* catch_xmlwriter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_xmlwriter.hpp; path = ../../include/internal/catch_xmlwriter.hpp; sourceTree = SOURCE_ROOT; }; 4A060D16136203B800BBA8F8 /* catch_generators_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_generators_impl.hpp; path = ../../include/internal/catch_generators_impl.hpp; sourceTree = SOURCE_ROOT; }; 4A1A22AF136946E0002FDDE0 /* catch_approx.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_approx.hpp; path = ../../include/internal/catch_approx.hpp; sourceTree = SOURCE_ROOT; }; 4A1A232813694D53002FDDE0 /* ApproxTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ApproxTests.cpp; path = ../SelfTest/ApproxTests.cpp; sourceTree = SOURCE_ROOT; }; 4A27F2A813864BA6007B4B4E /* catch_default_main.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_default_main.hpp; path = ../../include/internal/catch_default_main.hpp; sourceTree = SOURCE_ROOT; }; 4A29343D138B8FC900C99100 /* catch_self_test.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_self_test.hpp; path = ../SelfTest/catch_self_test.hpp; sourceTree = SOURCE_ROOT; }; 8DD76F6C0486A84900D96B5E /* Test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Test; sourceTree = BUILT_PRODUCTS_DIR; }; C6859E8B029090EE04C91782 /* Test.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = Test.1; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8DD76F660486A84900D96B5E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 08FB7794FE84155DC02AAC07 /* Test */ = { isa = PBXGroup; children = ( 08FB7795FE84155DC02AAC07 /* Source */, C6859E8C029090F304C91782 /* Documentation */, 1AB674ADFE9D54B511CA2CBB /* Products */, ); name = Test; sourceTree = ""; }; 08FB7795FE84155DC02AAC07 /* Source */ = { isa = PBXGroup; children = ( 4A060CE41362030B00BBA8F8 /* TestMain.cpp */, 4AA7E96C129FA2A0005A0B97 /* Tests */, 4AFC341312809A12003A0C29 /* Catch */, ); name = Source; sourceTree = ""; }; 1AB674ADFE9D54B511CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8DD76F6C0486A84900D96B5E /* Test */, ); name = Products; sourceTree = ""; }; 4A13FF92135EBED500EC5928 /* Exceptions */ = { isa = PBXGroup; children = ( 4A060CFA1362038F00BBA8F8 /* catch_exception_translator_registry.hpp */, 4A060CFB1362038F00BBA8F8 /* catch_interfaces_exception.h */, ); name = Exceptions; sourceTree = ""; }; 4A302E3712D515B700C84B67 /* TestCase registration */ = { isa = PBXGroup; children = ( 4A060CFC136203B800BBA8F8 /* catch_section.hpp */, 4A060D02136203B800BBA8F8 /* catch_capture.hpp */, 4A060CFF136203B800BBA8F8 /* catch_test_case_info.hpp */, 4A060D00136203B800BBA8F8 /* catch_test_registry.hpp */, 4A060D0B136203B800BBA8F8 /* catch_interfaces_testcase.h */, 4A060CFE136203B800BBA8F8 /* catch_interfaces_capture.h */, 4A060D0A136203B800BBA8F8 /* catch_result_type.h */, ); name = "TestCase registration"; sourceTree = ""; }; 4A302E3812D515DF00C84B67 /* Running & Results */ = { isa = PBXGroup; children = ( 4A060D07136203B800BBA8F8 /* catch_config.hpp */, 4A060D09136203B800BBA8F8 /* catch_resultinfo.hpp */, 4A060CFD136203B800BBA8F8 /* catch_runner_impl.hpp */, 4A060D0C136203B800BBA8F8 /* catch_interfaces_runner.h */, 4A060D0D136203B800BBA8F8 /* catch_generators.hpp */, 4A1A22AF136946E0002FDDE0 /* catch_approx.hpp */, 4A27F2A813864BA6007B4B4E /* catch_default_main.hpp */, ); name = "Running & Results"; sourceTree = ""; }; 4A302E3912D5160400C84B67 /* Hub-Impl */ = { isa = PBXGroup; children = ( 4A060D01136203B800BBA8F8 /* catch_test_case_registry_impl.hpp */, 4A060D04136203B800BBA8F8 /* catch_hub.h */, 4A060D03136203B800BBA8F8 /* catch_hub_impl.hpp */, 4A060D16136203B800BBA8F8 /* catch_generators_impl.hpp */, ); name = "Hub-Impl"; sourceTree = ""; }; 4A33BE0C12CE93380052A211 /* reporting */ = { isa = PBXGroup; children = ( 4A060D12136203B800BBA8F8 /* catch_list.hpp */, 4A060D13136203B800BBA8F8 /* catch_reporter_registry.hpp */, 4A060D14136203B800BBA8F8 /* catch_reporter_registrars.hpp */, 4A060D05136203B800BBA8F8 /* catch_interfaces_reporter.h */, ); name = reporting; sourceTree = ""; }; 4A33BE0F12CE936C0052A211 /* support */ = { isa = PBXGroup; children = ( 4A060D06136203B800BBA8F8 /* catch_commandline.hpp */, 4A060D0F136203B800BBA8F8 /* catch_debugger.hpp */, 4A060D10136203B800BBA8F8 /* catch_common.h */, 4A060D15136203B800BBA8F8 /* catch_xmlwriter.hpp */, 4A060D11136203B800BBA8F8 /* catch_stream.hpp */, 4A060D0E136203B800BBA8F8 /* catch_evaluate.hpp */, ); name = support; sourceTree = ""; }; 4AA7E96B129FA282005A0B97 /* Reporters */ = { isa = PBXGroup; children = ( 4A060CF71362036F00BBA8F8 /* catch_reporter_xml.hpp */, 4A060CF81362036F00BBA8F8 /* catch_reporter_basic.hpp */, 4A060CF91362036F00BBA8F8 /* catch_reporter_junit.hpp */, ); name = Reporters; sourceTree = ""; }; 4AA7E96C129FA2A0005A0B97 /* Tests */ = { isa = PBXGroup; children = ( 4A060CE51362030B00BBA8F8 /* TrickyTests.cpp */, 4A060CE61362030B00BBA8F8 /* ExceptionTests.cpp */, 4A060CE71362030B00BBA8F8 /* ClassTests.cpp */, 4A060CE81362030B00BBA8F8 /* MiscTests.cpp */, 4A060CE91362030B00BBA8F8 /* ConditionTests.cpp */, 4A060CEA1362030B00BBA8F8 /* MessageTests.cpp */, 4A060CEB1362030B00BBA8F8 /* GeneratorTests.cpp */, 4A1A232813694D53002FDDE0 /* ApproxTests.cpp */, ); name = Tests; sourceTree = ""; }; 4AFC341312809A12003A0C29 /* Catch */ = { isa = PBXGroup; children = ( 4A29343D138B8FC900C99100 /* catch_self_test.hpp */, 4A060CF41362033300BBA8F8 /* catch.hpp */, 4A060CF51362033300BBA8F8 /* catch_runner.hpp */, 4A060CF61362033300BBA8F8 /* catch_with_main.hpp */, 4AA7E96B129FA282005A0B97 /* Reporters */, 4AFC341412809A1B003A0C29 /* Internal */, ); name = Catch; sourceTree = ""; }; 4AFC341412809A1B003A0C29 /* Internal */ = { isa = PBXGroup; children = ( 4A13FF92135EBED500EC5928 /* Exceptions */, 4A302E3912D5160400C84B67 /* Hub-Impl */, 4A302E3812D515DF00C84B67 /* Running & Results */, 4A302E3712D515B700C84B67 /* TestCase registration */, 4A33BE0F12CE936C0052A211 /* support */, 4A33BE0C12CE93380052A211 /* reporting */, ); name = Internal; sourceTree = ""; }; C6859E8C029090F304C91782 /* Documentation */ = { isa = PBXGroup; children = ( C6859E8B029090EE04C91782 /* Test.1 */, ); name = Documentation; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8DD76F620486A84900D96B5E /* Test */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Test" */; buildPhases = ( 8DD76F640486A84900D96B5E /* Sources */, 8DD76F660486A84900D96B5E /* Frameworks */, 8DD76F690486A84900D96B5E /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = Test; productInstallPath = "$(HOME)/bin"; productName = Test; productReference = 8DD76F6C0486A84900D96B5E /* Test */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "CatchSelfTest" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 08FB7794FE84155DC02AAC07 /* Test */; projectDirPath = ""; projectRoot = ""; targets = ( 8DD76F620486A84900D96B5E /* Test */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 8DD76F640486A84900D96B5E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4A060CEC1362030B00BBA8F8 /* TestMain.cpp in Sources */, 4A060CED1362030B00BBA8F8 /* TrickyTests.cpp in Sources */, 4A060CEE1362030B00BBA8F8 /* ExceptionTests.cpp in Sources */, 4A060CEF1362030B00BBA8F8 /* ClassTests.cpp in Sources */, 4A060CF01362030B00BBA8F8 /* MiscTests.cpp in Sources */, 4A060CF11362030B00BBA8F8 /* ConditionTests.cpp in Sources */, 4A060CF21362030B00BBA8F8 /* MessageTests.cpp in Sources */, 4A060CF31362030B00BBA8F8 /* GeneratorTests.cpp in Sources */, 4A1A232913694D53002FDDE0 /* ApproxTests.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1DEB923208733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = /usr/local/bin; PRODUCT_NAME = Test; }; name = Debug; }; 1DEB923308733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; INSTALL_PATH = /usr/local/bin; PRODUCT_NAME = Test; }; name = Release; }; 1DEB923608733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_GLOBAL_CONSTRUCTORS = NO; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO; GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; GCC_WARN_INHIBIT_ALL_WARNINGS = NO; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_MISSING_PARENTHESES = YES; GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_PEDANTIC = YES; GCC_WARN_PROTOTYPE_CONVERSION = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_STRICT_SELECTOR_MATCH = YES; GCC_WARN_UNINITIALIZED_AUTOS = NO; GCC_WARN_UNKNOWN_PRAGMAS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; SDKROOT = macosx10.6; USER_HEADER_SEARCH_PATHS = ../../include; WARNING_CFLAGS = ( "-Winit-self", "-Wswitch-enum", "-Wunused", "-Wredundant-decls", ); }; name = Debug; }; 1DEB923708733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = macosx10.6; USER_HEADER_SEARCH_PATHS = ../../include; WARNING_CFLAGS = ( "-Winit-self", "-Wswitch-enum", "-Wunused", "-Wredundant-decls", ); }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Test" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923208733DC60010E9CD /* Debug */, 1DEB923308733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "CatchSelfTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923608733DC60010E9CD /* Debug */, 1DEB923708733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; } 000077500000000000000000000000001221513074500326425ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/project.xcworkspacecontents.xcworkspacedata000066400000000000000000000002251221513074500376030ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/project.xcworkspace Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/xcuserdata/000077500000000000000000000000001221513074500310665ustar00rootroot00000000000000000077500000000000000000000000001221513074500342515ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/xcuserdata/phil.xcuserdatad000077500000000000000000000000001221513074500363705ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/xcuserdata/phil.xcuserdatad/xcdebuggerBreakpoints.xcbkptlist000066400000000000000000000060371221513074500427700ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/xcuserdata/phil.xcuserdatad/xcdebugger 000077500000000000000000000000001221513074500362335ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/xcuserdata/phil.xcuserdatad/xcschemesTest.xcscheme000066400000000000000000000123341221513074500406760ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/xcuserdata/phil.xcuserdatad/xcschemes xcschememanagement.plist000066400000000000000000000007341221513074500431500ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTest.xcodeproj/xcuserdata/phil.xcuserdatad/xcschemes SchemeUserState Test.xcscheme orderHint 0 SuppressBuildableAutocreation 8DD76F620486A84900D96B5E primary Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTestSingle/000077500000000000000000000000001221513074500260715ustar00rootroot00000000000000CatchSelfTestSingle.1000066400000000000000000000057761221513074500317510ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTestSingle.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples. .\"See Also: .\"man mdoc.samples for a complete listing of options .\"man mdoc for the short list of editing options .\"/usr/share/misc/mdoc.template .Dd 24/05/2011 \" DATE .Dt CatchSelfTestSingle 1 \" Program name and manual section number .Os Darwin .Sh NAME \" Section Header - required - don't modify .Nm CatchSelfTestSingle, .\" The following lines are read in generating the apropos(man -k) database. Use only key .\" words here as the database is built based on the words here and in the .ND line. .Nm Other_name_for_same_program(), .Nm Yet another name for the same program. .\" Use .Nm macro to designate other names for the documented program. .Nd This line parsed for whatis database. .Sh SYNOPSIS \" Section Header - required - don't modify .Nm .Op Fl abcd \" [-abcd] .Op Fl a Ar path \" [-a path] .Op Ar file \" [file] .Op Ar \" [file ...] .Ar arg0 \" Underlined argument - use .Ar anywhere to underline arg2 ... \" Arguments .Sh DESCRIPTION \" Section Header - required - don't modify Use the .Nm macro to refer to your program throughout the man page like such: .Nm Underlining is accomplished with the .Ar macro like this: .Ar underlined text . .Pp \" Inserts a space A list of items with descriptions: .Bl -tag -width -indent \" Begins a tagged list .It item a \" Each item preceded by .It macro Description of item a .It item b Description of item b .El \" Ends the list .Pp A list of flags and their descriptions: .Bl -tag -width -indent \" Differs from above in tag removed .It Fl a \"-a flag as a list item Description of -a flag .It Fl b Description of -b flag .El \" Ends the list .Pp .\" .Sh ENVIRONMENT \" May not be needed .\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1 .\" .It Ev ENV_VAR_1 .\" Description of ENV_VAR_1 .\" .It Ev ENV_VAR_2 .\" Description of ENV_VAR_2 .\" .El .Sh FILES \" File used or created by the topic of the man page .Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact .It Pa /usr/share/file_name FILE_1 description .It Pa /Users/joeuser/Library/really_long_file_name FILE_2 description .El \" Ends the list .\" .Sh DIAGNOSTICS \" May not be needed .\" .Bl -diag .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .El .Sh SEE ALSO .\" List links in ascending order by section, alphabetically within a section. .\" Please do not reference files that do not exist without filing a bug report .Xr a 1 , .Xr b 1 , .Xr c 1 , .Xr a 2 , .Xr b 2 , .Xr a 3 , .Xr b 3 .\" .Sh BUGS \" Document known, unremedied bugs .\" .Sh HISTORY \" Document history if command behaves in a unique manner 000077500000000000000000000000001221513074500336445ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTestSingle/CatchSelfTestSingle.xcodeprojproject.pbxproj000066400000000000000000000256541221513074500367340ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/CatchSelfTestSingle/CatchSelfTestSingle.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ 4A29349A138B924800C99100 /* MessageTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293490138B924800C99100 /* MessageTests.cpp */; }; 4A29349B138B924800C99100 /* ConditionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293491138B924800C99100 /* ConditionTests.cpp */; }; 4A29349C138B924800C99100 /* TestMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293492138B924800C99100 /* TestMain.cpp */; }; 4A29349D138B924800C99100 /* ApproxTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293494138B924800C99100 /* ApproxTests.cpp */; }; 4A29349E138B924800C99100 /* TrickyTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293495138B924800C99100 /* TrickyTests.cpp */; }; 4A29349F138B924800C99100 /* GeneratorTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293496138B924800C99100 /* GeneratorTests.cpp */; }; 4A2934A0138B924800C99100 /* MiscTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293497138B924800C99100 /* MiscTests.cpp */; }; 4A2934A1138B924800C99100 /* ClassTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293498138B924800C99100 /* ClassTests.cpp */; }; 4A2934A2138B924800C99100 /* ExceptionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A293499138B924800C99100 /* ExceptionTests.cpp */; }; 8DD76F6A0486A84900D96B5E /* CatchSelfTestSingle.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* CatchSelfTestSingle.1 */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 8DD76F690486A84900D96B5E /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( 8DD76F6A0486A84900D96B5E /* CatchSelfTestSingle.1 in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 4A293490138B924800C99100 /* MessageTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MessageTests.cpp; path = ../../SelfTest/MessageTests.cpp; sourceTree = SOURCE_ROOT; }; 4A293491138B924800C99100 /* ConditionTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ConditionTests.cpp; path = ../../SelfTest/ConditionTests.cpp; sourceTree = SOURCE_ROOT; }; 4A293492138B924800C99100 /* TestMain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestMain.cpp; path = ../../SelfTest/TestMain.cpp; sourceTree = SOURCE_ROOT; }; 4A293493138B924800C99100 /* catch_self_test.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_self_test.hpp; path = ../../SelfTest/catch_self_test.hpp; sourceTree = SOURCE_ROOT; }; 4A293494138B924800C99100 /* ApproxTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ApproxTests.cpp; path = ../../SelfTest/ApproxTests.cpp; sourceTree = SOURCE_ROOT; }; 4A293495138B924800C99100 /* TrickyTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TrickyTests.cpp; path = ../../SelfTest/TrickyTests.cpp; sourceTree = SOURCE_ROOT; }; 4A293496138B924800C99100 /* GeneratorTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GeneratorTests.cpp; path = ../../SelfTest/GeneratorTests.cpp; sourceTree = SOURCE_ROOT; }; 4A293497138B924800C99100 /* MiscTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MiscTests.cpp; path = ../../SelfTest/MiscTests.cpp; sourceTree = SOURCE_ROOT; }; 4A293498138B924800C99100 /* ClassTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClassTests.cpp; path = ../../SelfTest/ClassTests.cpp; sourceTree = SOURCE_ROOT; }; 4A293499138B924800C99100 /* ExceptionTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ExceptionTests.cpp; path = ../../SelfTest/ExceptionTests.cpp; sourceTree = SOURCE_ROOT; }; 4A2934A5138B925A00C99100 /* catch.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch.hpp; path = ../../../single_include/catch.hpp; sourceTree = SOURCE_ROOT; }; 8DD76F6C0486A84900D96B5E /* CatchSelfTestSingle */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CatchSelfTestSingle; sourceTree = BUILT_PRODUCTS_DIR; }; C6859E8B029090EE04C91782 /* CatchSelfTestSingle.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = CatchSelfTestSingle.1; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8DD76F660486A84900D96B5E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 08FB7794FE84155DC02AAC07 /* CatchSelfTestSingle */ = { isa = PBXGroup; children = ( 08FB7795FE84155DC02AAC07 /* Source */, C6859E8C029090F304C91782 /* Documentation */, 1AB674ADFE9D54B511CA2CBB /* Products */, ); name = CatchSelfTestSingle; sourceTree = ""; }; 08FB7795FE84155DC02AAC07 /* Source */ = { isa = PBXGroup; children = ( 4A2934A5138B925A00C99100 /* catch.hpp */, 4A293490138B924800C99100 /* MessageTests.cpp */, 4A293491138B924800C99100 /* ConditionTests.cpp */, 4A293492138B924800C99100 /* TestMain.cpp */, 4A293493138B924800C99100 /* catch_self_test.hpp */, 4A293494138B924800C99100 /* ApproxTests.cpp */, 4A293495138B924800C99100 /* TrickyTests.cpp */, 4A293496138B924800C99100 /* GeneratorTests.cpp */, 4A293497138B924800C99100 /* MiscTests.cpp */, 4A293498138B924800C99100 /* ClassTests.cpp */, 4A293499138B924800C99100 /* ExceptionTests.cpp */, ); name = Source; sourceTree = ""; }; 1AB674ADFE9D54B511CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8DD76F6C0486A84900D96B5E /* CatchSelfTestSingle */, ); name = Products; sourceTree = ""; }; C6859E8C029090F304C91782 /* Documentation */ = { isa = PBXGroup; children = ( C6859E8B029090EE04C91782 /* CatchSelfTestSingle.1 */, ); name = Documentation; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8DD76F620486A84900D96B5E /* CatchSelfTestSingle */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "CatchSelfTestSingle" */; buildPhases = ( 8DD76F640486A84900D96B5E /* Sources */, 8DD76F660486A84900D96B5E /* Frameworks */, 8DD76F690486A84900D96B5E /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = CatchSelfTestSingle; productInstallPath = "$(HOME)/bin"; productName = CatchSelfTestSingle; productReference = 8DD76F6C0486A84900D96B5E /* CatchSelfTestSingle */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "CatchSelfTestSingle" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 08FB7794FE84155DC02AAC07 /* CatchSelfTestSingle */; projectDirPath = ""; projectRoot = ""; targets = ( 8DD76F620486A84900D96B5E /* CatchSelfTestSingle */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 8DD76F640486A84900D96B5E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4A29349A138B924800C99100 /* MessageTests.cpp in Sources */, 4A29349B138B924800C99100 /* ConditionTests.cpp in Sources */, 4A29349C138B924800C99100 /* TestMain.cpp in Sources */, 4A29349D138B924800C99100 /* ApproxTests.cpp in Sources */, 4A29349E138B924800C99100 /* TrickyTests.cpp in Sources */, 4A29349F138B924800C99100 /* GeneratorTests.cpp in Sources */, 4A2934A0138B924800C99100 /* MiscTests.cpp in Sources */, 4A2934A1138B924800C99100 /* ClassTests.cpp in Sources */, 4A2934A2138B924800C99100 /* ExceptionTests.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1DEB923208733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = /usr/local/bin; PRODUCT_NAME = CatchSelfTestSingle; }; name = Debug; }; 1DEB923308733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; INSTALL_PATH = /usr/local/bin; PRODUCT_NAME = CatchSelfTestSingle; }; name = Release; }; 1DEB923608733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; SDKROOT = macosx10.6; }; name = Debug; }; 1DEB923708733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = macosx10.6; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "CatchSelfTestSingle" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923208733DC60010E9CD /* Debug */, 1DEB923308733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "CatchSelfTestSingle" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923608733DC60010E9CD /* Debug */, 1DEB923708733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/000077500000000000000000000000001221513074500233745ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/CatchOCTestCase.h000066400000000000000000000011051221513074500264420ustar00rootroot00000000000000// // CatchOCTestCase.h // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef TWOBLUECUBES_CATCHOCTESTCASE_H_INCLUDED #define TWOBLUECUBES_CATCHOCTESTCASE_H_INCLUDED #include "catch.hpp" #import #import "TestObj.h" @interface TestFixture : NSObject { TestObj* obj; } @end #endif // TWOBLUECUBES_CATCHOCTESTCASE_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/CatchOCTestCase.mm000066400000000000000000000014141221513074500266270ustar00rootroot00000000000000// // CatchOCTestCase.mm // OCTest // // Created by Phil Nash on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #import "CatchOCTestCase.h" @implementation TestFixture -(void) setUp { obj = [[TestObj alloc] init]; } -(void) tearDown { [obj release]; } OC_TEST_CASE( "OCTest/test1", "This is a test case" ) { REQUIRE( obj.int_val == 0 ); obj.int_val = 1; REQUIRE( obj.int_val == 1 ); } OC_TEST_CASE( "OCTest/test2", "This is another test case" ) { REQUIRE( obj.int_val == 0 ); obj.int_val = 2; REQUIRE( obj.int_val == 2 ); } @end Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/Main.mm000066400000000000000000000000361221513074500246120ustar00rootroot00000000000000#import "catch_with_main.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/OCTest.1000066400000000000000000000057431221513074500246300ustar00rootroot00000000000000.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples. .\"See Also: .\"man mdoc.samples for a complete listing of options .\"man mdoc for the short list of editing options .\"/usr/share/misc/mdoc.template .Dd 13/11/2010 \" DATE .Dt OCTest 1 \" Program name and manual section number .Os Darwin .Sh NAME \" Section Header - required - don't modify .Nm OCTest, .\" The following lines are read in generating the apropos(man -k) database. Use only key .\" words here as the database is built based on the words here and in the .ND line. .Nm Other_name_for_same_program(), .Nm Yet another name for the same program. .\" Use .Nm macro to designate other names for the documented program. .Nd This line parsed for whatis database. .Sh SYNOPSIS \" Section Header - required - don't modify .Nm .Op Fl abcd \" [-abcd] .Op Fl a Ar path \" [-a path] .Op Ar file \" [file] .Op Ar \" [file ...] .Ar arg0 \" Underlined argument - use .Ar anywhere to underline arg2 ... \" Arguments .Sh DESCRIPTION \" Section Header - required - don't modify Use the .Nm macro to refer to your program throughout the man page like such: .Nm Underlining is accomplished with the .Ar macro like this: .Ar underlined text . .Pp \" Inserts a space A list of items with descriptions: .Bl -tag -width -indent \" Begins a tagged list .It item a \" Each item preceded by .It macro Description of item a .It item b Description of item b .El \" Ends the list .Pp A list of flags and their descriptions: .Bl -tag -width -indent \" Differs from above in tag removed .It Fl a \"-a flag as a list item Description of -a flag .It Fl b Description of -b flag .El \" Ends the list .Pp .\" .Sh ENVIRONMENT \" May not be needed .\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1 .\" .It Ev ENV_VAR_1 .\" Description of ENV_VAR_1 .\" .It Ev ENV_VAR_2 .\" Description of ENV_VAR_2 .\" .El .Sh FILES \" File used or created by the topic of the man page .Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact .It Pa /usr/share/file_name FILE_1 description .It Pa /Users/joeuser/Library/really_long_file_name FILE_2 description .El \" Ends the list .\" .Sh DIAGNOSTICS \" May not be needed .\" .Bl -diag .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .El .Sh SEE ALSO .\" List links in ascending order by section, alphabetically within a section. .\" Please do not reference files that do not exist without filing a bug report .Xr a 1 , .Xr b 1 , .Xr c 1 , .Xr a 2 , .Xr b 2 , .Xr a 3 , .Xr b 3 .\" .Sh BUGS \" Document known, unremedied bugs .\" .Sh HISTORY \" Document history if command behaves in a unique mannerCatch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/OCTest.mm000066400000000000000000000010521221513074500250660ustar00rootroot00000000000000/* * OCTest.mm * OCTest * * Created by Phil on 13/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ #import "catch.hpp" #import "TestObj.h" TEST_CASE( "OCTest/TestObj", "tests TestObj" ) { TestObj* obj = [[TestObj alloc] init]; REQUIRE( obj.int_val == 0 ); obj.int_val = 1; REQUIRE( obj.int_val == 1 ); [obj release]; } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/OCTest.xcodeproj/000077500000000000000000000000001221513074500265315ustar00rootroot00000000000000project.pbxproj000066400000000000000000000241751221513074500315370ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/OCTest.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ 4A5953B5128E95B8009DC1B9 /* TestObj.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A5953B4128E95B8009DC1B9 /* TestObj.m */; }; 4A5953B7128E95D6009DC1B9 /* OCTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4A5953B6128E95D6009DC1B9 /* OCTest.mm */; }; 4A5953F1128E9A61009DC1B9 /* CatchOCTestCase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4A5953F0128E9A61009DC1B9 /* CatchOCTestCase.mm */; }; 8DD76F9A0486AA7600D96B5E /* Main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* Main.mm */; settings = {ATTRIBUTES = (); }; }; 8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; }; 8DD76F9F0486AA7600D96B5E /* OCTest.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859EA3029092ED04C91782 /* OCTest.1 */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 8DD76F9E0486AA7600D96B5E /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( 8DD76F9F0486AA7600D96B5E /* OCTest.1 in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 08FB7796FE84155DC02AAC07 /* Main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Main.mm; sourceTree = ""; }; 08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32A70AAB03705E1F00C91783 /* OCTest_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCTest_Prefix.pch; sourceTree = ""; }; 4A5953B3128E95B8009DC1B9 /* TestObj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestObj.h; sourceTree = ""; }; 4A5953B4128E95B8009DC1B9 /* TestObj.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestObj.m; sourceTree = ""; }; 4A5953B6128E95D6009DC1B9 /* OCTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OCTest.mm; sourceTree = ""; }; 4A5953EF128E9A61009DC1B9 /* CatchOCTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CatchOCTestCase.h; sourceTree = ""; }; 4A5953F0128E9A61009DC1B9 /* CatchOCTestCase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CatchOCTestCase.mm; sourceTree = ""; }; 4A97DB2813673E3100C8087C /* catch_objc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_objc.hpp; path = ../../../include/internal/catch_objc.hpp; sourceTree = SOURCE_ROOT; }; 4A97DB2B13673E4700C8087C /* catch.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch.hpp; path = ../../../include/catch.hpp; sourceTree = SOURCE_ROOT; }; 4A97DB3613673EA300C8087C /* catch_with_main.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_with_main.hpp; path = ../../../include/catch_with_main.hpp; sourceTree = SOURCE_ROOT; }; 8DD76FA10486AA7600D96B5E /* OCTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = OCTest; sourceTree = BUILT_PRODUCTS_DIR; }; C6859EA3029092ED04C91782 /* OCTest.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = OCTest.1; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8DD76F9B0486AA7600D96B5E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 08FB7794FE84155DC02AAC07 /* OCTest */ = { isa = PBXGroup; children = ( 08FB7795FE84155DC02AAC07 /* Source */, C6859EA2029092E104C91782 /* Documentation */, 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */, 1AB674ADFE9D54B511CA2CBB /* Products */, ); name = OCTest; sourceTree = ""; }; 08FB7795FE84155DC02AAC07 /* Source */ = { isa = PBXGroup; children = ( 4AFDF58212CA9E2800F15202 /* Catch */, 32A70AAB03705E1F00C91783 /* OCTest_Prefix.pch */, 08FB7796FE84155DC02AAC07 /* Main.mm */, 4A5953B3128E95B8009DC1B9 /* TestObj.h */, 4A5953B4128E95B8009DC1B9 /* TestObj.m */, 4A5953B6128E95D6009DC1B9 /* OCTest.mm */, 4A5953EF128E9A61009DC1B9 /* CatchOCTestCase.h */, 4A5953F0128E9A61009DC1B9 /* CatchOCTestCase.mm */, ); name = Source; sourceTree = ""; }; 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( 08FB779EFE84155DC02AAC07 /* Foundation.framework */, ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 1AB674ADFE9D54B511CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8DD76FA10486AA7600D96B5E /* OCTest */, ); name = Products; sourceTree = ""; }; 4AFDF58212CA9E2800F15202 /* Catch */ = { isa = PBXGroup; children = ( 4A97DB3613673EA300C8087C /* catch_with_main.hpp */, 4A97DB2B13673E4700C8087C /* catch.hpp */, 4A97DB2813673E3100C8087C /* catch_objc.hpp */, ); name = Catch; sourceTree = ""; }; C6859EA2029092E104C91782 /* Documentation */ = { isa = PBXGroup; children = ( C6859EA3029092ED04C91782 /* OCTest.1 */, ); name = Documentation; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8DD76F960486AA7600D96B5E /* OCTest */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "OCTest" */; buildPhases = ( 8DD76F990486AA7600D96B5E /* Sources */, 8DD76F9B0486AA7600D96B5E /* Frameworks */, 8DD76F9E0486AA7600D96B5E /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = OCTest; productInstallPath = "$(HOME)/bin"; productName = OCTest; productReference = 8DD76FA10486AA7600D96B5E /* OCTest */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "OCTest" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 08FB7794FE84155DC02AAC07 /* OCTest */; projectDirPath = ""; projectRoot = ""; targets = ( 8DD76F960486AA7600D96B5E /* OCTest */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 8DD76F990486AA7600D96B5E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 8DD76F9A0486AA7600D96B5E /* Main.mm in Sources */, 4A5953B5128E95B8009DC1B9 /* TestObj.m in Sources */, 4A5953B7128E95D6009DC1B9 /* OCTest.mm in Sources */, 4A5953F1128E9A61009DC1B9 /* CatchOCTestCase.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1DEB927508733DD40010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = OCTest_Prefix.pch; INSTALL_PATH = /usr/local/bin; PRODUCT_NAME = OCTest; }; name = Debug; }; 1DEB927608733DD40010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = OCTest_Prefix.pch; INSTALL_PATH = /usr/local/bin; PRODUCT_NAME = OCTest; }; name = Release; }; 1DEB927908733DD40010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; SDKROOT = macosx10.6; USER_HEADER_SEARCH_PATHS = ../../../include; }; name = Debug; }; 1DEB927A08733DD40010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = macosx10.6; USER_HEADER_SEARCH_PATHS = ../../../include; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "OCTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB927508733DD40010E9CD /* Debug */, 1DEB927608733DD40010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "OCTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB927908733DD40010E9CD /* Debug */, 1DEB927A08733DD40010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/OCTest_Prefix.pch000066400000000000000000000002321221513074500265430ustar00rootroot00000000000000// // Prefix header for all source files of the 'OCTest' target in the 'OCTest' project. // #ifdef __OBJC__ #import #endif Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/TestObj.h000066400000000000000000000010311221513074500251120ustar00rootroot00000000000000// // TestObj.h // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef TWOBLUECUBES_TESTOBJ_H_INCLUDED #define TWOBLUECUBES_TESTOBJ_H_INCLUDED #import @interface TestObj : NSObject { int int_val; } @property (nonatomic, assign ) int int_val; @end #endif // TWOBLUECUBES_TESTOBJ_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode3/OCTest/TestObj.m000066400000000000000000000005471221513074500251320ustar00rootroot00000000000000// // TestObj.m // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #import "TestObj.h" @implementation TestObj @synthesize int_val; @end Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/000077500000000000000000000000001221513074500222345ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/000077500000000000000000000000001221513074500247305ustar00rootroot00000000000000000077500000000000000000000000001221513074500313415ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeprojproject.pbxproj000066400000000000000000001415711221513074500344260ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 266B06B816F3A60A004ED264 /* VariadicMacrosTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */; }; 266E9AD617290E8E0061DAB2 /* CmdLineTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266E9AD417290E8E0061DAB2 /* CmdLineTests.cpp */; }; 266ECD74170F3C620030D735 /* BDDTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266ECD73170F3C620030D735 /* BDDTests.cpp */; }; 26847E5F16BBADB40043B9C1 /* catch_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26847E5D16BBADB40043B9C1 /* catch_message.cpp */; }; 26948286179A9AB900ED166E /* SectionTrackerTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26948284179A9AB900ED166E /* SectionTrackerTests.cpp */; }; 2694A1FD16A0000E004816E3 /* catch_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2694A1FB16A0000E004816E3 /* catch_text.cpp */; }; 4A45DA2416161EF9004F8D6B /* catch_console_colour.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA2316161EF9004F8D6B /* catch_console_colour.cpp */; }; 4A45DA2716161F1F004F8D6B /* catch_ptr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA2616161F1F004F8D6B /* catch_ptr.cpp */; }; 4A45DA2916161F3D004F8D6B /* catch_streambuf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA2816161F3D004F8D6B /* catch_streambuf.cpp */; }; 4A45DA2B16161F79004F8D6B /* catch_interfaces_registry_hub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA2A16161F79004F8D6B /* catch_interfaces_registry_hub.cpp */; }; 4A45DA2D16161FA2004F8D6B /* catch_interfaces_capture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA2C16161FA2004F8D6B /* catch_interfaces_capture.cpp */; }; 4A45DA3116161FFC004F8D6B /* catch_interfaces_reporter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA3016161FFB004F8D6B /* catch_interfaces_reporter.cpp */; }; 4A45DA3316162047004F8D6B /* catch_interfaces_exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA3216162047004F8D6B /* catch_interfaces_exception.cpp */; }; 4A45DA3516162071004F8D6B /* catch_interfaces_runner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A45DA3416162071004F8D6B /* catch_interfaces_runner.cpp */; }; 4A6D0C27149B3D3B00DB3EAA /* CatchSelfTest.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4A6D0C26149B3D3B00DB3EAA /* CatchSelfTest.1 */; }; 4A6D0C37149B3D9E00DB3EAA /* ApproxTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C2D149B3D9E00DB3EAA /* ApproxTests.cpp */; }; 4A6D0C38149B3D9E00DB3EAA /* ClassTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C2F149B3D9E00DB3EAA /* ClassTests.cpp */; }; 4A6D0C39149B3D9E00DB3EAA /* ConditionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C30149B3D9E00DB3EAA /* ConditionTests.cpp */; }; 4A6D0C3A149B3D9E00DB3EAA /* ExceptionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C31149B3D9E00DB3EAA /* ExceptionTests.cpp */; }; 4A6D0C3B149B3D9E00DB3EAA /* GeneratorTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C32149B3D9E00DB3EAA /* GeneratorTests.cpp */; }; 4A6D0C3C149B3D9E00DB3EAA /* MessageTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C33149B3D9E00DB3EAA /* MessageTests.cpp */; }; 4A6D0C3D149B3D9E00DB3EAA /* MiscTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C34149B3D9E00DB3EAA /* MiscTests.cpp */; }; 4A6D0C3E149B3D9E00DB3EAA /* TestMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C35149B3D9E00DB3EAA /* TestMain.cpp */; }; 4A6D0C3F149B3D9E00DB3EAA /* TrickyTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D0C36149B3D9E00DB3EAA /* TrickyTests.cpp */; }; 4A8E4DD2160A352200194CBD /* catch_tags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A8E4DD0160A352200194CBD /* catch_tags.cpp */; }; 4AB3D99D1616216500C9A0F8 /* catch_interfaces_testcase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AB3D99C1616216500C9A0F8 /* catch_interfaces_testcase.cpp */; }; 4AB3D9A01616219100C9A0F8 /* catch_interfaces_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AB3D99F1616219100C9A0F8 /* catch_interfaces_config.cpp */; }; 4AB3D9A2161621B500C9A0F8 /* catch_interfaces_generators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AB3D9A1161621B500C9A0F8 /* catch_interfaces_generators.cpp */; }; 4ACE21CC166CA1B300FB5509 /* catch_option.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4ACE21CA166CA1B300FB5509 /* catch_option.cpp */; }; 4AE1840B14EE4F230066340D /* catch_self_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AE1840A14EE4F230066340D /* catch_self_test.cpp */; }; 4AEE032016142F910071E950 /* catch_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AEE031F16142F910071E950 /* catch_common.cpp */; }; 4AEE032316142FC70071E950 /* catch_debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AEE032216142FC70071E950 /* catch_debugger.cpp */; }; 4AEE032516142FF10071E950 /* catch_stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AEE032416142FF10071E950 /* catch_stream.cpp */; }; 4AEE0328161434FD0071E950 /* catch_xmlwriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AEE0327161434FD0071E950 /* catch_xmlwriter.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 4A6D0C1E149B3D3B00DB3EAA /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( 4A6D0C27149B3D3B00DB3EAA /* CatchSelfTest.1 in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 263FD06017AF8DF200988A20 /* catch_timer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_timer.hpp; sourceTree = ""; }; 263FD06117AF8DF200988A20 /* catch_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_timer.h; sourceTree = ""; }; 266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VariadicMacrosTests.cpp; path = ../../../SelfTest/VariadicMacrosTests.cpp; sourceTree = ""; }; 266E9AD117230ACF0061DAB2 /* catch_text.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_text.hpp; sourceTree = ""; }; 266E9AD417290E8E0061DAB2 /* CmdLineTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CmdLineTests.cpp; path = ../../../SelfTest/CmdLineTests.cpp; sourceTree = ""; }; 266ECD73170F3C620030D735 /* BDDTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BDDTests.cpp; path = ../../../SelfTest/BDDTests.cpp; sourceTree = ""; }; 266ECD8C1713614B0030D735 /* catch_legacy_reporter_adapter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_legacy_reporter_adapter.hpp; sourceTree = ""; }; 266ECD8D1713614B0030D735 /* catch_legacy_reporter_adapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_legacy_reporter_adapter.h; sourceTree = ""; }; 26759472171C72A400A84BD1 /* catch_sfinae.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_sfinae.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 26759473171C74C200A84BD1 /* catch_compiler_capabilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = catch_compiler_capabilities.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 26847E5B16BBAB790043B9C1 /* catch_message.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_message.h; sourceTree = ""; }; 26847E5C16BBACB60043B9C1 /* catch_message.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_message.hpp; sourceTree = ""; }; 26847E5D16BBADB40043B9C1 /* catch_message.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_message.cpp; path = ../../../SelfTest/SurrogateCpps/catch_message.cpp; sourceTree = ""; }; 26948284179A9AB900ED166E /* SectionTrackerTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SectionTrackerTests.cpp; path = ../../../SelfTest/SectionTrackerTests.cpp; sourceTree = ""; }; 26948287179EF7F900ED166E /* catch_test_case_tracker.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_test_case_tracker.hpp; sourceTree = ""; }; 2694A1FB16A0000E004816E3 /* catch_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = catch_text.cpp; sourceTree = ""; }; 26AEAF1617BEA18E009E32C9 /* catch_platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_platform.h; sourceTree = ""; }; 26C5F3EC17514B970056FB3C /* clara.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = clara.h; path = ../../../../include/internal/clara.h; sourceTree = ""; }; 26DACF2F17206D3400A21326 /* catch_text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_text.h; sourceTree = ""; }; 4A084F1C15DACEEA0027E631 /* catch_test_case_info.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_test_case_info.hpp; sourceTree = ""; }; 4A084F1D15DAD15F0027E631 /* catch_test_spec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_test_spec.h; sourceTree = ""; }; 4A3D7DD01503869D005F9203 /* catch_matchers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_matchers.hpp; sourceTree = ""; }; 4A45DA2316161EF9004F8D6B /* catch_console_colour.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_console_colour.cpp; path = ../../../SelfTest/SurrogateCpps/catch_console_colour.cpp; sourceTree = ""; }; 4A45DA2616161F1F004F8D6B /* catch_ptr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_ptr.cpp; path = ../../../SelfTest/SurrogateCpps/catch_ptr.cpp; sourceTree = ""; }; 4A45DA2816161F3D004F8D6B /* catch_streambuf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_streambuf.cpp; path = ../../../SelfTest/SurrogateCpps/catch_streambuf.cpp; sourceTree = ""; }; 4A45DA2A16161F79004F8D6B /* catch_interfaces_registry_hub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_registry_hub.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_registry_hub.cpp; sourceTree = ""; }; 4A45DA2C16161FA2004F8D6B /* catch_interfaces_capture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_capture.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_capture.cpp; sourceTree = ""; }; 4A45DA3016161FFB004F8D6B /* catch_interfaces_reporter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_reporter.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_reporter.cpp; sourceTree = ""; }; 4A45DA3216162047004F8D6B /* catch_interfaces_exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_exception.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_exception.cpp; sourceTree = ""; }; 4A45DA3416162071004F8D6B /* catch_interfaces_runner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_runner.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_runner.cpp; sourceTree = ""; }; 4A4B0F9715CE6CFB00AE2392 /* catch_registry_hub.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_registry_hub.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A4B0F9915CE6EC100AE2392 /* catch_interfaces_registry_hub.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = catch_interfaces_registry_hub.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4A4B0F9A15CEF84800AE2392 /* catch_notimplemented_exception.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_notimplemented_exception.h; sourceTree = ""; }; 4A4B0F9B15CEF8C400AE2392 /* catch_notimplemented_exception.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_notimplemented_exception.hpp; sourceTree = ""; }; 4A4B0F9C15CEFA8300AE2392 /* catch_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_impl.hpp; sourceTree = ""; }; 4A6D0C20149B3D3B00DB3EAA /* CatchSelfTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CatchSelfTest; sourceTree = BUILT_PRODUCTS_DIR; }; 4A6D0C26149B3D3B00DB3EAA /* CatchSelfTest.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = CatchSelfTest.1; sourceTree = ""; }; 4A6D0C2D149B3D9E00DB3EAA /* ApproxTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ApproxTests.cpp; path = ../../../SelfTest/ApproxTests.cpp; sourceTree = ""; }; 4A6D0C2E149B3D9E00DB3EAA /* catch_self_test.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; name = catch_self_test.hpp; path = ../../../SelfTest/catch_self_test.hpp; sourceTree = ""; }; 4A6D0C2F149B3D9E00DB3EAA /* ClassTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClassTests.cpp; path = ../../../SelfTest/ClassTests.cpp; sourceTree = ""; }; 4A6D0C30149B3D9E00DB3EAA /* ConditionTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ConditionTests.cpp; path = ../../../SelfTest/ConditionTests.cpp; sourceTree = ""; }; 4A6D0C31149B3D9E00DB3EAA /* ExceptionTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ExceptionTests.cpp; path = ../../../SelfTest/ExceptionTests.cpp; sourceTree = ""; }; 4A6D0C32149B3D9E00DB3EAA /* GeneratorTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GeneratorTests.cpp; path = ../../../SelfTest/GeneratorTests.cpp; sourceTree = ""; }; 4A6D0C33149B3D9E00DB3EAA /* MessageTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MessageTests.cpp; path = ../../../SelfTest/MessageTests.cpp; sourceTree = ""; }; 4A6D0C34149B3D9E00DB3EAA /* MiscTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MiscTests.cpp; path = ../../../SelfTest/MiscTests.cpp; sourceTree = ""; }; 4A6D0C35149B3D9E00DB3EAA /* TestMain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestMain.cpp; path = ../../../SelfTest/TestMain.cpp; sourceTree = ""; }; 4A6D0C36149B3D9E00DB3EAA /* TrickyTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TrickyTests.cpp; path = ../../../SelfTest/TrickyTests.cpp; sourceTree = ""; }; 4A6D0C42149B3E1500DB3EAA /* catch_runner.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; name = catch_runner.hpp; path = ../../../../include/catch_runner.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A6D0C43149B3E1500DB3EAA /* catch_with_main.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_with_main.hpp; path = ../../../../include/catch_with_main.hpp; sourceTree = ""; }; 4A6D0C44149B3E1500DB3EAA /* catch.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch.hpp; path = ../../../../include/catch.hpp; sourceTree = ""; }; 4A6D0C46149B3E3D00DB3EAA /* catch_approx.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_approx.hpp; sourceTree = ""; }; 4A6D0C47149B3E3D00DB3EAA /* catch_capture.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_capture.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A6D0C48149B3E3D00DB3EAA /* catch_commandline.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_commandline.hpp; sourceTree = ""; }; 4A6D0C49149B3E3D00DB3EAA /* catch_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_common.h; sourceTree = ""; }; 4A6D0C4A149B3E3D00DB3EAA /* catch_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_config.hpp; sourceTree = ""; }; 4A6D0C4B149B3E3D00DB3EAA /* catch_debugger.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_debugger.hpp; sourceTree = ""; }; 4A6D0C4C149B3E3D00DB3EAA /* catch_default_main.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_default_main.hpp; sourceTree = ""; }; 4A6D0C4D149B3E3D00DB3EAA /* catch_evaluate.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_evaluate.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A6D0C4E149B3E3D00DB3EAA /* catch_exception_translator_registry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_exception_translator_registry.hpp; sourceTree = ""; }; 4A6D0C4F149B3E3D00DB3EAA /* catch_generators.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_generators.hpp; sourceTree = ""; }; 4A6D0C50149B3E3D00DB3EAA /* catch_generators_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_generators_impl.hpp; sourceTree = ""; }; 4A6D0C51149B3E3D00DB3EAA /* catch_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_context.h; sourceTree = ""; }; 4A6D0C52149B3E3D00DB3EAA /* catch_context_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_context_impl.hpp; sourceTree = ""; }; 4A6D0C53149B3E3D00DB3EAA /* catch_interfaces_capture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_interfaces_capture.h; sourceTree = ""; }; 4A6D0C54149B3E3D00DB3EAA /* catch_interfaces_exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = catch_interfaces_exception.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4A6D0C55149B3E3D00DB3EAA /* catch_interfaces_reporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_interfaces_reporter.h; sourceTree = ""; }; 4A6D0C56149B3E3D00DB3EAA /* catch_interfaces_runner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_interfaces_runner.h; sourceTree = ""; }; 4A6D0C57149B3E3D00DB3EAA /* catch_interfaces_testcase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_interfaces_testcase.h; sourceTree = ""; }; 4A6D0C58149B3E3D00DB3EAA /* catch_list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_list.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A6D0C59149B3E3D00DB3EAA /* catch_objc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_objc.hpp; sourceTree = ""; }; 4A6D0C5A149B3E3D00DB3EAA /* catch_reporter_registrars.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_reporter_registrars.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A6D0C5B149B3E3D00DB3EAA /* catch_reporter_registry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_reporter_registry.hpp; sourceTree = ""; }; 4A6D0C5C149B3E3D00DB3EAA /* catch_result_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_result_type.h; sourceTree = ""; }; 4A6D0C5D149B3E3D00DB3EAA /* catch_assertionresult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = catch_assertionresult.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4A6D0C5E149B3E3D00DB3EAA /* catch_runner_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_runner_impl.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A6D0C5F149B3E3D00DB3EAA /* catch_section.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_section.hpp; sourceTree = ""; }; 4A6D0C60149B3E3D00DB3EAA /* catch_stream.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_stream.hpp; sourceTree = ""; }; 4A6D0C61149B3E3D00DB3EAA /* catch_test_case_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_test_case_info.h; sourceTree = ""; }; 4A6D0C62149B3E3D00DB3EAA /* catch_test_case_registry_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_test_case_registry_impl.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A6D0C63149B3E3D00DB3EAA /* catch_test_registry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_test_registry.hpp; sourceTree = ""; }; 4A6D0C64149B3E3D00DB3EAA /* catch_xmlwriter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_xmlwriter.hpp; sourceTree = ""; }; 4A6D0C67149B3E3D00DB3EAA /* catch_reporter_junit.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_reporter_junit.hpp; sourceTree = ""; }; 4A6D0C68149B3E3D00DB3EAA /* catch_reporter_xml.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_reporter_xml.hpp; sourceTree = ""; }; 4A7ADB4314F631E10094FE10 /* catch_totals.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_totals.hpp; sourceTree = ""; }; 4A7DB2CD1652FE4B00FA6523 /* catch_version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = catch_version.h; path = ../../../../include/internal/catch_version.h; sourceTree = ""; }; 4A8E4DCC160A344100194CBD /* catch_tags.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_tags.hpp; sourceTree = ""; }; 4A8E4DD0160A352200194CBD /* catch_tags.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_tags.cpp; path = ../../../SelfTest/SurrogateCpps/catch_tags.cpp; sourceTree = ""; }; 4A90B59B15D0F61A00EF71BC /* catch_interfaces_generators.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_interfaces_generators.h; sourceTree = ""; }; 4A90B59D15D24FE900EF71BC /* catch_assertionresult.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_assertionresult.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A90B59E15D2521E00EF71BC /* catch_expressionresult_builder.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_expressionresult_builder.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4A9D84B11558FC0400FBB209 /* catch_tostring.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_tostring.hpp; sourceTree = ""; }; 4A9D84B315599AC900FBB209 /* catch_expressionresult_builder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = catch_expressionresult_builder.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4AA7B8B4165428BA003155F6 /* catch_version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = catch_version.hpp; path = ../../../../include/internal/catch_version.hpp; sourceTree = ""; }; 4AB1C73514F97BDA00F31DF7 /* catch_console_colour_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_console_colour_impl.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4AB1C73714F97C1300F31DF7 /* catch_console_colour.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_console_colour.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4AB3D99C1616216500C9A0F8 /* catch_interfaces_testcase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_testcase.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_testcase.cpp; sourceTree = ""; }; 4AB3D99F1616219100C9A0F8 /* catch_interfaces_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_config.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_config.cpp; sourceTree = ""; }; 4AB3D9A1161621B500C9A0F8 /* catch_interfaces_generators.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_interfaces_generators.cpp; path = ../../../SelfTest/SurrogateCpps/catch_interfaces_generators.cpp; sourceTree = ""; }; 4AB42F84166F3E1A0099F2C8 /* catch_reporter_console.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_reporter_console.hpp; sourceTree = ""; }; 4AB77CB51551AEA200857BF0 /* catch_ptr.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_ptr.hpp; sourceTree = ""; }; 4AB77CB71553B72B00857BF0 /* catch_section_info.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_section_info.hpp; sourceTree = ""; }; 4ABEA80415C90D2B009F0424 /* catch_objc_arc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_objc_arc.hpp; sourceTree = ""; }; 4AC91CCE155CF02800DC5117 /* catch_expression_lhs.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_expression_lhs.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4AC91CD0155D8DA600DC5117 /* catch_expression_decomposer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = catch_expression_decomposer.hpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 4ACE21C8166CA19700FB5509 /* catch_option.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_option.hpp; sourceTree = ""; }; 4ACE21CA166CA1B300FB5509 /* catch_option.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_option.cpp; path = ../../../SelfTest/SurrogateCpps/catch_option.cpp; sourceTree = ""; }; 4AE1840A14EE4F230066340D /* catch_self_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_self_test.cpp; path = ../../../SelfTest/catch_self_test.cpp; sourceTree = ""; }; 4AEE031F16142F910071E950 /* catch_common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_common.cpp; path = ../../../SelfTest/SurrogateCpps/catch_common.cpp; sourceTree = ""; }; 4AEE032216142FC70071E950 /* catch_debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_debugger.cpp; path = ../../../SelfTest/SurrogateCpps/catch_debugger.cpp; sourceTree = ""; }; 4AEE032416142FF10071E950 /* catch_stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_stream.cpp; path = ../../../SelfTest/SurrogateCpps/catch_stream.cpp; sourceTree = ""; }; 4AEE0326161431070071E950 /* catch_streambuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_streambuf.h; sourceTree = ""; }; 4AEE0327161434FD0071E950 /* catch_xmlwriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_xmlwriter.cpp; path = ../../../SelfTest/SurrogateCpps/catch_xmlwriter.cpp; sourceTree = ""; }; 4AFC661D157E96A7009D58CF /* catch_interfaces_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_interfaces_config.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 4A6D0C1D149B3D3B00DB3EAA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 266E9AD317290E710061DAB2 /* Introspective Tests */ = { isa = PBXGroup; children = ( 266E9AD417290E8E0061DAB2 /* CmdLineTests.cpp */, 26948284179A9AB900ED166E /* SectionTrackerTests.cpp */, ); name = "Introspective Tests"; sourceTree = ""; }; 26C5F3EB17514B670056FB3C /* External */ = { isa = PBXGroup; children = ( 26C5F3EC17514B970056FB3C /* clara.h */, ); name = External; sourceTree = ""; }; 4A6D0C15149B3D3B00DB3EAA = { isa = PBXGroup; children = ( 4A6D0C23149B3D3B00DB3EAA /* CatchSelfTest */, 4A6D0C21149B3D3B00DB3EAA /* Products */, ); sourceTree = ""; }; 4A6D0C21149B3D3B00DB3EAA /* Products */ = { isa = PBXGroup; children = ( 4A6D0C20149B3D3B00DB3EAA /* CatchSelfTest */, ); name = Products; sourceTree = ""; }; 4A6D0C23149B3D3B00DB3EAA /* CatchSelfTest */ = { isa = PBXGroup; children = ( 4A6D0C35149B3D9E00DB3EAA /* TestMain.cpp */, 4A6D0C2E149B3D9E00DB3EAA /* catch_self_test.hpp */, 4AE1840A14EE4F230066340D /* catch_self_test.cpp */, 266E9AD317290E710061DAB2 /* Introspective Tests */, 4A6D0C40149B3DAB00DB3EAA /* Tests */, 4A6D0C41149B3DE900DB3EAA /* Catch */, 4A6D0C26149B3D3B00DB3EAA /* CatchSelfTest.1 */, ); path = CatchSelfTest; sourceTree = ""; }; 4A6D0C40149B3DAB00DB3EAA /* Tests */ = { isa = PBXGroup; children = ( 266ECD73170F3C620030D735 /* BDDTests.cpp */, 4A6D0C36149B3D9E00DB3EAA /* TrickyTests.cpp */, 4A6D0C2D149B3D9E00DB3EAA /* ApproxTests.cpp */, 4A6D0C2F149B3D9E00DB3EAA /* ClassTests.cpp */, 4A6D0C30149B3D9E00DB3EAA /* ConditionTests.cpp */, 4A6D0C31149B3D9E00DB3EAA /* ExceptionTests.cpp */, 4A6D0C32149B3D9E00DB3EAA /* GeneratorTests.cpp */, 4A6D0C33149B3D9E00DB3EAA /* MessageTests.cpp */, 4A6D0C34149B3D9E00DB3EAA /* MiscTests.cpp */, 266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */, ); name = Tests; sourceTree = ""; }; 4A6D0C41149B3DE900DB3EAA /* Catch */ = { isa = PBXGroup; children = ( 26C5F3EB17514B670056FB3C /* External */, 4A7DB2CD1652FE4B00FA6523 /* catch_version.h */, 4AA7B8B4165428BA003155F6 /* catch_version.hpp */, 4A8E4DCF160A34E200194CBD /* SurrogateCpps */, 4A6D0C44149B3E1500DB3EAA /* catch.hpp */, 4A6D0C42149B3E1500DB3EAA /* catch_runner.hpp */, 4A6D0C43149B3E1500DB3EAA /* catch_with_main.hpp */, 4A6D0C45149B3E3D00DB3EAA /* internal */, 4A6D0C65149B3E3D00DB3EAA /* reporters */, ); name = Catch; sourceTree = ""; }; 4A6D0C45149B3E3D00DB3EAA /* internal */ = { isa = PBXGroup; children = ( 4AC91CC3155C38D300DC5117 /* Objective-C */, 4AC91CC2155C388300DC5117 /* Infrastructure */, 4AC91CC1155C387400DC5117 /* Interfaces */, 4AC91CC0155C384400DC5117 /* Process */, 4AC91CBF155C381600DC5117 /* Test execution */, 4AC91CBE155C37F800DC5117 /* Registries */, 4AC91CBD155C37B500DC5117 /* Assertions */, 4AC91CB4155B9EBF00DC5117 /* impl */, ); name = internal; path = ../../../../include/internal; sourceTree = ""; }; 4A6D0C65149B3E3D00DB3EAA /* reporters */ = { isa = PBXGroup; children = ( 4A6D0C67149B3E3D00DB3EAA /* catch_reporter_junit.hpp */, 4A6D0C68149B3E3D00DB3EAA /* catch_reporter_xml.hpp */, 4AB42F84166F3E1A0099F2C8 /* catch_reporter_console.hpp */, ); name = reporters; path = ../../../../include/reporters; sourceTree = ""; }; 4A8E4DCF160A34E200194CBD /* SurrogateCpps */ = { isa = PBXGroup; children = ( 4A8E4DD0160A352200194CBD /* catch_tags.cpp */, 4AEE031F16142F910071E950 /* catch_common.cpp */, 4AEE032216142FC70071E950 /* catch_debugger.cpp */, 4AEE032416142FF10071E950 /* catch_stream.cpp */, 4AEE0327161434FD0071E950 /* catch_xmlwriter.cpp */, 4A45DA2316161EF9004F8D6B /* catch_console_colour.cpp */, 4A45DA2616161F1F004F8D6B /* catch_ptr.cpp */, 4A45DA2816161F3D004F8D6B /* catch_streambuf.cpp */, 4A45DA2A16161F79004F8D6B /* catch_interfaces_registry_hub.cpp */, 4A45DA2C16161FA2004F8D6B /* catch_interfaces_capture.cpp */, 4A45DA3216162047004F8D6B /* catch_interfaces_exception.cpp */, 4A45DA3016161FFB004F8D6B /* catch_interfaces_reporter.cpp */, 4A45DA3416162071004F8D6B /* catch_interfaces_runner.cpp */, 4AB3D99C1616216500C9A0F8 /* catch_interfaces_testcase.cpp */, 4AB3D99F1616219100C9A0F8 /* catch_interfaces_config.cpp */, 4AB3D9A1161621B500C9A0F8 /* catch_interfaces_generators.cpp */, 4ACE21CA166CA1B300FB5509 /* catch_option.cpp */, 2694A1FB16A0000E004816E3 /* catch_text.cpp */, 26847E5D16BBADB40043B9C1 /* catch_message.cpp */, ); name = SurrogateCpps; sourceTree = ""; }; 4AC91CB4155B9EBF00DC5117 /* impl */ = { isa = PBXGroup; children = ( 263FD06017AF8DF200988A20 /* catch_timer.hpp */, 266E9AD117230ACF0061DAB2 /* catch_text.hpp */, 4A4B0F9C15CEFA8300AE2392 /* catch_impl.hpp */, 4A4B0F9715CE6CFB00AE2392 /* catch_registry_hub.hpp */, 4A6D0C50149B3E3D00DB3EAA /* catch_generators_impl.hpp */, 4A6D0C52149B3E3D00DB3EAA /* catch_context_impl.hpp */, 4A6D0C5E149B3E3D00DB3EAA /* catch_runner_impl.hpp */, 4A6D0C62149B3E3D00DB3EAA /* catch_test_case_registry_impl.hpp */, 4AB1C73514F97BDA00F31DF7 /* catch_console_colour_impl.hpp */, 4A4B0F9B15CEF8C400AE2392 /* catch_notimplemented_exception.hpp */, 4A90B59D15D24FE900EF71BC /* catch_assertionresult.hpp */, 4A90B59E15D2521E00EF71BC /* catch_expressionresult_builder.hpp */, 4A084F1C15DACEEA0027E631 /* catch_test_case_info.hpp */, 26847E5C16BBACB60043B9C1 /* catch_message.hpp */, ); name = impl; sourceTree = ""; }; 4AC91CBD155C37B500DC5117 /* Assertions */ = { isa = PBXGroup; children = ( 4A6D0C4D149B3E3D00DB3EAA /* catch_evaluate.hpp */, 4A6D0C4F149B3E3D00DB3EAA /* catch_generators.hpp */, 4A6D0C5C149B3E3D00DB3EAA /* catch_result_type.h */, 4A6D0C5D149B3E3D00DB3EAA /* catch_assertionresult.h */, 4A9D84B315599AC900FBB209 /* catch_expressionresult_builder.h */, 4A6D0C5F149B3E3D00DB3EAA /* catch_section.hpp */, 4A3D7DD01503869D005F9203 /* catch_matchers.hpp */, 4A9D84B11558FC0400FBB209 /* catch_tostring.hpp */, 4A6D0C46149B3E3D00DB3EAA /* catch_approx.hpp */, 4A6D0C47149B3E3D00DB3EAA /* catch_capture.hpp */, 4AC91CCE155CF02800DC5117 /* catch_expression_lhs.hpp */, 4AC91CD0155D8DA600DC5117 /* catch_expression_decomposer.hpp */, 4A4B0F9A15CEF84800AE2392 /* catch_notimplemented_exception.h */, 26847E5B16BBAB790043B9C1 /* catch_message.h */, ); name = Assertions; sourceTree = ""; }; 4AC91CBE155C37F800DC5117 /* Registries */ = { isa = PBXGroup; children = ( 4A6D0C4E149B3E3D00DB3EAA /* catch_exception_translator_registry.hpp */, 4A6D0C5A149B3E3D00DB3EAA /* catch_reporter_registrars.hpp */, 4A6D0C5B149B3E3D00DB3EAA /* catch_reporter_registry.hpp */, 4A6D0C63149B3E3D00DB3EAA /* catch_test_registry.hpp */, ); name = Registries; sourceTree = ""; }; 4AC91CBF155C381600DC5117 /* Test execution */ = { isa = PBXGroup; children = ( 4A6D0C4A149B3E3D00DB3EAA /* catch_config.hpp */, 4A6D0C51149B3E3D00DB3EAA /* catch_context.h */, 4A6D0C61149B3E3D00DB3EAA /* catch_test_case_info.h */, 4A7ADB4314F631E10094FE10 /* catch_totals.hpp */, 4AB77CB71553B72B00857BF0 /* catch_section_info.hpp */, 4A084F1D15DAD15F0027E631 /* catch_test_spec.h */, 4A8E4DCC160A344100194CBD /* catch_tags.hpp */, 26948287179EF7F900ED166E /* catch_test_case_tracker.hpp */, ); name = "Test execution"; sourceTree = ""; }; 4AC91CC0155C384400DC5117 /* Process */ = { isa = PBXGroup; children = ( 4A6D0C58149B3E3D00DB3EAA /* catch_list.hpp */, 4A6D0C48149B3E3D00DB3EAA /* catch_commandline.hpp */, 4A6D0C4C149B3E3D00DB3EAA /* catch_default_main.hpp */, ); name = Process; sourceTree = ""; }; 4AC91CC1155C387400DC5117 /* Interfaces */ = { isa = PBXGroup; children = ( 4A4B0F9915CE6EC100AE2392 /* catch_interfaces_registry_hub.h */, 4A6D0C53149B3E3D00DB3EAA /* catch_interfaces_capture.h */, 4A6D0C54149B3E3D00DB3EAA /* catch_interfaces_exception.h */, 4A6D0C55149B3E3D00DB3EAA /* catch_interfaces_reporter.h */, 4A6D0C56149B3E3D00DB3EAA /* catch_interfaces_runner.h */, 4A6D0C57149B3E3D00DB3EAA /* catch_interfaces_testcase.h */, 4AFC661D157E96A7009D58CF /* catch_interfaces_config.h */, 4A90B59B15D0F61A00EF71BC /* catch_interfaces_generators.h */, ); name = Interfaces; sourceTree = ""; }; 4AC91CC2155C388300DC5117 /* Infrastructure */ = { isa = PBXGroup; children = ( 266ECD8C1713614B0030D735 /* catch_legacy_reporter_adapter.hpp */, 266ECD8D1713614B0030D735 /* catch_legacy_reporter_adapter.h */, 4A6D0C49149B3E3D00DB3EAA /* catch_common.h */, 4A6D0C4B149B3E3D00DB3EAA /* catch_debugger.hpp */, 4A6D0C60149B3E3D00DB3EAA /* catch_stream.hpp */, 4A6D0C64149B3E3D00DB3EAA /* catch_xmlwriter.hpp */, 4AB1C73714F97C1300F31DF7 /* catch_console_colour.hpp */, 4AB77CB51551AEA200857BF0 /* catch_ptr.hpp */, 4AEE0326161431070071E950 /* catch_streambuf.h */, 4ACE21C8166CA19700FB5509 /* catch_option.hpp */, 26759472171C72A400A84BD1 /* catch_sfinae.hpp */, 26759473171C74C200A84BD1 /* catch_compiler_capabilities.h */, 26DACF2F17206D3400A21326 /* catch_text.h */, 263FD06117AF8DF200988A20 /* catch_timer.h */, 26AEAF1617BEA18E009E32C9 /* catch_platform.h */, ); name = Infrastructure; sourceTree = ""; }; 4AC91CC3155C38D300DC5117 /* Objective-C */ = { isa = PBXGroup; children = ( 4A6D0C59149B3E3D00DB3EAA /* catch_objc.hpp */, 4ABEA80415C90D2B009F0424 /* catch_objc_arc.hpp */, ); name = "Objective-C"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 4A6D0C1F149B3D3B00DB3EAA /* CatchSelfTest */ = { isa = PBXNativeTarget; buildConfigurationList = 4A6D0C2A149B3D3B00DB3EAA /* Build configuration list for PBXNativeTarget "CatchSelfTest" */; buildPhases = ( 4A6D0C1C149B3D3B00DB3EAA /* Sources */, 4A6D0C1D149B3D3B00DB3EAA /* Frameworks */, 4A6D0C1E149B3D3B00DB3EAA /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = CatchSelfTest; productName = CatchSelfTest; productReference = 4A6D0C20149B3D3B00DB3EAA /* CatchSelfTest */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 4A6D0C17149B3D3B00DB3EAA /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0460; }; buildConfigurationList = 4A6D0C1A149B3D3B00DB3EAA /* Build configuration list for PBXProject "CatchSelfTest" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 4A6D0C15149B3D3B00DB3EAA; productRefGroup = 4A6D0C21149B3D3B00DB3EAA /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 4A6D0C1F149B3D3B00DB3EAA /* CatchSelfTest */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 4A6D0C1C149B3D3B00DB3EAA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4A6D0C37149B3D9E00DB3EAA /* ApproxTests.cpp in Sources */, 4A6D0C38149B3D9E00DB3EAA /* ClassTests.cpp in Sources */, 4A6D0C39149B3D9E00DB3EAA /* ConditionTests.cpp in Sources */, 4A6D0C3A149B3D9E00DB3EAA /* ExceptionTests.cpp in Sources */, 4A6D0C3B149B3D9E00DB3EAA /* GeneratorTests.cpp in Sources */, 4A6D0C3C149B3D9E00DB3EAA /* MessageTests.cpp in Sources */, 4A6D0C3D149B3D9E00DB3EAA /* MiscTests.cpp in Sources */, 4A6D0C3E149B3D9E00DB3EAA /* TestMain.cpp in Sources */, 4A6D0C3F149B3D9E00DB3EAA /* TrickyTests.cpp in Sources */, 4AE1840B14EE4F230066340D /* catch_self_test.cpp in Sources */, 4A8E4DD2160A352200194CBD /* catch_tags.cpp in Sources */, 4AEE032016142F910071E950 /* catch_common.cpp in Sources */, 4AEE032316142FC70071E950 /* catch_debugger.cpp in Sources */, 4AEE032516142FF10071E950 /* catch_stream.cpp in Sources */, 4AEE0328161434FD0071E950 /* catch_xmlwriter.cpp in Sources */, 4A45DA2416161EF9004F8D6B /* catch_console_colour.cpp in Sources */, 4A45DA2716161F1F004F8D6B /* catch_ptr.cpp in Sources */, 4A45DA2916161F3D004F8D6B /* catch_streambuf.cpp in Sources */, 4A45DA2B16161F79004F8D6B /* catch_interfaces_registry_hub.cpp in Sources */, 4A45DA2D16161FA2004F8D6B /* catch_interfaces_capture.cpp in Sources */, 4A45DA3116161FFC004F8D6B /* catch_interfaces_reporter.cpp in Sources */, 4A45DA3316162047004F8D6B /* catch_interfaces_exception.cpp in Sources */, 4A45DA3516162071004F8D6B /* catch_interfaces_runner.cpp in Sources */, 4AB3D99D1616216500C9A0F8 /* catch_interfaces_testcase.cpp in Sources */, 4AB3D9A01616219100C9A0F8 /* catch_interfaces_config.cpp in Sources */, 4AB3D9A2161621B500C9A0F8 /* catch_interfaces_generators.cpp in Sources */, 4ACE21CC166CA1B300FB5509 /* catch_option.cpp in Sources */, 2694A1FD16A0000E004816E3 /* catch_text.cpp in Sources */, 26847E5F16BBADB40043B9C1 /* catch_message.cpp in Sources */, 266B06B816F3A60A004ED264 /* VariadicMacrosTests.cpp in Sources */, 266ECD74170F3C620030D735 /* BDDTests.cpp in Sources */, 266E9AD617290E8E0061DAB2 /* CmdLineTests.cpp in Sources */, 26948286179A9AB900ED166E /* SectionTrackerTests.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 4A6D0C28149B3D3B00DB3EAA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = NO; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_PEDANTIC = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "\"$(PROJECT_DIR)/../../../include\""; }; name = Debug; }; 4A6D0C29149B3D3B00DB3EAA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_PEDANTIC = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "\"$(PROJECT_DIR)/../../../include\""; }; name = Release; }; 4A6D0C2B149B3D3B00DB3EAA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++98"; CLANG_WARN__DUPLICATE_METHOD_MATCH = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "$(TARGET_NAME)"; WARNING_CFLAGS = ( "-Weverything", "-Wno-disabled-macro-expansion", ); }; name = Debug; }; 4A6D0C2C149B3D3B00DB3EAA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++98"; CLANG_WARN__DUPLICATE_METHOD_MATCH = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "$(TARGET_NAME)"; WARNING_CFLAGS = ( "-Weverything", "-Wno-disabled-macro-expansion", ); }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4A6D0C1A149B3D3B00DB3EAA /* Build configuration list for PBXProject "CatchSelfTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A6D0C28149B3D3B00DB3EAA /* Debug */, 4A6D0C29149B3D3B00DB3EAA /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4A6D0C2A149B3D3B00DB3EAA /* Build configuration list for PBXNativeTarget "CatchSelfTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A6D0C2B149B3D3B00DB3EAA /* Debug */, 4A6D0C2C149B3D3B00DB3EAA /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 4A6D0C17149B3D3B00DB3EAA /* Project object */; } 000077500000000000000000000000001221513074500353375ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspacecontents.xcworkspacedata000066400000000000000000000002361221513074500423020ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace 000077500000000000000000000000001221513074500335045ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/xcuserdata000077500000000000000000000000001221513074500367065ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/xcuserdata/Phil.xcuserdatad000077500000000000000000000000001221513074500406705ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/xcuserdata/Phil.xcuserdatad/xcschemesxcschememanagement.plist000066400000000000000000000007451221513074500456070ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/xcuserdata/Phil.xcuserdatad/xcschemes SchemeUserState CatchSelfTest.xcscheme orderHint 0 SuppressBuildableAutocreation 4A6D0C1F149B3D3B00DB3EAA primary Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest/000077500000000000000000000000001221513074500274245ustar00rootroot00000000000000CatchSelfTest.1000066400000000000000000000060771221513074500321350ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples. .\"See Also: .\"man mdoc.samples for a complete listing of options .\"man mdoc for the short list of editing options .\"/usr/share/misc/mdoc.template .Dd 16/12/2011 \" DATE .Dt CatchSelfTest 1 \" Program name and manual section number .Os Darwin .Sh NAME \" Section Header - required - don't modify .Nm CatchSelfTest, .\" The following lines are read in generating the apropos(man -k) database. Use only key .\" words here as the database is built based on the words here and in the .ND line. .Nm Other_name_for_same_program(), .Nm Yet another name for the same program. .\" Use .Nm macro to designate other names for the documented program. .Nd This line parsed for whatis database. .Sh SYNOPSIS \" Section Header - required - don't modify .Nm .Op Fl abcd \" [-abcd] .Op Fl a Ar path \" [-a path] .Op Ar file \" [file] .Op Ar \" [file ...] .Ar arg0 \" Underlined argument - use .Ar anywhere to underline arg2 ... \" Arguments .Sh DESCRIPTION \" Section Header - required - don't modify Use the .Nm macro to refer to your program throughout the man page like such: .Nm Underlining is accomplished with the .Ar macro like this: .Ar underlined text . .Pp \" Inserts a space A list of items with descriptions: .Bl -tag -width -indent \" Begins a tagged list .It item a \" Each item preceded by .It macro Description of item a .It item b Description of item b .El \" Ends the list .Pp A list of flags and their descriptions: .Bl -tag -width -indent \" Differs from above in tag removed .It Fl a \"-a flag as a list item Description of -a flag .It Fl b Description of -b flag .El \" Ends the list .Pp .\" .Sh ENVIRONMENT \" May not be needed .\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1 .\" .It Ev ENV_VAR_1 .\" Description of ENV_VAR_1 .\" .It Ev ENV_VAR_2 .\" Description of ENV_VAR_2 .\" .El .Sh FILES \" File used or created by the topic of the man page .Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact .It Pa /usr/share/file_name FILE_1 description .It Pa /Users/joeuser/Library/really_long_file_name FILE_2 description .El \" Ends the list .\" .Sh DIAGNOSTICS \" May not be needed .\" .Bl -diag .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .El .Sh SEE ALSO .\" List links in ascending order by section, alphabetically within a section. .\" Please do not reference files that do not exist without filing a bug report .Xr a 1 , .Xr b 1 , .Xr c 1 , .Xr a 2 , .Xr b 2 , .Xr a 3 , .Xr b 3 .\" .Sh BUGS \" Document known, unremedied bugs .\" .Sh HISTORY \" Document history if command behaves in a unique mannercatch_text.cpp000066400000000000000000000001701221513074500321750ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTest// This file is only here to verify (to the extent possible) the self sufficiency of the header #include "catch_text.h" 000077500000000000000000000000001221513074500325035ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeprojproject.pbxproj000066400000000000000000000264041221513074500355650ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 4A2894D615D3956000E20735 /* ApproxTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894D515D3956000E20735 /* ApproxTests.cpp */; }; 4AB735F815D396ED00F9F7C3 /* catch_self_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894D815D3957500E20735 /* catch_self_test.cpp */; }; 4AB735FA15D396F400F9F7C3 /* TestMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894E015D3957500E20735 /* TestMain.cpp */; }; 4AB735FB15D3970C00F9F7C3 /* ClassTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894DA15D3957500E20735 /* ClassTests.cpp */; }; 4AB735FC15D3971100F9F7C3 /* ConditionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894DB15D3957500E20735 /* ConditionTests.cpp */; }; 4AB735FD15D3971600F9F7C3 /* ExceptionTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894DC15D3957500E20735 /* ExceptionTests.cpp */; }; 4AB735FE15D3971600F9F7C3 /* GeneratorTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894DD15D3957500E20735 /* GeneratorTests.cpp */; }; 4AB735FF15D3971600F9F7C3 /* MessageTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894DE15D3957500E20735 /* MessageTests.cpp */; }; 4AB7360015D3971600F9F7C3 /* MiscTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894DF15D3957500E20735 /* MiscTests.cpp */; }; 4AB7360115D3971600F9F7C3 /* TrickyTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A2894E115D3957500E20735 /* TrickyTests.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 4A90B5D415D2E3E900EF71BC /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 4A2894D515D3956000E20735 /* ApproxTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ApproxTests.cpp; path = ../../../SelfTest/ApproxTests.cpp; sourceTree = ""; }; 4A2894D815D3957500E20735 /* catch_self_test.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = catch_self_test.cpp; path = ../../../SelfTest/catch_self_test.cpp; sourceTree = ""; }; 4A2894D915D3957500E20735 /* catch_self_test.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = catch_self_test.hpp; path = ../../../SelfTest/catch_self_test.hpp; sourceTree = ""; }; 4A2894DA15D3957500E20735 /* ClassTests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ClassTests.cpp; path = ../../../SelfTest/ClassTests.cpp; sourceTree = ""; }; 4A2894DB15D3957500E20735 /* ConditionTests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ConditionTests.cpp; path = ../../../SelfTest/ConditionTests.cpp; sourceTree = ""; }; 4A2894DC15D3957500E20735 /* ExceptionTests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ExceptionTests.cpp; path = ../../../SelfTest/ExceptionTests.cpp; sourceTree = ""; }; 4A2894DD15D3957500E20735 /* GeneratorTests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GeneratorTests.cpp; path = ../../../SelfTest/GeneratorTests.cpp; sourceTree = ""; }; 4A2894DE15D3957500E20735 /* MessageTests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MessageTests.cpp; path = ../../../SelfTest/MessageTests.cpp; sourceTree = ""; }; 4A2894DF15D3957500E20735 /* MiscTests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MiscTests.cpp; path = ../../../SelfTest/MiscTests.cpp; sourceTree = ""; }; 4A2894E015D3957500E20735 /* TestMain.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TestMain.cpp; path = ../../../SelfTest/TestMain.cpp; sourceTree = ""; }; 4A2894E115D3957500E20735 /* TrickyTests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TrickyTests.cpp; path = ../../../SelfTest/TrickyTests.cpp; sourceTree = ""; }; 4A90B5D615D2E3E900EF71BC /* CatchSelfTestSingle */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CatchSelfTestSingle; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 4A90B5D315D2E3E900EF71BC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 4A2894E215D3957D00E20735 /* Self Test */ = { isa = PBXGroup; children = ( 4A2894E015D3957500E20735 /* TestMain.cpp */, 4A2894D815D3957500E20735 /* catch_self_test.cpp */, 4A2894D915D3957500E20735 /* catch_self_test.hpp */, ); name = "Self Test"; sourceTree = ""; }; 4A2894E315D3959800E20735 /* Test Cases */ = { isa = PBXGroup; children = ( 4A2894DA15D3957500E20735 /* ClassTests.cpp */, 4A2894DB15D3957500E20735 /* ConditionTests.cpp */, 4A2894DC15D3957500E20735 /* ExceptionTests.cpp */, 4A2894DD15D3957500E20735 /* GeneratorTests.cpp */, 4A2894DE15D3957500E20735 /* MessageTests.cpp */, 4A2894DF15D3957500E20735 /* MiscTests.cpp */, 4A2894E115D3957500E20735 /* TrickyTests.cpp */, 4A2894D515D3956000E20735 /* ApproxTests.cpp */, ); name = "Test Cases"; sourceTree = ""; }; 4A90B5CB15D2E3E900EF71BC = { isa = PBXGroup; children = ( 4A90B5D915D2E3E900EF71BC /* CatchSelfTestSingle */, 4A90B5D715D2E3E900EF71BC /* Products */, ); sourceTree = ""; }; 4A90B5D715D2E3E900EF71BC /* Products */ = { isa = PBXGroup; children = ( 4A90B5D615D2E3E900EF71BC /* CatchSelfTestSingle */, ); name = Products; sourceTree = ""; }; 4A90B5D915D2E3E900EF71BC /* CatchSelfTestSingle */ = { isa = PBXGroup; children = ( 4A2894E315D3959800E20735 /* Test Cases */, 4A2894E215D3957D00E20735 /* Self Test */, ); path = CatchSelfTestSingle; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 4A90B5D515D2E3E900EF71BC /* CatchSelfTestSingle */ = { isa = PBXNativeTarget; buildConfigurationList = 4A90B5E015D2E3E900EF71BC /* Build configuration list for PBXNativeTarget "CatchSelfTestSingle" */; buildPhases = ( 4A90B5D215D2E3E900EF71BC /* Sources */, 4A90B5D315D2E3E900EF71BC /* Frameworks */, 4A90B5D415D2E3E900EF71BC /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = CatchSelfTestSingle; productName = CatchSelfTestSingle; productReference = 4A90B5D615D2E3E900EF71BC /* CatchSelfTestSingle */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 4A90B5CD15D2E3E900EF71BC /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0440; ORGANIZATIONNAME = "Phil Nash"; }; buildConfigurationList = 4A90B5D015D2E3E900EF71BC /* Build configuration list for PBXProject "CatchSelfTestSingle" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 4A90B5CB15D2E3E900EF71BC; productRefGroup = 4A90B5D715D2E3E900EF71BC /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 4A90B5D515D2E3E900EF71BC /* CatchSelfTestSingle */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 4A90B5D215D2E3E900EF71BC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4A2894D615D3956000E20735 /* ApproxTests.cpp in Sources */, 4AB735F815D396ED00F9F7C3 /* catch_self_test.cpp in Sources */, 4AB735FA15D396F400F9F7C3 /* TestMain.cpp in Sources */, 4AB735FB15D3970C00F9F7C3 /* ClassTests.cpp in Sources */, 4AB735FC15D3971100F9F7C3 /* ConditionTests.cpp in Sources */, 4AB735FD15D3971600F9F7C3 /* ExceptionTests.cpp in Sources */, 4AB735FE15D3971600F9F7C3 /* GeneratorTests.cpp in Sources */, 4AB735FF15D3971600F9F7C3 /* MessageTests.cpp in Sources */, 4AB7360015D3971600F9F7C3 /* MiscTests.cpp in Sources */, 4AB7360115D3971600F9F7C3 /* TrickyTests.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 4A90B5DE15D2E3E900EF71BC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 4A90B5DF15D2E3E900EF71BC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; }; name = Release; }; 4A90B5E115D2E3E900EF71BC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = "../../../single_include/**"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 4A90B5E215D2E3E900EF71BC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = "../../../single_include/**"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4A90B5D015D2E3E900EF71BC /* Build configuration list for PBXProject "CatchSelfTestSingle" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A90B5DE15D2E3E900EF71BC /* Debug */, 4A90B5DF15D2E3E900EF71BC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4A90B5E015D2E3E900EF71BC /* Build configuration list for PBXNativeTarget "CatchSelfTestSingle" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A90B5E115D2E3E900EF71BC /* Debug */, 4A90B5E215D2E3E900EF71BC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 4A90B5CD15D2E3E900EF71BC /* Project object */; } 000077500000000000000000000000001221513074500365015ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspacecontents.xcworkspacedata000066400000000000000000000002441221513074500434430ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTestSingle/000077500000000000000000000000001221513074500305665ustar00rootroot00000000000000dummy.txt000066400000000000000000000000001221513074500323710ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/CatchSelfTest/CatchSelfTestSingleCatch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/000077500000000000000000000000001221513074500233755ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest.xcodeproj/000077500000000000000000000000001221513074500265325ustar00rootroot00000000000000project.pbxproj000066400000000000000000000234531221513074500315360ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 4A63D2AC14E3C1A900F615CB /* OCTest.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4A63D2AB14E3C1A900F615CB /* OCTest.1 */; }; 4A63D2B314E3C1E600F615CB /* Main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4A63D2B214E3C1E600F615CB /* Main.mm */; }; 4A63D2C014E4544700F615CB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A63D2BF14E4544700F615CB /* Foundation.framework */; }; 4A63D2C614E454CC00F615CB /* CatchOCTestCase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4A63D2C214E454CC00F615CB /* CatchOCTestCase.mm */; }; 4A63D2C714E454CC00F615CB /* OCTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4A63D2C314E454CC00F615CB /* OCTest.mm */; }; 4A63D2C814E454CC00F615CB /* TestObj.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A63D2C514E454CC00F615CB /* TestObj.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 4A63D2A314E3C1A900F615CB /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( 4A63D2AC14E3C1A900F615CB /* OCTest.1 in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 4A63D2A514E3C1A900F615CB /* OCTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = OCTest; sourceTree = BUILT_PRODUCTS_DIR; }; 4A63D2AB14E3C1A900F615CB /* OCTest.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = OCTest.1; sourceTree = ""; }; 4A63D2B214E3C1E600F615CB /* Main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Main.mm; sourceTree = ""; }; 4A63D2BF14E4544700F615CB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 4A63D2C114E454CC00F615CB /* CatchOCTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CatchOCTestCase.h; sourceTree = ""; }; 4A63D2C214E454CC00F615CB /* CatchOCTestCase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CatchOCTestCase.mm; sourceTree = ""; }; 4A63D2C314E454CC00F615CB /* OCTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OCTest.mm; sourceTree = ""; }; 4A63D2C414E454CC00F615CB /* TestObj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestObj.h; sourceTree = ""; }; 4A63D2C514E454CC00F615CB /* TestObj.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestObj.m; sourceTree = ""; }; 4AA0D951154C0A7A004B4193 /* catch_objc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_objc.hpp; path = ../../../include/internal/catch_objc.hpp; sourceTree = ""; }; 4ABEA80615C90E10009F0424 /* catch_objc_arc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_objc_arc.hpp; path = ../../../include/internal/catch_objc_arc.hpp; sourceTree = ""; }; 4ABEA80815C90E38009F0424 /* catch_tostring.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_tostring.hpp; path = ../../../include/internal/catch_tostring.hpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 4A63D2A214E3C1A900F615CB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 4A63D2C014E4544700F615CB /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 4A63D29A14E3C1A900F615CB = { isa = PBXGroup; children = ( 4AA0D94F154C0A63004B4193 /* Catch */, 4A63D2BF14E4544700F615CB /* Foundation.framework */, 4A63D2A814E3C1A900F615CB /* OCTest */, 4A63D2A614E3C1A900F615CB /* Products */, ); sourceTree = ""; }; 4A63D2A614E3C1A900F615CB /* Products */ = { isa = PBXGroup; children = ( 4A63D2A514E3C1A900F615CB /* OCTest */, ); name = Products; sourceTree = ""; }; 4A63D2A814E3C1A900F615CB /* OCTest */ = { isa = PBXGroup; children = ( 4A63D2C114E454CC00F615CB /* CatchOCTestCase.h */, 4A63D2C214E454CC00F615CB /* CatchOCTestCase.mm */, 4A63D2C314E454CC00F615CB /* OCTest.mm */, 4A63D2C414E454CC00F615CB /* TestObj.h */, 4A63D2C514E454CC00F615CB /* TestObj.m */, 4A63D2B214E3C1E600F615CB /* Main.mm */, 4A63D2AB14E3C1A900F615CB /* OCTest.1 */, ); path = OCTest; sourceTree = ""; }; 4AA0D94F154C0A63004B4193 /* Catch */ = { isa = PBXGroup; children = ( 4ABEA80815C90E38009F0424 /* catch_tostring.hpp */, 4ABEA80615C90E10009F0424 /* catch_objc_arc.hpp */, 4AA0D951154C0A7A004B4193 /* catch_objc.hpp */, ); name = Catch; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 4A63D2A414E3C1A900F615CB /* OCTest */ = { isa = PBXNativeTarget; buildConfigurationList = 4A63D2AF14E3C1A900F615CB /* Build configuration list for PBXNativeTarget "OCTest" */; buildPhases = ( 4A63D2A114E3C1A900F615CB /* Sources */, 4A63D2A214E3C1A900F615CB /* Frameworks */, 4A63D2A314E3C1A900F615CB /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = OCTest; productName = OCTest; productReference = 4A63D2A514E3C1A900F615CB /* OCTest */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 4A63D29C14E3C1A900F615CB /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0420; }; buildConfigurationList = 4A63D29F14E3C1A900F615CB /* Build configuration list for PBXProject "OCTest" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 4A63D29A14E3C1A900F615CB; productRefGroup = 4A63D2A614E3C1A900F615CB /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 4A63D2A414E3C1A900F615CB /* OCTest */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 4A63D2A114E3C1A900F615CB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4A63D2B314E3C1E600F615CB /* Main.mm in Sources */, 4A63D2C614E454CC00F615CB /* CatchOCTestCase.mm in Sources */, 4A63D2C714E454CC00F615CB /* OCTest.mm in Sources */, 4A63D2C814E454CC00F615CB /* TestObj.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 4A63D2AD14E3C1A900F615CB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ../../../include; MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 4A63D2AE14E3C1A900F615CB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ../../../include; MACOSX_DEPLOYMENT_TARGET = 10.7; SDKROOT = macosx; }; name = Release; }; 4A63D2B014E3C1A900F615CB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; HEADER_SEARCH_PATHS = ../../../include; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 4A63D2B114E3C1A900F615CB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; HEADER_SEARCH_PATHS = ../../../include; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4A63D29F14E3C1A900F615CB /* Build configuration list for PBXProject "OCTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A63D2AD14E3C1A900F615CB /* Debug */, 4A63D2AE14E3C1A900F615CB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4A63D2AF14E3C1A900F615CB /* Build configuration list for PBXNativeTarget "OCTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A63D2B014E3C1A900F615CB /* Debug */, 4A63D2B114E3C1A900F615CB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 4A63D29C14E3C1A900F615CB /* Project object */; } 000077500000000000000000000000001221513074500324515ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest.xcodeproj/project.xcworkspacecontents.xcworkspacedata000066400000000000000000000002271221513074500374140ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest.xcodeproj/project.xcworkspace Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/000077500000000000000000000000001221513074500245365ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/CatchOCTestCase.h000066400000000000000000000011051221513074500276040ustar00rootroot00000000000000// // CatchOCTestCase.h // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef TWOBLUECUBES_CATCHOCTESTCASE_H_INCLUDED #define TWOBLUECUBES_CATCHOCTESTCASE_H_INCLUDED #include "catch.hpp" #import #import "TestObj.h" @interface TestFixture : NSObject { TestObj* obj; } @end #endif // TWOBLUECUBES_CATCHOCTESTCASE_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/CatchOCTestCase.mm000066400000000000000000000040331221513074500277710ustar00rootroot00000000000000// // CatchOCTestCase.mm // OCTest // // Created by Phil Nash on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #import "CatchOCTestCase.h" @implementation TestFixture -(void) setUp { obj = [[TestObj alloc] init]; } -(void) tearDown { arcSafeRelease( obj ); } OC_TEST_CASE( "OCTest/test1", "This is a test case" ) { REQUIRE( obj.int_val == 0 ); obj.int_val = 1; REQUIRE( obj.int_val == 1 ); } OC_TEST_CASE( "OCTest/test2", "This is another test case" ) { REQUIRE( obj.int_val == 0 ); obj.int_val = 2; REQUIRE( obj.int_val == 2 ); } OC_TEST_CASE( "OCTest/BOOL", "tests a boolean value" ) { CHECK( [obj isTrue] == NO ); CHECK( [obj isFalse] == YES ); } OC_TEST_CASE( "OCTest/throws/objc", "throws an Objective-C exception" ) { @throw [[NSException alloc] initWithName: NSGenericException reason: @"Objective-C exception" userInfo: nil]; } OC_TEST_CASE( "OCTest/throws/stdc++", "throws a std c++ exception" ) { throw std::domain_error( "std C++ exception" ); } /////////////////////////////////////////////////////////////////////////// template void useObject( const T& object ){} template void useObject( const T* object ){} OC_TEST_CASE( "OCTest/matchers", "Matches work with OC types (NSString so far)" ) { REQUIRE_THAT( @"This is a string", Equals( @"This isnt a string" ) ); REQUIRE_THAT( @"This is a string", Contains( @"is a" ) ); REQUIRE_THAT( @"This is a string", StartsWith( @"This" ) ); REQUIRE_THAT( @"This is a string", EndsWith( @"string" ) ); } OC_TEST_CASE( "OCTest/matchers/nil", "nil NSString should not crash the test" ) { CHECK_THAT( (NSString*)nil, Equals( @"This should fail, but not crash" ) ); CHECK_THAT( (NSString*)nil, StartsWith( @"anything" ) ); } @end Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/Main.mm000066400000000000000000000000561221513074500257560ustar00rootroot00000000000000#define CATCH_CONFIG_MAIN #import "catch.hpp" Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/OCTest.1000066400000000000000000000060611221513074500257640ustar00rootroot00000000000000.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples. .\"See Also: .\"man mdoc.samples for a complete listing of options .\"man mdoc for the short list of editing options .\"/usr/share/misc/mdoc.template .Dd 09/02/2012 \" DATE .Dt OCTest 1 \" Program name and manual section number .Os Darwin .Sh NAME \" Section Header - required - don't modify .Nm OCTest, .\" The following lines are read in generating the apropos(man -k) database. Use only key .\" words here as the database is built based on the words here and in the .ND line. .Nm Other_name_for_same_program(), .Nm Yet another name for the same program. .\" Use .Nm macro to designate other names for the documented program. .Nd This line parsed for whatis database. .Sh SYNOPSIS \" Section Header - required - don't modify .Nm .Op Fl abcd \" [-abcd] .Op Fl a Ar path \" [-a path] .Op Ar file \" [file] .Op Ar \" [file ...] .Ar arg0 \" Underlined argument - use .Ar anywhere to underline arg2 ... \" Arguments .Sh DESCRIPTION \" Section Header - required - don't modify Use the .Nm macro to refer to your program throughout the man page like such: .Nm Underlining is accomplished with the .Ar macro like this: .Ar underlined text . .Pp \" Inserts a space A list of items with descriptions: .Bl -tag -width -indent \" Begins a tagged list .It item a \" Each item preceded by .It macro Description of item a .It item b Description of item b .El \" Ends the list .Pp A list of flags and their descriptions: .Bl -tag -width -indent \" Differs from above in tag removed .It Fl a \"-a flag as a list item Description of -a flag .It Fl b Description of -b flag .El \" Ends the list .Pp .\" .Sh ENVIRONMENT \" May not be needed .\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1 .\" .It Ev ENV_VAR_1 .\" Description of ENV_VAR_1 .\" .It Ev ENV_VAR_2 .\" Description of ENV_VAR_2 .\" .El .Sh FILES \" File used or created by the topic of the man page .Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact .It Pa /usr/share/file_name FILE_1 description .It Pa /Users/joeuser/Library/really_long_file_name FILE_2 description .El \" Ends the list .\" .Sh DIAGNOSTICS \" May not be needed .\" .Bl -diag .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .El .Sh SEE ALSO .\" List links in ascending order by section, alphabetically within a section. .\" Please do not reference files that do not exist without filing a bug report .Xr a 1 , .Xr b 1 , .Xr c 1 , .Xr a 2 , .Xr b 2 , .Xr a 3 , .Xr b 3 .\" .Sh BUGS \" Document known, unremedied bugs .\" .Sh HISTORY \" Document history if command behaves in a unique mannerCatch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/OCTest.mm000066400000000000000000000010621221513074500262310ustar00rootroot00000000000000/* * OCTest.mm * OCTest * * Created by Phil on 13/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ #import "catch.hpp" #import "TestObj.h" TEST_CASE( "OCTest/TestObj", "tests TestObj" ) { TestObj* obj = [[TestObj alloc] init]; REQUIRE( obj.int_val == 0 ); obj.int_val = 1; REQUIRE( obj.int_val == 1 ); arcSafeRelease( obj ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/TestObj.h000066400000000000000000000011051221513074500262560ustar00rootroot00000000000000// // TestObj.h // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef TWOBLUECUBES_TESTOBJ_H_INCLUDED #define TWOBLUECUBES_TESTOBJ_H_INCLUDED #import @interface TestObj : NSObject { int int_val; } -(BOOL) isTrue; -(BOOL) isFalse; @property (nonatomic, assign ) int int_val; @end #endif // TWOBLUECUBES_TESTOBJ_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/OCTest/OCTest/TestObj.m000066400000000000000000000006561221513074500262750ustar00rootroot00000000000000// // TestObj.m // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #import "TestObj.h" @implementation TestObj @synthesize int_val; -(BOOL) isTrue { return YES; } -(BOOL) isFalse { return NO; } @end Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/000077500000000000000000000000001221513074500235665ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest.xcodeproj/000077500000000000000000000000001221513074500271145ustar00rootroot00000000000000project.pbxproj000066400000000000000000000300031221513074500321050ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 4A73280A14E66CFC0044823F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A73280914E66CFC0044823F /* UIKit.framework */; }; 4A73280C14E66CFC0044823F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A73280B14E66CFC0044823F /* Foundation.framework */; }; 4A73280E14E66CFC0044823F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A73280D14E66CFC0044823F /* CoreGraphics.framework */; }; 4A73281414E66CFC0044823F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4A73281214E66CFC0044823F /* InfoPlist.strings */; }; 4A73282614E66D8B0044823F /* itChRunnerMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4A73282514E66D8B0044823F /* itChRunnerMain.mm */; }; 4AB1C74F14FCC74900F31DF7 /* OCTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4AB1C74C14FCC74900F31DF7 /* OCTest.mm */; }; 4AB1C75014FCC74900F31DF7 /* TestObj.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AB1C74E14FCC74900F31DF7 /* TestObj.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 4A73280514E66CFC0044823F /* iOSTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOSTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4A73280914E66CFC0044823F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 4A73280B14E66CFC0044823F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 4A73280D14E66CFC0044823F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 4A73281114E66CFC0044823F /* iOSTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iOSTest-Info.plist"; sourceTree = ""; }; 4A73281314E66CFC0044823F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 4A73281714E66CFC0044823F /* iOSTest-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iOSTest-Prefix.pch"; sourceTree = ""; }; 4A73282214E66D8B0044823F /* iTchRunnerAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTchRunnerAppDelegate.h; sourceTree = ""; }; 4A73282314E66D8B0044823F /* iTchRunnerMainView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTchRunnerMainView.h; sourceTree = ""; }; 4A73282414E66D8B0044823F /* iTchRunnerReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTchRunnerReporter.h; sourceTree = ""; }; 4A73282514E66D8B0044823F /* itChRunnerMain.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = itChRunnerMain.mm; path = ../../../runners/iTchRunner/itChRunnerMain.mm; sourceTree = ""; }; 4AB1C74C14FCC74900F31DF7 /* OCTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OCTest.mm; sourceTree = ""; }; 4AB1C74D14FCC74900F31DF7 /* TestObj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestObj.h; sourceTree = ""; }; 4AB1C74E14FCC74900F31DF7 /* TestObj.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestObj.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 4A73280214E66CFC0044823F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 4A73280A14E66CFC0044823F /* UIKit.framework in Frameworks */, 4A73280C14E66CFC0044823F /* Foundation.framework in Frameworks */, 4A73280E14E66CFC0044823F /* CoreGraphics.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 4A7327FA14E66CFC0044823F = { isa = PBXGroup; children = ( 4A73280F14E66CFC0044823F /* iOSTest */, 4A73280814E66CFC0044823F /* Frameworks */, 4A73280614E66CFC0044823F /* Products */, ); sourceTree = ""; }; 4A73280614E66CFC0044823F /* Products */ = { isa = PBXGroup; children = ( 4A73280514E66CFC0044823F /* iOSTest.app */, ); name = Products; sourceTree = ""; }; 4A73280814E66CFC0044823F /* Frameworks */ = { isa = PBXGroup; children = ( 4A73280914E66CFC0044823F /* UIKit.framework */, 4A73280B14E66CFC0044823F /* Foundation.framework */, 4A73280D14E66CFC0044823F /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; 4A73280F14E66CFC0044823F /* iOSTest */ = { isa = PBXGroup; children = ( 4A73282014E66D6C0044823F /* iTch */, 4A73281014E66CFC0044823F /* Supporting Files */, ); path = iOSTest; sourceTree = ""; }; 4A73281014E66CFC0044823F /* Supporting Files */ = { isa = PBXGroup; children = ( 4A73281114E66CFC0044823F /* iOSTest-Info.plist */, 4A73281214E66CFC0044823F /* InfoPlist.strings */, 4A73281714E66CFC0044823F /* iOSTest-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; 4A73282014E66D6C0044823F /* iTch */ = { isa = PBXGroup; children = ( 4AB1C74C14FCC74900F31DF7 /* OCTest.mm */, 4AB1C74D14FCC74900F31DF7 /* TestObj.h */, 4AB1C74E14FCC74900F31DF7 /* TestObj.m */, 4A73282114E66D8B0044823F /* internal */, 4A73282514E66D8B0044823F /* itChRunnerMain.mm */, ); name = iTch; sourceTree = ""; }; 4A73282114E66D8B0044823F /* internal */ = { isa = PBXGroup; children = ( 4A73282214E66D8B0044823F /* iTchRunnerAppDelegate.h */, 4A73282314E66D8B0044823F /* iTchRunnerMainView.h */, 4A73282414E66D8B0044823F /* iTchRunnerReporter.h */, ); name = internal; path = ../../../runners/iTchRunner/internal; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 4A73280414E66CFC0044823F /* iOSTest */ = { isa = PBXNativeTarget; buildConfigurationList = 4A73281D14E66CFC0044823F /* Build configuration list for PBXNativeTarget "iOSTest" */; buildPhases = ( 4A73280114E66CFC0044823F /* Sources */, 4A73280214E66CFC0044823F /* Frameworks */, 4A73280314E66CFC0044823F /* Resources */, ); buildRules = ( ); dependencies = ( ); name = iOSTest; productName = iOSTest; productReference = 4A73280514E66CFC0044823F /* iOSTest.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 4A7327FC14E66CFC0044823F /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0420; }; buildConfigurationList = 4A7327FF14E66CFC0044823F /* Build configuration list for PBXProject "iOSTest" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 4A7327FA14E66CFC0044823F; productRefGroup = 4A73280614E66CFC0044823F /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 4A73280414E66CFC0044823F /* iOSTest */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 4A73280314E66CFC0044823F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 4A73281414E66CFC0044823F /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 4A73280114E66CFC0044823F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4A73282614E66D8B0044823F /* itChRunnerMain.mm in Sources */, 4AB1C74F14FCC74900F31DF7 /* OCTest.mm in Sources */, 4AB1C75014FCC74900F31DF7 /* TestObj.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 4A73281214E66CFC0044823F /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 4A73281314E66CFC0044823F /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 4A73281B14E66CFC0044823F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer: Phil Nash (4KJCM5XSVL)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.0; PROVISIONING_PROFILE = "95C4758A-E0B8-4714-9DA3-C7E1284444A4"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = ../../../include; }; name = Debug; }; 4A73281C14E66CFC0044823F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer: Phil Nash (4KJCM5XSVL)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PROVISIONING_PROFILE = "95C4758A-E0B8-4714-9DA3-C7E1284444A4"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = ../../../include; VALIDATE_PRODUCT = YES; }; name = Release; }; 4A73281E14E66CFC0044823F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iOSTest/iOSTest-Prefix.pch"; INFOPLIST_FILE = "iOSTest/iOSTest-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Debug; }; 4A73281F14E66CFC0044823F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iOSTest/iOSTest-Prefix.pch"; INFOPLIST_FILE = "iOSTest/iOSTest-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4A7327FF14E66CFC0044823F /* Build configuration list for PBXProject "iOSTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A73281B14E66CFC0044823F /* Debug */, 4A73281C14E66CFC0044823F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4A73281D14E66CFC0044823F /* Build configuration list for PBXNativeTarget "iOSTest" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A73281E14E66CFC0044823F /* Debug */, 4A73281F14E66CFC0044823F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 4A7327FC14E66CFC0044823F /* Project object */; } 000077500000000000000000000000001221513074500330335ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest.xcodeproj/project.xcworkspacecontents.xcworkspacedata000066400000000000000000000002301221513074500377700ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest.xcodeproj/project.xcworkspace Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/000077500000000000000000000000001221513074500251205ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/OCTest.mm000066400000000000000000000010621221513074500266130ustar00rootroot00000000000000/* * OCTest.mm * OCTest * * Created by Phil on 13/11/2010. * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ #include "catch.hpp" #import "TestObj.h" TEST_CASE( "OCTest/TestObj", "tests TestObj" ) { TestObj* obj = [[TestObj alloc] init]; REQUIRE( obj.int_val == 0 ); obj.int_val = 1; REQUIRE( obj.int_val == 1 ); arcSafeRelease( obj ); } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/TestObj.h000066400000000000000000000010431221513074500266410ustar00rootroot00000000000000// // TestObj.h // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef TWOBLUECUBES_TESTOBJ_H_INCLUDED #define TWOBLUECUBES_TESTOBJ_H_INCLUDED #import @interface TestObj : NSObject { int int_val; } @property (nonatomic, assign ) int int_val; @end #endif // TWOBLUECUBES_TESTOBJ_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/TestObj.m000066400000000000000000000005471221513074500266560ustar00rootroot00000000000000// // TestObj.m // OCTest // // Created by Phil on 13/11/2010. // Copyright 2010 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #import "TestObj.h" @implementation TestObj @synthesize int_val; @end Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/en.lproj/000077500000000000000000000000001221513074500266475ustar00rootroot00000000000000InfoPlist.strings000066400000000000000000000000551221513074500321120ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/en.lproj/* Localized versions of Info.plist keys */ Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/iOSTest-Info.plist000066400000000000000000000027331221513074500304250ustar00rootroot00000000000000 CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFiles CFBundleIdentifier twobluecubes.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/XCode4/iOSTest/iOSTest/iOSTest-Prefix.pch000066400000000000000000000004751221513074500304070ustar00rootroot00000000000000// // Prefix header for all source files of the 'iOSTest' target in the 'iOSTest' project // #import #ifndef __IPHONE_3_0 #warning "This project uses features only available in iOS SDK 3.0 and later." #endif #ifdef __OBJC__ #import #import #endif Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/000077500000000000000000000000001221513074500226425ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/iTchRunner/000077500000000000000000000000001221513074500247235ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/iTchRunner/internal/000077500000000000000000000000001221513074500265375ustar00rootroot00000000000000iTchRunnerAppDelegate.h000066400000000000000000000071001221513074500330040ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/iTchRunner/internal/* * iTchRunnerAppDelegate.h * iTchRunner * * Created by Phil on 07/02/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * */ #ifndef TWOBLUECUBES_ITCHRUNNERAPPDELEGATE_H_INCLUDED #define TWOBLUECUBES_ITCHRUNNERAPPDELEGATE_H_INCLUDED #import "iTchRunnerMainView.h" @interface iTchRunnerAppDelegate : NSObject { UIWindow *window; } @end @implementation iTchRunnerAppDelegate /////////////////////////////////////////////////////////////////////////////// - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [window setUserInteractionEnabled:YES]; [window setMultipleTouchEnabled:YES]; CGRect screenRect = [[UIScreen mainScreen] applicationFrame]; iTchRunnerMainView* view = [[iTchRunnerMainView alloc] initWithFrame:screenRect]; [window addSubview:view]; [window makeKeyAndVisible]; arcSafeRelease( view ); return YES; } /////////////////////////////////////////////////////////////////////////////// - (void)dealloc { #if !CATCH_ARC_ENABLED [window release]; [super dealloc]; #endif } /////////////////////////////////////////////////////////////////////////////// - (void)applicationWillResignActive:(UIApplication *)application { /* Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. */ } /////////////////////////////////////////////////////////////////////////////// - (void)applicationDidEnterBackground:(UIApplication *)application { /* Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. If your application supports background execution, called instead of applicationWillTerminate: when the user quits. */ } /////////////////////////////////////////////////////////////////////////////// - (void)applicationWillEnterForeground:(UIApplication *)application { /* Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. */ } /////////////////////////////////////////////////////////////////////////////// - (void)applicationDidBecomeActive:(UIApplication *)application { /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ } /////////////////////////////////////////////////////////////////////////////// - (void)applicationWillTerminate:(UIApplication *)application { /* Called when the application is about to terminate. See also applicationDidEnterBackground:. */ } /////////////////////////////////////////////////////////////////////////////// - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { /* Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. */ } @end #endif // TWOBLUECUBES_ITCHRUNNERAPPDELEGATE_H_INCLUDED iTchRunnerMainView.h000066400000000000000000000140641221513074500323570ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/iTchRunner/internal/* * iTchRunnerMainView.h * iTchRunner * * Created by Phil on 07/02/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * */ #ifndef TWOBLUECUBES_ITCHRUNNERMAINVIEW_H_INCLUDED #define TWOBLUECUBES_ITCHRUNNERMAINVIEW_H_INCLUDED #include "internal/catch_config.hpp" #include "internal/catch_runner_impl.hpp" #include "internal/catch_context_impl.hpp" #include "catch.hpp" #include "iTchRunnerReporter.h" #import @interface iTchRunnerMainView : UIView { UITextField* appName; } -(void) showAlert; @end @implementation iTchRunnerMainView /////////////////////////////////////////////////////////////////////////////// -(id) initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { // Initialization code self.backgroundColor = [UIColor blackColor]; appName = [[UITextField alloc] initWithFrame: CGRectMake( 0, 50, 320, 50 )]; [self addSubview: appName]; arcSafeRelease( appName ); appName.textColor = [[UIColor alloc] initWithRed:0.35 green:0.35 blue:1 alpha:1]; arcSafeRelease( appName.textColor ); appName.textAlignment = UITextAlignmentCenter; // or NSTextAlignmentCenter appName.text = [NSString stringWithFormat:@"CATCH tests"]; // [self performSelector: @selector(showAlert) withObject:nil afterDelay:0.1]; [self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:NO]; } return self; } /////////////////////////////////////////////////////////////////////////////// -(void) dealloc { [appName removeFromSuperview]; #if !CATCH_ARC_ENABLED [super dealloc]; #endif } /////////////////////////////////////////////////////////////////////////////// -(void) showAlert { UIActionSheet* menu = [[UIActionSheet alloc] initWithTitle:@"Options" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Run all tests", nil]; [menu showInView: self]; arcSafeRelease( menu ); } // This is a copy & paste from Catch::Runner2 to get us bootstrapped (this is due to all be // replaced anyway) inline Catch::Totals runTestsForGroup( Catch::RunContext& context, const Catch::TestCaseFilters& filterGroup ) { using namespace Catch; Totals totals; std::vector::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin(); std::vector::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end(); int testsRunForGroup = 0; for(; it != itEnd; ++it ) { if( filterGroup.shouldInclude( *it ) ) { testsRunForGroup++; if( context.aborting() ) break; totals += context.runTest( *it ); } } if( testsRunForGroup == 0 ) std::cerr << "\n[No test cases matched with: " << filterGroup.getName() << "]" << std::endl; return totals; } /////////////////////////////////////////////////////////////////////////////// -(void) actionSheet: (UIActionSheet*) sheet clickedButtonAtIndex: (NSInteger) index { Catch::Ptr config = new Catch::Config(); Catch::IReporter* reporter = new Catch::iTchRunnerReporter( self ); Catch::LegacyReporterAdapter* reporterAdapter = new Catch::LegacyReporterAdapter( reporter ); Catch::RunContext runner( config.get(), reporterAdapter ); std::vector filterGroups; Catch::TestCaseFilters filterGroup( "" ); filterGroups.push_back( filterGroup ); Catch::Totals totals; std::vector::const_iterator it = filterGroups.begin(); std::vector::const_iterator itEnd = filterGroups.end(); std::size_t groupCount = filterGroups.size(); std::size_t groupIndex = 0; for(; it != itEnd && !runner.aborting(); ++it, ++index ) { runner.testGroupStarting( it->getName(), groupIndex, groupCount ); totals += runTestsForGroup( runner, *it ); runner.testGroupEnded( it->getName(), totals, groupIndex, groupCount ); } if( totals.assertions.failed == 0 ) { NSLog( @"no failures" ); if( totals.assertions.passed > 0 ) appName.textColor = [[UIColor alloc] initWithRed:0.35 green:1 blue:0.35 alpha:1]; } else { NSLog( @"%lu failures", totals.assertions.failed ); appName.textColor = [[UIColor alloc] initWithRed:1 green:0.35 blue:0.35 alpha:1]; } } /////////////////////////////////////////////////////////////////////////////// -(void) testWasRun: (const Catch::AssertionResult*) pResultInfo { const Catch::AssertionResult& resultInfo = *pResultInfo; std::ostringstream oss; if( resultInfo.hasExpression() ) { oss << resultInfo.getExpression(); if( resultInfo.isOk() ) oss << " succeeded"; else oss << " failed"; } switch( resultInfo.getResultType() ) { case Catch::ResultWas::ThrewException: if( resultInfo.hasExpression() ) oss << " with unexpected"; else oss << "Unexpected"; oss << " exception with message: '" << resultInfo.getMessage() << "'"; break; case Catch::ResultWas::Info: oss << "info: '" << resultInfo.getMessage() << "'"; break; case Catch::ResultWas::Warning: oss << "warning: '" << resultInfo.getMessage() << "'"; break; case Catch::ResultWas::ExplicitFailure: oss << "failed with message: '" << resultInfo.getMessage() << "'"; break; default: break; } if( resultInfo.hasExpression() ) { oss << " for: " << resultInfo.getExpandedExpression(); } oss << std::endl; NSLog( @"%s", oss.str().c_str() ); } @end #endif // TWOBLUECUBES_ITCHRUNNERMAINVIEW_H_INCLUDED iTchRunnerReporter.h000066400000000000000000000063671221513074500324510ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/iTchRunner/internal/* * iTchRunnerReporter.h * iTchRunner * * Created by Phil on 07/02/2011. * Copyright 2011 Two Blue Cubes Ltd. All rights reserved. * */ #ifndef TWOBLUECUBES_ITCHRUNNERREPORTER_H_INCLUDED #define TWOBLUECUBES_ITCHRUNNERREPORTER_H_INCLUDED #include "catch.hpp" @protocol iTchRunnerDelegate -(void) testWasRun: (const Catch::AssertionResult*) result; @end namespace Catch { class iTchRunnerReporter : public SharedImpl { public: /////////////////////////////////////////////////////////////////////////// iTchRunnerReporter ( id delegate ) : m_delegate( delegate ) { } /////////////////////////////////////////////////////////////////////////// virtual bool shouldRedirectStdout () const { return true; } /////////////////////////////////////////////////////////////////////////// static std::string getDescription () { return "Captures results for iOS runner"; } /////////////////////////////////////////////////////////////////////////// size_t getSucceeded () const { return m_totals.assertions.passed; } /////////////////////////////////////////////////////////////////////////// size_t getFailed () const { return m_totals.assertions.failed; } /////////////////////////////////////////////////////////////////////////// void reset() { m_totals = Totals(); } private: // IReporter /////////////////////////////////////////////////////////////////////////// virtual void StartTesting () {} /////////////////////////////////////////////////////////////////////////// virtual void EndTesting ( const Totals& totals ) { m_totals = totals; } /////////////////////////////////////////////////////////////////////////// virtual void Result ( const AssertionResult& result ) { [m_delegate testWasRun: &result]; } /////////////////////////////////////////////////////////////////////////// // Deliberately unimplemented: virtual void StartGroup( const std::string& ){} virtual void EndGroup( const std::string&, const Totals& ){} virtual void StartTestCase( const TestCaseInfo& ){} virtual void StartSection( const std::string& sectionName, const std::string& description ) {} virtual void EndSection( const std::string&, const Counts& ){} virtual void EndTestCase( const TestCaseInfo&, const Totals&, const std::string&, const std::string& ){} virtual void Aborted() {} virtual void NoAssertionsInSection( std::string const& sectionName ) {} virtual void NoAssertionsInTestCase( std::string const& testName ) {} private: Totals m_totals; id m_delegate; }; } #endif // TWOBLUECUBES_ITCHRUNNERREPORTER_H_INCLUDED Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/iTchRunner/itChRunnerMain.mm000066400000000000000000000010611221513074500301420ustar00rootroot00000000000000// // iTchRunnerMain.mm // iTchRunner // // Created by Phil on 04/02/2011. // Copyright Two Blue Cubes Ltd 2011. All rights reserved. // #define CATCH_CONFIG_RUNNER #include "catch.hpp" #import "internal/iTchRunnerAppDelegate.h" int main(int argc, char *argv[]) { #if !CATCH_ARC_ENABLED NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; #endif Catch::registerTestMethods(); int retVal = UIApplicationMain(argc, argv, nil, @"iTchRunnerAppDelegate"); #if !CATCH_ARC_ENABLED [pool release]; #endif return retVal; } Catch-1e2f1d160336be07411775c476bfed3c7673263f/projects/runners/iTchRunner/readme000066400000000000000000000011051221513074500261000ustar00rootroot00000000000000* Select Project -> New Target. Select Cocoa Touch -> Application. Click next and name it something like "Unit Tests" * While the target info is displayed, find: 'User Header Search Paths' and add a path to the Catch folder * Open the plist file for the target (Unit Test-Info.plist, if you used that name). Delete the entry for "Main nib file base name: MainWindow" * From the overview drop-down select the new target. * Add the file Catch/Runner/iTchRunnerMain.mm into your project - but only in the new target * Write tests (adding files under test into the target as necessary)Catch-1e2f1d160336be07411775c476bfed3c7673263f/scripts/000077500000000000000000000000001221513074500210045ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/scripts/approvalTests.py000066400000000000000000000043741221513074500242350ustar00rootroot00000000000000import os import sys import subprocess import re from scriptCommon import catchPath filenameParser = re.compile( r'\s*.*/(.*\..pp):([0-9]*)(.*)' ) lineNumberParser = re.compile( r'(.*)line="[0-9]*"(.*)' ) hexParser = re.compile( r'(.*)\b(0[xX][0-9a-fA-F]+)\b(.*)' ) durationsParser = re.compile( r'(.*)time="[0-9]*\.[0-9]*"(.*)' ) #catchPath = os.path.dirname(os.path.realpath( os.path.dirname(sys.argv[0]))) baselinesPath = os.path.join( catchPath, 'projects/SelfTest/Baselines/approvedResults.txt' ) rawResultsPath = os.path.join( catchPath, 'projects/SelfTest/Baselines/_rawResults.tmp' ) filteredResultsPath = os.path.join( catchPath, 'projects/SelfTest/Baselines/unapprovedResults.txt' ) if len(sys.argv) == 2: cmdPath = sys.argv[1] else: cmdPath = os.path.join( catchPath, 'projects/XCode4/CatchSelfTest/DerivedData/CatchSelfTest/Build/Products/Debug/CatchSelfTest' ) f = open( rawResultsPath, 'w' ) subprocess.call([ cmdPath, "~dummy", "-r", "console" ], stdout=f, stderr=f ) subprocess.call([ cmdPath, "~dummy", "-s", "-w", "NoAssertions", "-r", "console" ], stdout=f, stderr=f ) subprocess.call([ cmdPath, "~dummy", "-s", "-w", "NoAssertions", "-r", "console", "-a", "4" ], stdout=f, stderr=f ) subprocess.call([ cmdPath, "~dummy", "-s", "-w", "NoAssertions", "-r", "junit" ], stdout=f, stderr=f ) subprocess.call([ cmdPath, "~dummy", "-s", "-w", "NoAssertions", "-r", "xml" ], stdout=f, stderr=f ) f.close() rawFile = open( rawResultsPath, 'r' ) filteredFile = open( filteredResultsPath, 'w' ) for line in rawFile: m = filenameParser.match( line ) if m: line = m.group(1) + m.group(3) else: m = lineNumberParser.match( line ) if m: line = m.group(1) + m.group(2) while True: m = hexParser.match( line ) if m: line = m.group(1) + "0x" + m.group(3) else: break m = durationsParser.match( line ) if m: line = m.group(1) + 'time="{duration}"' + m.group(2) filteredFile.write( line.rstrip() + "\n" ) filteredFile.close() rawFile.close() os.remove( rawResultsPath ) print diffResult = subprocess.call([ "diff", baselinesPath, filteredResultsPath ] ) if diffResult == 0: os.remove( filteredResultsPath ) print "\033[92mResults matched" else: print "\n****************************\n\033[91mResults differed" print "\033[0m" exit( diffResult)Catch-1e2f1d160336be07411775c476bfed3c7673263f/scripts/approve.py000066400000000000000000000007121221513074500230320ustar00rootroot00000000000000import os import sys import shutil from scriptCommon import catchPath baselinesPath = os.path.join( catchPath, 'projects/SelfTest/Baselines/approvedResults.txt' ) filteredResultsPath = os.path.join( catchPath, 'projects/SelfTest/Baselines/unapprovedResults.txt' ) if os.path.isfile( filteredResultsPath ): os.remove( baselinesPath ) os.rename( filteredResultsPath, baselinesPath ) else: print "approval file " + filteredResultsPath + " does not exist" Catch-1e2f1d160336be07411775c476bfed3c7673263f/scripts/generateSingleHeader.py000066400000000000000000000077711221513074500254370ustar00rootroot00000000000000import os import sys import re import datetime from scriptCommon import catchPath versionParser = re.compile( r'(\s*Version\slibraryVersion)\s*\(\s*(.*)\s*,\s*(.*)\s*,\s*(.*)\s*,\s*\"(.*)\"\s*\).*' ) includesParser = re.compile( r'\s*#include\s*"(.*)"' ) guardParser = re.compile( r'\s*#.*_INCLUDED') defineParser = re.compile( r'\s*#define') commentParser1 = re.compile( r'^\s*/\*') commentParser2 = re.compile( r'^\s*\*') blankParser = re.compile( r'^\s*$') seenHeaders = set([]) rootPath = os.path.join( catchPath, 'include/' ) versionPath = os.path.join( rootPath, "internal/catch_version.hpp" ) readmePath = os.path.join( catchPath, "README.md" ) outputPath = os.path.join( catchPath, 'single_include/catch.hpp' ) bumpVersion = len(sys.argv) < 2 or sys.argv[1] <> "nobump" out = open( outputPath, 'w' ) def parseFile( path, filename ): f = open( path + filename, 'r' ) blanks = 0 for line in f: m = includesParser.match( line ) if m: header = m.group(1) headerPath, sep, headerFile = header.rpartition( "/" ) if not headerFile in seenHeaders: seenHeaders.add( headerFile ) out.write( "// #included from: {0}\n".format( header ) ) if( headerPath == "internal" and path.endswith( "internal/" ) ): headerPath = "" sep = "" if os.path.exists( path + headerPath + sep + headerFile ): parseFile( path + headerPath + sep, headerFile ) else: parseFile( rootPath + headerPath + sep, headerFile ) elif (not guardParser.match( line ) or defineParser.match( line ) ) and not commentParser1.match( line )and not commentParser2.match( line ): if blankParser.match( line ): blanks = blanks + 1 else: blanks = 0 if blanks < 2: out.write( line.rstrip() + "\n" ) class Version: def __init__(self): f = open( versionPath, 'r' ) for line in f: m = versionParser.match( line ) if m: self.variableDecl = m.group(1) self.majorVersion = int(m.group(2)) self.minorVersion = int(m.group(3)) self.buildNumber = int(m.group(4)) self.branchName = m.group(5) f.close() def incrementBuildNumber(self): self.buildNumber = self.buildNumber+1 def updateVersionFile(self): f = open( versionPath, 'r' ) lines = [] for line in f: m = versionParser.match( line ) if m: lines.append( '{0}( {1}, {2}, {3}, "{4}" );'.format( self.variableDecl, self.majorVersion, self.minorVersion, self.buildNumber, self.branchName ) ) else: lines.append( line.rstrip() ) f.close() f = open( versionPath, 'w' ) for line in lines: f.write( line + "\n" ) def updateReadmeFile(self): f = open( readmePath, 'r' ) lines = [] for line in f: lines.append( line.rstrip() ) f.close() f = open( readmePath, 'w' ) for line in lines: if line.startswith( "*v" ): f.write( '*v{0}.{1} build {2} ({3} branch)*\n'.format( self.majorVersion, self.minorVersion, self.buildNumber, self.branchName ) ) else: f.write( line + "\n" ) def generateSingleInclude(): v = Version() if bumpVersion: v.incrementBuildNumber() v.updateVersionFile() v.updateReadmeFile() out.write( "/*\n" ) out.write( " * CATCH v{0}.{1} build {2} ({3} branch)\n".format( v.majorVersion, v.minorVersion, v.buildNumber, v.branchName ) ) out.write( " * Generated: {0}\n".format( datetime.datetime.now() ) ) out.write( " * ----------------------------------------------------------\n" ) out.write( " * This file has been merged from multiple headers. Please don't edit it directly\n" ) out.write( " * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.\n" ) out.write( " *\n" ) out.write( " * Distributed under the Boost Software License, Version 1.0. (See accompanying\n" ) out.write( " * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n" ) out.write( " */\n" ) out.write( "#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n" ) out.write( "#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n" ) parseFile( rootPath, 'catch.hpp' ) out.write( "#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n\n" ) generateSingleInclude() Catch-1e2f1d160336be07411775c476bfed3c7673263f/scripts/scriptCommon.py000066400000000000000000000001421221513074500240300ustar00rootroot00000000000000import os import sys catchPath = os.path.dirname(os.path.realpath( os.path.dirname(sys.argv[0])))Catch-1e2f1d160336be07411775c476bfed3c7673263f/single_include/000077500000000000000000000000001221513074500223015ustar00rootroot00000000000000Catch-1e2f1d160336be07411775c476bfed3c7673263f/single_include/catch.hpp000066400000000000000000010363001221513074500240770ustar00rootroot00000000000000/* * CATCH v1.0 build 10 (master branch) * Generated: 2013-09-14 19:56:34.776409 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED #define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED #define TWOBLUECUBES_CATCH_HPP_INCLUDED #ifdef __clang__ #pragma clang diagnostic ignored "-Wglobal-constructors" #pragma clang diagnostic ignored "-Wvariadic-macros" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif // #included from: internal/catch_notimplemented_exception.h #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED // #included from: catch_common.h #define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) #define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) #define INTERNAL_CATCH_STRINGIFY2( expr ) #expr #define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) #include #include #include // #included from: catch_compiler_capabilities.h #define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED // Much of the following code is based on Boost (1.53) //////////////////////////////////////////////////////////////////////////////// // Borland #ifdef __BORLANDC__ #if (__BORLANDC__ > 0x582 ) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // __BORLANDC__ //////////////////////////////////////////////////////////////////////////////// // EDG #ifdef __EDG_VERSION__ #if (__EDG_VERSION__ > 238 ) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // __EDG_VERSION__ //////////////////////////////////////////////////////////////////////////////// // Digital Mars #ifdef __DMC__ #if (__DMC__ > 0x840 ) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // __DMC__ //////////////////////////////////////////////////////////////////////////////// // GCC #ifdef __GNUC__ #if __GNUC__ < 3 #if (__GNUC_MINOR__ >= 96 ) //#define CATCH_CONFIG_SFINAE #endif #elif __GNUC__ >= 3 // #define CATCH_CONFIG_SFINAE // Taking this out completely for now #endif // __GNUC__ < 3 #endif // __GNUC__ //////////////////////////////////////////////////////////////////////////////// // Visual C++ #ifdef _MSC_VER #if (_MSC_VER >= 1310 ) // (VC++ 7.0+) //#define CATCH_CONFIG_SFINAE // Not confirmed #endif #endif // _MSC_VER // Use variadic macros if the compiler supports them #if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ ( defined __GNUC__ && __GNUC__ >= 3 ) || \ ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) #ifndef CATCH_CONFIG_NO_VARIADIC_MACROS #define CATCH_CONFIG_VARIADIC_MACROS #endif #endif namespace Catch { class NonCopyable { NonCopyable( NonCopyable const& ); void operator = ( NonCopyable const& ); protected: NonCopyable() {} virtual ~NonCopyable(); }; class SafeBool { public: typedef void (SafeBool::*type)() const; static type makeSafe( bool value ) { return value ? &SafeBool::trueValue : 0; } private: void trueValue() const {} }; template inline void deleteAll( ContainerT& container ) { typename ContainerT::const_iterator it = container.begin(); typename ContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) delete *it; } template inline void deleteAllValues( AssociativeContainerT& container ) { typename AssociativeContainerT::const_iterator it = container.begin(); typename AssociativeContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) delete it->second; } template inline void forEach( ContainerT& container, Function function ) { std::for_each( container.begin(), container.end(), function ); } template inline void forEach( ContainerT const& container, Function function ) { std::for_each( container.begin(), container.end(), function ); } inline bool startsWith( std::string const& s, std::string const& prefix ) { return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; } inline bool endsWith( std::string const& s, std::string const& suffix ) { return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; } inline bool contains( std::string const& s, std::string const& infix ) { return s.find( infix ) != std::string::npos; } inline void toLowerInPlace( std::string& s ) { std::transform( s.begin(), s.end(), s.begin(), ::tolower ); } inline std::string toLower( std::string const& s ) { std::string lc = s; toLowerInPlace( lc ); return lc; } struct pluralise { pluralise( std::size_t count, std::string const& label ) : m_count( count ), m_label( label ) {} friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { os << pluraliser.m_count << " " << pluraliser.m_label; if( pluraliser.m_count != 1 ) os << "s"; return os; } std::size_t m_count; std::string m_label; }; struct SourceLineInfo { SourceLineInfo() : line( 0 ){} SourceLineInfo( std::string const& _file, std::size_t _line ) : file( _file ), line( _line ) {} SourceLineInfo( SourceLineInfo const& other ) : file( other.file ), line( other.line ) {} bool empty() const { return file.empty(); } bool operator == ( SourceLineInfo const& other ) const { return line == other.line && file == other.file; } std::string file; std::size_t line; }; inline std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { #ifndef __GNUG__ os << info.file << "(" << info.line << ")"; #else os << info.file << ":" << info.line; #endif return os; } // This is just here to avoid compiler warnings with macro constants and boolean literals inline bool isTrue( bool value ){ return value; } inline void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { std::ostringstream oss; oss << locationInfo << ": Internal Catch error: '" << message << "'"; if( isTrue( true )) throw std::logic_error( oss.str() ); } } #define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) #define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); #include namespace Catch { class NotImplementedException : public std::exception { public: NotImplementedException( SourceLineInfo const& lineInfo ); virtual ~NotImplementedException() throw() {} virtual const char* what() const throw(); private: std::string m_what; SourceLineInfo m_lineInfo; }; } // end namespace Catch /////////////////////////////////////////////////////////////////////////////// #define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) // #included from: internal/catch_context.h #define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED // #included from: catch_interfaces_generators.h #define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED #include namespace Catch { struct IGeneratorInfo { virtual ~IGeneratorInfo(); virtual bool moveNext() = 0; virtual std::size_t getCurrentIndex() const = 0; }; struct IGeneratorsForTest { virtual ~IGeneratorsForTest(); virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; virtual bool moveNext() = 0; }; IGeneratorsForTest* createGeneratorsForTest(); } // end namespace Catch // #included from: catch_ptr.hpp #define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { // An intrusive reference counting smart pointer. // T must implement addRef() and release() methods // typically implementing the IShared interface template class Ptr { public: Ptr() : m_p( NULL ){} Ptr( T* p ) : m_p( p ){ if( m_p ) m_p->addRef(); } Ptr( Ptr const& other ) : m_p( other.m_p ){ if( m_p ) m_p->addRef(); } ~Ptr(){ if( m_p ) m_p->release(); } void reset() { if( m_p ) m_p->release(); m_p = NULL; } Ptr& operator = ( T* p ){ Ptr temp( p ); swap( temp ); return *this; } Ptr& operator = ( Ptr const& other ){ Ptr temp( other ); swap( temp ); return *this; } void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } T* get() { return m_p; } const T* get() const{ return m_p; } T& operator*() const { return *m_p; } T* operator->() const { return m_p; } bool operator !() const { return m_p == NULL; } operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); } private: T* m_p; }; struct IShared : NonCopyable { virtual ~IShared(); virtual void addRef() const = 0; virtual void release() const = 0; }; template struct SharedImpl : T { SharedImpl() : m_rc( 0 ){} virtual void addRef() const { ++m_rc; } virtual void release() const { if( --m_rc == 0 ) delete this; } mutable unsigned int m_rc; }; } // end namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif #include #include #include namespace Catch { class TestCase; class Stream; struct IResultCapture; struct IRunner; struct IGeneratorsForTest; struct IConfig; struct IContext { virtual ~IContext(); virtual IResultCapture& getResultCapture() = 0; virtual IRunner& getRunner() = 0; virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; virtual bool advanceGeneratorsForCurrentTest() = 0; virtual Ptr getConfig() const = 0; }; struct IMutableContext : IContext { virtual ~IMutableContext(); virtual void setResultCapture( IResultCapture* resultCapture ) = 0; virtual void setRunner( IRunner* runner ) = 0; virtual void setConfig( Ptr const& config ) = 0; }; IContext& getCurrentContext(); IMutableContext& getCurrentMutableContext(); void cleanUpContext(); Stream createStream( std::string const& streamName ); } // #included from: internal/catch_test_registry.hpp #define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED // #included from: catch_interfaces_testcase.h #define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED #include namespace Catch { class TestCaseFilters; struct ITestCase : IShared { virtual void invoke () const = 0; protected: virtual ~ITestCase(); }; class TestCase; struct ITestCaseRegistry { virtual ~ITestCaseRegistry(); virtual std::vector const& getAllTests() const = 0; virtual std::vector getMatchingTestCases( std::string const& rawTestSpec ) const = 0; }; } namespace Catch { template class MethodTestCase : public SharedImpl { public: MethodTestCase( void (C::*method)() ) : m_method( method ) {} virtual void invoke() const { C obj; (obj.*m_method)(); } private: virtual ~MethodTestCase() {} void (C::*m_method)(); }; typedef void(*TestFunction)(); struct NameAndDesc { NameAndDesc( const char* _name = "", const char* _description= "" ) : name( _name ), description( _description ) {} const char* name; const char* description; }; struct AutoReg { AutoReg( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ); template AutoReg( void (C::*method)(), char const* className, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ) { registerTestCase( new MethodTestCase( method ), className, nameAndDesc, lineInfo ); } void registerTestCase( ITestCase* testCase, char const* className, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ); ~AutoReg(); private: AutoReg( AutoReg const& ); void operator= ( AutoReg const& ); }; } // end namespace Catch #ifdef CATCH_CONFIG_VARIADIC_MACROS /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE( ... ) \ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ namespace{ \ struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ void test(); \ }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ } \ void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() #else /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ namespace{ \ struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ void test(); \ }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ } \ void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() #endif // #included from: internal/catch_capture.hpp #define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED // #included from: catch_expression_decomposer.hpp #define TWOBLUECUBES_CATCH_EXPRESSION_DECOMPOSER_HPP_INCLUDED // #included from: catch_expression_lhs.hpp #define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED // #included from: catch_expressionresult_builder.h #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_BUILDER_H_INCLUDED // #included from: catch_tostring.hpp #define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED // #included from: catch_sfinae.hpp #define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED // Try to detect if the current compiler supports SFINAE namespace Catch { struct TrueType { static const bool value = true; typedef void Enable; char sizer[1]; }; struct FalseType { static const bool value = false; typedef void Disable; char sizer[2]; }; #ifdef CATCH_CONFIG_SFINAE template struct NotABooleanExpression; template struct If : NotABooleanExpression {}; template<> struct If : TrueType {}; template<> struct If : FalseType {}; template struct SizedIf; template<> struct SizedIf : TrueType {}; template<> struct SizedIf : FalseType {}; #endif // CATCH_CONFIG_SFINAE } // end namespace Catch #include #include #include #ifdef __OBJC__ // #included from: catch_objc_arc.hpp #define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED #import #ifdef __has_feature #define CATCH_ARC_ENABLED __has_feature(objc_arc) #else #define CATCH_ARC_ENABLED 0 #endif void arcSafeRelease( NSObject* obj ); id performOptionalSelector( id obj, SEL sel ); #if !CATCH_ARC_ENABLED inline void arcSafeRelease( NSObject* obj ) { [obj release]; } inline id performOptionalSelector( id obj, SEL sel ) { if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; return nil; } #define CATCH_UNSAFE_UNRETAINED #define CATCH_ARC_STRONG #else inline void arcSafeRelease( NSObject* ){} inline id performOptionalSelector( id obj, SEL sel ) { #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" #endif if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; #ifdef __clang__ #pragma clang diagnostic pop #endif return nil; } #define CATCH_UNSAFE_UNRETAINED __unsafe_unretained #define CATCH_ARC_STRONG __strong #endif #endif namespace Catch { namespace Detail { // SFINAE is currently disabled by default for all compilers. // If the non SFINAE version of IsStreamInsertable is ambiguous for you // and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE #ifdef CATCH_CONFIG_SFINAE template class IsStreamInsertableHelper { template struct TrueIfSizeable : TrueType {}; template static TrueIfSizeable dummy(T2*); static FalseType dummy(...); public: typedef SizedIf type; }; template struct IsStreamInsertable : IsStreamInsertableHelper::type {}; #else struct BorgType { template BorgType( T const& ); }; TrueType& testStreamable( std::ostream& ); FalseType testStreamable( FalseType ); FalseType operator<<( std::ostream const&, BorgType const& ); template struct IsStreamInsertable { static std::ostream &s; static T const&t; enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; }; #endif template struct StringMakerBase { template static std::string convert( T const& ) { return "{?}"; } }; template<> struct StringMakerBase { template static std::string convert( T const& _value ) { std::ostringstream oss; oss << _value; return oss.str(); } }; } // end namespace Detail template std::string toString( T const& value ); template struct StringMaker : Detail::StringMakerBase::value> {}; template struct StringMaker { template static std::string convert( U* p ) { if( !p ) return INTERNAL_CATCH_STRINGIFY( NULL ); std::ostringstream oss; oss << p; return oss.str(); } }; template struct StringMaker > { static std::string convert( std::vector const& v ) { std::ostringstream oss; oss << "{ "; for( std::size_t i = 0; i < v.size(); ++ i ) { oss << toString( v[i] ); if( i < v.size() - 1 ) oss << ", "; } oss << " }"; return oss.str(); } }; namespace Detail { template inline std::string makeString( T const& value ) { return StringMaker::convert( value ); } } // end namespace Detail /// \brief converts any type to a string /// /// The default template forwards on to ostringstream - except when an /// ostringstream overload does not exist - in which case it attempts to detect /// that and writes {?}. /// Overload (not specialise) this template for custom typs that you don't want /// to provide an ostream overload for. template std::string toString( T const& value ) { return StringMaker::convert( value ); } // Built in overloads inline std::string toString( std::string const& value ) { return "\"" + value + "\""; } inline std::string toString( std::wstring const& value ) { std::ostringstream oss; oss << "\""; for(size_t i = 0; i < value.size(); ++i ) oss << static_cast( value[i] <= 0xff ? value[i] : '?'); oss << "\""; return oss.str(); } inline std::string toString( const char* const value ) { return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); } inline std::string toString( char* const value ) { return Catch::toString( static_cast( value ) ); } inline std::string toString( int value ) { std::ostringstream oss; oss << value; return oss.str(); } inline std::string toString( unsigned long value ) { std::ostringstream oss; if( value > 8192 ) oss << "0x" << std::hex << value; else oss << value; return oss.str(); } inline std::string toString( unsigned int value ) { return toString( static_cast( value ) ); } inline std::string toString( const double value ) { std::ostringstream oss; oss << std::setprecision( 10 ) << std::fixed << value; std::string d = oss.str(); std::size_t i = d.find_last_not_of( '0' ); if( i != std::string::npos && i != d.size()-1 ) { if( d[i] == '.' ) i++; d = d.substr( 0, i+1 ); } return d; } inline std::string toString( bool value ) { return value ? "true" : "false"; } inline std::string toString( char value ) { return value < ' ' ? toString( static_cast( value ) ) : Detail::makeString( value ); } inline std::string toString( signed char value ) { return toString( static_cast( value ) ); } inline std::string toString( unsigned char value ) { return toString( static_cast( value ) ); } #ifdef CATCH_CONFIG_CPP11_NULLPTR inline std::string toString( std::nullptr_t ) { return "nullptr"; } #endif #ifdef __OBJC__ inline std::string toString( NSString const * const& nsstring ) { if( !nsstring ) return "nil"; return std::string( "@\"" ) + [nsstring UTF8String] + "\""; } inline std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { if( !nsstring ) return "nil"; return std::string( "@\"" ) + [nsstring UTF8String] + "\""; } inline std::string toString( NSObject* const& nsObject ) { return toString( [nsObject description] ); } #endif } // end namespace Catch // #included from: catch_assertionresult.h #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED #include // #included from: catch_result_type.h #define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED namespace Catch { // ResultWas::OfType enum struct ResultWas { enum OfType { Unknown = -1, Ok = 0, Info = 1, Warning = 2, FailureBit = 0x10, ExpressionFailed = FailureBit | 1, ExplicitFailure = FailureBit | 2, Exception = 0x100 | FailureBit, ThrewException = Exception | 1, DidntThrowException = Exception | 2 }; }; inline bool isOk( ResultWas::OfType resultType ) { return ( resultType & ResultWas::FailureBit ) == 0; } inline bool isJustInfo( int flags ) { return flags == ResultWas::Info; } // ResultAction::Value enum struct ResultAction { enum Value { None, Failed = 1, // Failure - but no debug break if Debug bit not set Debug = 2, // If this bit is set, invoke the debugger Abort = 4 // Test run should abort }; }; // ResultDisposition::Flags enum struct ResultDisposition { enum Flags { Normal = 0x00, ContinueOnFailure = 0x01, // Failures fail test, but execution continues NegateResult = 0x02, // Prefix expressiom with ! SuppressFail = 0x04 // Failures are reported but do not fail the test }; }; inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { return static_cast( static_cast( lhs ) | static_cast( rhs ) ); } inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } inline bool shouldNegate( int flags ) { return ( flags & ResultDisposition::NegateResult ) != 0; } inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } } // end namespace Catch namespace Catch { struct AssertionInfo { AssertionInfo() {} AssertionInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, std::string const& _capturedExpression, ResultDisposition::Flags _resultDisposition ); std::string macroName; SourceLineInfo lineInfo; std::string capturedExpression; ResultDisposition::Flags resultDisposition; }; struct AssertionResultData { AssertionResultData() : resultType( ResultWas::Unknown ) {} std::string reconstructedExpression; std::string message; ResultWas::OfType resultType; }; class AssertionResult { public: AssertionResult(); AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); ~AssertionResult(); bool isOk() const; bool succeeded() const; ResultWas::OfType getResultType() const; bool hasExpression() const; bool hasMessage() const; std::string getExpression() const; std::string getExpressionInMacro() const; bool hasExpandedExpression() const; std::string getExpandedExpression() const; std::string getMessage() const; SourceLineInfo getSourceInfo() const; std::string getTestMacroName() const; protected: AssertionInfo m_info; AssertionResultData m_resultData; }; } // end namespace Catch // #included from: catch_evaluate.hpp #define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4389) // '==' : signed/unsigned mismatch #endif namespace Catch { namespace Internal { enum Operator { IsEqualTo, IsNotEqualTo, IsLessThan, IsGreaterThan, IsLessThanOrEqualTo, IsGreaterThanOrEqualTo }; template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; template inline T& opCast(T const& t) { return const_cast(t); } // nullptr_t support based on pull request #154 from Konstantin Baumann #ifdef CATCH_CONFIG_CPP11_NULLPTR inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } #endif // CATCH_CONFIG_CPP11_NULLPTR // So the compare overloads can be operator agnostic we convey the operator as a template // enum, which is used to specialise an Evaluator for doing the comparison. template class Evaluator{}; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs) { return opCast( lhs ) == opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) != opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) < opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) > opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) >= opCast( rhs ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { return opCast( lhs ) <= opCast( rhs ); } }; template bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { return Evaluator::evaluate( lhs, rhs ); } // This level of indirection allows us to specialise for integer types // to avoid signed/ unsigned warnings // "base" overload template bool compare( T1 const& lhs, T2 const& rhs ) { return Evaluator::evaluate( lhs, rhs ); } // unsigned X to int template bool compare( unsigned int lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned long lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned char lhs, int rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } // unsigned X to long template bool compare( unsigned int lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned long lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } template bool compare( unsigned char lhs, long rhs ) { return applyEvaluator( lhs, static_cast( rhs ) ); } // int to unsigned X template bool compare( int lhs, unsigned int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( int lhs, unsigned long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( int lhs, unsigned char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // long to unsigned X template bool compare( long lhs, unsigned int rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long lhs, unsigned long rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } template bool compare( long lhs, unsigned char rhs ) { return applyEvaluator( static_cast( lhs ), rhs ); } // pointer to long (when comparing against NULL) template bool compare( long lhs, T* rhs ) { return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); } template bool compare( T* lhs, long rhs ) { return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); } // pointer to int (when comparing against NULL) template bool compare( int lhs, T* rhs ) { return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); } template bool compare( T* lhs, int rhs ) { return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); } #ifdef CATCH_CONFIG_CPP11_NULLPTR // pointer to nullptr_t (when comparing against nullptr) template bool compare( std::nullptr_t, T* rhs ) { return Evaluator::evaluate( NULL, rhs ); } template bool compare( T* lhs, std::nullptr_t ) { return Evaluator::evaluate( lhs, NULL ); } #endif // CATCH_CONFIG_CPP11_NULLPTR } // end of namespace Internal } // end of namespace Catch #ifdef _MSC_VER #pragma warning(pop) #endif namespace Catch { struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; // Wraps the (stringised versions of) the lhs, operator and rhs of an expression - as well as // the result of evaluating it. This is used to build an AssertionResult object class ExpressionResultBuilder { public: ExpressionResultBuilder( ResultWas::OfType resultType = ResultWas::Unknown ); ExpressionResultBuilder( ExpressionResultBuilder const& other ); ExpressionResultBuilder& operator=(ExpressionResultBuilder const& other ); ExpressionResultBuilder& setResultType( ResultWas::OfType result ); ExpressionResultBuilder& setResultType( bool result ); ExpressionResultBuilder& setLhs( std::string const& lhs ); ExpressionResultBuilder& setRhs( std::string const& rhs ); ExpressionResultBuilder& setOp( std::string const& op ); ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition ); template ExpressionResultBuilder& operator << ( T const& value ) { m_stream << value; return *this; } std::string reconstructExpression( AssertionInfo const& info ) const; AssertionResult buildResult( AssertionInfo const& info ) const; template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); private: AssertionResultData m_data; struct ExprComponents { ExprComponents() : shouldNegate( false ) {} bool shouldNegate; std::string lhs, rhs, op; } m_exprComponents; std::ostringstream m_stream; }; } // end namespace Catch namespace Catch { // Wraps the LHS of an expression and captures the operator and RHS (if any) - wrapping them all // in an ExpressionResultBuilder object template class ExpressionLhs { void operator = ( ExpressionLhs const& ); public: ExpressionLhs( T lhs ) : m_lhs( lhs ) {} template ExpressionResultBuilder& operator == ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator != ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator < ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator > ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator <= ( RhsT const& rhs ) { return captureExpression( rhs ); } template ExpressionResultBuilder& operator >= ( RhsT const& rhs ) { return captureExpression( rhs ); } ExpressionResultBuilder& operator == ( bool rhs ) { return captureExpression( rhs ); } ExpressionResultBuilder& operator != ( bool rhs ) { return captureExpression( rhs ); } ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition ) { bool value = m_lhs ? true : false; return m_result .setLhs( Catch::toString( value ) ) .setResultType( value ) .endExpression( resultDisposition ); } // Only simple binary expressions are allowed on the LHS. // If more complex compositions are required then place the sub expression in parentheses template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); private: template ExpressionResultBuilder& captureExpression( RhsT const& rhs ) { return m_result .setResultType( Internal::compare( m_lhs, rhs ) ) .setLhs( Catch::toString( m_lhs ) ) .setRhs( Catch::toString( rhs ) ) .setOp( Internal::OperatorTraits::getName() ); } private: ExpressionResultBuilder m_result; T m_lhs; }; } // end namespace Catch namespace Catch { // Captures the LHS of the expression and wraps it in an Expression Lhs object class ExpressionDecomposer { public: template ExpressionLhs operator->* ( T const& operand ) { return ExpressionLhs( operand ); } ExpressionLhs operator->* ( bool value ) { return ExpressionLhs( value ); } }; } // end namespace Catch // #included from: catch_message.h #define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED #include namespace Catch { struct MessageInfo { MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ); std::string macroName; SourceLineInfo lineInfo; ResultWas::OfType type; std::string message; unsigned int sequence; bool operator == ( MessageInfo const& other ) const { return sequence == other.sequence; } bool operator < ( MessageInfo const& other ) const { return sequence < other.sequence; } private: static unsigned int globalCount; }; struct MessageBuilder { MessageBuilder( std::string const& macroName, SourceLineInfo const& lineInfo, ResultWas::OfType type ) : m_info( macroName, lineInfo, type ) {} template MessageBuilder& operator << ( T const& value ) { m_stream << value; return *this; } MessageInfo m_info; std::ostringstream m_stream; }; class ScopedMessage { public: ScopedMessage( MessageBuilder const& builder ); ~ScopedMessage(); MessageInfo m_info; }; } // end namespace Catch // #included from: catch_interfaces_capture.h #define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED #include // #included from: catch_totals.hpp #define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED #include namespace Catch { struct Counts { Counts() : passed( 0 ), failed( 0 ) {} Counts operator - ( Counts const& other ) const { Counts diff; diff.passed = passed - other.passed; diff.failed = failed - other.failed; return diff; } Counts& operator += ( Counts const& other ) { passed += other.passed; failed += other.failed; return *this; } std::size_t total() const { return passed + failed; } std::size_t passed; std::size_t failed; }; struct Totals { Totals operator - ( Totals const& other ) const { Totals diff; diff.assertions = assertions - other.assertions; diff.testCases = testCases - other.testCases; return diff; } Totals delta( Totals const& prevTotals ) const { Totals diff = *this - prevTotals; if( diff.assertions.failed > 0 ) ++diff.testCases.failed; else ++diff.testCases.passed; return diff; } Totals& operator += ( Totals const& other ) { assertions += other.assertions; testCases += other.testCases; return *this; } Counts assertions; Counts testCases; }; } namespace Catch { class TestCase; class ExpressionResultBuilder; class AssertionResult; struct AssertionInfo; struct SectionInfo; struct MessageInfo; class ScopedMessageBuilder; struct IResultCapture { virtual ~IResultCapture(); virtual void assertionEnded( AssertionResult const& result ) = 0; virtual bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) = 0; virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0; virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( MessageInfo const& message ) = 0; virtual bool shouldDebugBreak() const = 0; virtual ResultAction::Value acceptExpression( ExpressionResultBuilder const& assertionResult, AssertionInfo const& assertionInfo ) = 0; virtual std::string getCurrentTestName() const = 0; virtual const AssertionResult* getLastResult() const = 0; }; } // #included from: catch_debugger.hpp #define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED #include // #included from: catch_platform.h #define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) #define CATCH_PLATFORM_MAC #elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) #define CATCH_PLATFORM_IPHONE #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) #define CATCH_PLATFORM_WINDOWS #endif #ifdef CATCH_PLATFORM_MAC #include #include #include #include #include namespace Catch{ // The following function is taken directly from the following technical note: // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html // Returns true if the current process is being debugged (either // running under the debugger or has a debugger attached post facto). inline bool isDebuggerActive(){ int junk; int mib[4]; struct kinfo_proc info; size_t size; // Initialize the flags so that, if sysctl fails for some bizarre // reason, we get a predictable result. info.kp_proc.p_flag = 0; // Initialize mib, which tells sysctl the info we want, in this case // we're looking for information about a specific process ID. mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); // Call sysctl. size = sizeof(info); junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); assert(junk == 0); // We're being debugged if the P_TRACED flag is set. return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); } } // The following code snippet taken from: // http://cocoawithlove.com/2008/03/break-into-debugger.html #ifdef DEBUG #if defined(__ppc64__) || defined(__ppc__) #define BreakIntoDebugger() \ if( Catch::isDebuggerActive() ) { \ __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ : : : "memory","r0","r3","r4" ); \ } #else #define BreakIntoDebugger() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} #endif #else inline void BreakIntoDebugger(){} #endif #elif defined(_MSC_VER) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); #define BreakIntoDebugger() if (IsDebuggerPresent() ) { __debugbreak(); } inline bool isDebuggerActive() { return IsDebuggerPresent() != 0; } #elif defined(__MINGW32__) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); extern "C" __declspec(dllimport) void __stdcall DebugBreak(); #define BreakIntoDebugger() if (IsDebuggerPresent() ) { DebugBreak(); } inline bool isDebuggerActive() { return IsDebuggerPresent() != 0; } #else inline void BreakIntoDebugger(){} inline bool isDebuggerActive() { return false; } #endif #ifdef CATCH_PLATFORM_WINDOWS extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); inline void writeToDebugConsole( std::string const& text ) { ::OutputDebugStringA( text.c_str() ); } #else inline void writeToDebugConsole( std::string const& text ) { // !TBD: Need a version for Mac/ XCode and other IDEs std::cout << text; } #endif // CATCH_PLATFORM_WINDOWS // #included from: catch_interfaces_registry_hub.h #define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED // #included from: catch_interfaces_reporter.h #define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED // #included from: catch_config.hpp #define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED // #included from: catch_test_spec.h #define TWOBLUECUBES_CATCH_TEST_SPEC_H_INCLUDED // #included from: catch_test_case_info.h #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED #include #include #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { struct ITestCase; struct TestCaseInfo { TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::set const& _tags, bool _isHidden, SourceLineInfo const& _lineInfo ); TestCaseInfo( TestCaseInfo const& other ); std::string name; std::string className; std::string description; std::set tags; std::string tagsAsString; SourceLineInfo lineInfo; bool isHidden; }; class TestCase : protected TestCaseInfo { public: TestCase( ITestCase* testCase, TestCaseInfo const& info ); TestCase( TestCase const& other ); TestCase withName( std::string const& _newName ) const; void invoke() const; TestCaseInfo const& getTestCaseInfo() const; bool isHidden() const; bool hasTag( std::string const& tag ) const; bool matchesTags( std::string const& tagPattern ) const; std::set const& getTags() const; void swap( TestCase& other ); bool operator == ( TestCase const& other ) const; bool operator < ( TestCase const& other ) const; TestCase& operator = ( TestCase const& other ); private: Ptr test; }; TestCase makeTestCase( ITestCase* testCase, std::string const& className, std::string const& name, std::string const& description, SourceLineInfo const& lineInfo ); } #ifdef __clang__ #pragma clang diagnostic pop #endif // #included from: catch_tags.hpp #define TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED #include #include #include #include #ifdef __clang__ #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { class TagParser { public: virtual ~TagParser(); void parse( std::string const& str ) { std::size_t pos = 0; while( pos < str.size() ) { char c = str[pos]; if( c == '[' ) { std::size_t end = str.find_first_of( ']', pos ); if( end != std::string::npos ) { acceptTag( str.substr( pos+1, end-pos-1 ) ); pos = end+1; } else { acceptChar( c ); pos++; } } else { acceptChar( c ); pos++; } } endParse(); } protected: virtual void acceptTag( std::string const& tag ) = 0; virtual void acceptChar( char c ) = 0; virtual void endParse() {} private: }; class TagExtracter : public TagParser { public: TagExtracter( std::set& tags ) : m_tags( tags ) {} virtual ~TagExtracter(); void parse( std::string& description ) { TagParser::parse( description ); description = m_remainder; } private: virtual void acceptTag( std::string const& tag ) { m_tags.insert( toLower( tag ) ); } virtual void acceptChar( char c ) { m_remainder += c; } TagExtracter& operator=(TagExtracter const&); std::set& m_tags; std::string m_remainder; }; class Tag { public: Tag() : m_isNegated( false ) {} Tag( std::string const& name, bool isNegated ) : m_name( name ), m_isNegated( isNegated ) {} std::string getName() const { return m_name; } bool isNegated() const { return m_isNegated; } bool operator ! () const { return m_name.empty(); } private: std::string m_name; bool m_isNegated; }; class TagSet { typedef std::map TagMap; public: void add( Tag const& tag ) { m_tags.insert( std::make_pair( toLower( tag.getName() ), tag ) ); } bool empty() const { return m_tags.empty(); } bool matches( std::set const& tags ) const { TagMap::const_iterator it = m_tags.begin(); TagMap::const_iterator itEnd = m_tags.end(); for(; it != itEnd; ++it ) { bool found = tags.find( it->first ) != tags.end(); if( found == it->second.isNegated() ) return false; } return true; } private: TagMap m_tags; }; class TagExpression { public: bool matches( std::set const& tags ) const { std::vector::const_iterator it = m_tagSets.begin(); std::vector::const_iterator itEnd = m_tagSets.end(); for(; it != itEnd; ++it ) if( it->matches( tags ) ) return true; return false; } private: friend class TagExpressionParser; std::vector m_tagSets; }; class TagExpressionParser : public TagParser { public: TagExpressionParser( TagExpression& exp ) : m_isNegated( false ), m_exp( exp ) {} ~TagExpressionParser(); private: virtual void acceptTag( std::string const& tag ) { m_currentTagSet.add( Tag( tag, m_isNegated ) ); m_isNegated = false; } virtual void acceptChar( char c ) { switch( c ) { case '~': m_isNegated = true; break; case ',': m_exp.m_tagSets.push_back( m_currentTagSet ); break; } } virtual void endParse() { if( !m_currentTagSet.empty() ) m_exp.m_tagSets.push_back( m_currentTagSet ); } TagExpressionParser& operator=(TagExpressionParser const&); bool m_isNegated; TagSet m_currentTagSet; TagExpression& m_exp; }; } // end namespace Catch #include #include namespace Catch { struct IfFilterMatches{ enum DoWhat { AutoDetectBehaviour, IncludeTests, ExcludeTests }; }; class TestCaseFilter { enum WildcardPosition { NoWildcard = 0, WildcardAtStart = 1, WildcardAtEnd = 2, WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd }; public: TestCaseFilter( std::string const& testSpec, IfFilterMatches::DoWhat matchBehaviour = IfFilterMatches::AutoDetectBehaviour ) : m_stringToMatch( toLower( testSpec ) ), m_filterType( matchBehaviour ), m_wildcardPosition( NoWildcard ) { if( m_filterType == IfFilterMatches::AutoDetectBehaviour ) { if( startsWith( m_stringToMatch, "exclude:" ) ) { m_stringToMatch = m_stringToMatch.substr( 8 ); m_filterType = IfFilterMatches::ExcludeTests; } else if( startsWith( m_stringToMatch, "~" ) ) { m_stringToMatch = m_stringToMatch.substr( 1 ); m_filterType = IfFilterMatches::ExcludeTests; } else { m_filterType = IfFilterMatches::IncludeTests; } } if( startsWith( m_stringToMatch, "*" ) ) { m_stringToMatch = m_stringToMatch.substr( 1 ); m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtStart ); } if( endsWith( m_stringToMatch, "*" ) ) { m_stringToMatch = m_stringToMatch.substr( 0, m_stringToMatch.size()-1 ); m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtEnd ); } } IfFilterMatches::DoWhat getFilterType() const { return m_filterType; } bool shouldInclude( TestCase const& testCase ) const { return isMatch( testCase ) == (m_filterType == IfFilterMatches::IncludeTests); } private: #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunreachable-code" #endif bool isMatch( TestCase const& testCase ) const { std::string name = testCase.getTestCaseInfo().name; toLowerInPlace( name ); switch( m_wildcardPosition ) { case NoWildcard: return m_stringToMatch == name; case WildcardAtStart: return endsWith( name, m_stringToMatch ); case WildcardAtEnd: return startsWith( name, m_stringToMatch ); case WildcardAtBothEnds: return contains( name, m_stringToMatch ); } throw std::logic_error( "Unhandled wildcard type" ); } #ifdef __clang__ #pragma clang diagnostic pop #endif std::string m_stringToMatch; IfFilterMatches::DoWhat m_filterType; WildcardPosition m_wildcardPosition; }; class TestCaseFilters { public: TestCaseFilters( std::string const& name ) : m_name( name ) {} std::string getName() const { return m_name; } void addFilter( TestCaseFilter const& filter ) { if( filter.getFilterType() == IfFilterMatches::ExcludeTests ) m_exclusionFilters.push_back( filter ); else m_inclusionFilters.push_back( filter ); } void addTags( std::string const& tagPattern ) { TagExpression exp; TagExpressionParser( exp ).parse( tagPattern ); m_tagExpressions.push_back( exp ); } bool shouldInclude( TestCase const& testCase ) const { if( !m_tagExpressions.empty() ) { std::vector::const_iterator it = m_tagExpressions.begin(); std::vector::const_iterator itEnd = m_tagExpressions.end(); for(; it != itEnd; ++it ) if( it->matches( testCase.getTags() ) ) break; if( it == itEnd ) return false; } if( !m_inclusionFilters.empty() ) { std::vector::const_iterator it = m_inclusionFilters.begin(); std::vector::const_iterator itEnd = m_inclusionFilters.end(); for(; it != itEnd; ++it ) if( it->shouldInclude( testCase ) ) break; if( it == itEnd ) return false; } else if( m_exclusionFilters.empty() && m_tagExpressions.empty() ) { return !testCase.isHidden(); } std::vector::const_iterator it = m_exclusionFilters.begin(); std::vector::const_iterator itEnd = m_exclusionFilters.end(); for(; it != itEnd; ++it ) if( !it->shouldInclude( testCase ) ) return false; return true; } private: std::vector m_tagExpressions; std::vector m_inclusionFilters; std::vector m_exclusionFilters; std::string m_name; }; } // #included from: catch_interfaces_config.h #define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED #include #include namespace Catch { struct Verbosity { enum Level { NoOutput = 0, Quiet, Normal }; }; struct WarnAbout { enum What { Nothing = 0x00, NoAssertions = 0x01 }; }; struct ShowDurations { enum OrNot { DefaultForReporter, Always, Never }; }; struct IConfig : IShared { virtual ~IConfig(); virtual bool allowThrows() const = 0; virtual std::ostream& stream() const = 0; virtual std::string name() const = 0; virtual bool includeSuccessfulResults() const = 0; virtual bool shouldDebugBreak() const = 0; virtual bool warnAboutMissingAssertions() const = 0; virtual int abortAfter() const = 0; virtual ShowDurations::OrNot showDurations() const = 0; }; } // #included from: catch_stream.hpp #define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED // #included from: catch_streambuf.h #define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED #include namespace Catch { class StreamBufBase : public std::streambuf { public: virtual ~StreamBufBase() throw(); }; } #include #include namespace Catch { template class StreamBufImpl : public StreamBufBase { char data[bufferSize]; WriterF m_writer; public: StreamBufImpl() { setp( data, data + sizeof(data) ); } ~StreamBufImpl() throw() { sync(); } private: int overflow( int c ) { sync(); if( c != EOF ) { if( pbase() == epptr() ) m_writer( std::string( 1, static_cast( c ) ) ); else sputc( static_cast( c ) ); } return 0; } int sync() { if( pbase() != pptr() ) { m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); setp( pbase(), epptr() ); } return 0; } }; /////////////////////////////////////////////////////////////////////////// struct OutputDebugWriter { void operator()( std::string const&str ) { writeToDebugConsole( str ); } }; class Stream { public: Stream() : streamBuf( NULL ), isOwned( false ) {} Stream( std::streambuf* _streamBuf, bool _isOwned ) : streamBuf( _streamBuf ), isOwned( _isOwned ) {} void release() { if( isOwned ) { delete streamBuf; streamBuf = NULL; isOwned = false; } } std::streambuf* streamBuf; private: bool isOwned; }; } #include #include #include #include #ifndef CATCH_CONFIG_CONSOLE_WIDTH #define CATCH_CONFIG_CONSOLE_WIDTH 80 #endif namespace Catch { struct ConfigData { ConfigData() : listTests( false ), listTags( false ), listReporters( false ), showSuccessfulTests( false ), shouldDebugBreak( false ), noThrow( false ), showHelp( false ), abortAfter( -1 ), verbosity( Verbosity::Normal ), warnings( WarnAbout::Nothing ), showDurations( ShowDurations::DefaultForReporter ) {} bool listTests; bool listTags; bool listReporters; bool showSuccessfulTests; bool shouldDebugBreak; bool noThrow; bool showHelp; int abortAfter; Verbosity::Level verbosity; WarnAbout::What warnings; ShowDurations::OrNot showDurations; std::string reporterName; std::string outputFilename; std::string name; std::string processName; std::vector testsOrTags; }; class Config : public SharedImpl { private: Config( Config const& other ); Config& operator = ( Config const& other ); virtual void dummy(); public: Config() : m_os( std::cout.rdbuf() ) {} Config( ConfigData const& data ) : m_data( data ), m_os( std::cout.rdbuf() ) { if( !data.testsOrTags.empty() ) { std::string groupName; for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) { if( i != 0 ) groupName += " "; groupName += data.testsOrTags[i]; } TestCaseFilters filters( groupName ); for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) { std::string filter = data.testsOrTags[i]; if( startsWith( filter, "[" ) || startsWith( filter, "~[" ) ) filters.addTags( filter ); else filters.addFilter( TestCaseFilter( filter ) ); } m_filterSets.push_back( filters ); } } virtual ~Config() { m_os.rdbuf( std::cout.rdbuf() ); m_stream.release(); } void setFilename( std::string const& filename ) { m_data.outputFilename = filename; } std::string const& getFilename() const { return m_data.outputFilename ; } bool listTests() const { return m_data.listTests; } bool listTags() const { return m_data.listTags; } bool listReporters() const { return m_data.listReporters; } std::string getProcessName() const { return m_data.processName; } bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } void setStreamBuf( std::streambuf* buf ) { m_os.rdbuf( buf ? buf : std::cout.rdbuf() ); } void useStream( std::string const& streamName ) { Stream stream = createStream( streamName ); setStreamBuf( stream.streamBuf ); m_stream.release(); m_stream = stream; } std::string getReporterName() const { return m_data.reporterName; } void addTestSpec( std::string const& testSpec ) { TestCaseFilters filters( testSpec ); filters.addFilter( TestCaseFilter( testSpec ) ); m_filterSets.push_back( filters ); } int abortAfter() const { return m_data.abortAfter; } std::vector const& filters() const { return m_filterSets; } bool showHelp() const { return m_data.showHelp; } // IConfig interface virtual bool allowThrows() const { return !m_data.noThrow; } virtual std::ostream& stream() const { return m_os; } virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } private: ConfigData m_data; Stream m_stream; mutable std::ostream m_os; std::vector m_filterSets; }; } // end namespace Catch // #included from: catch_option.hpp #define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED namespace Catch { // An optional type template class Option { public: Option() : nullableValue( NULL ) {} Option( T const& _value ) : nullableValue( new( storage ) T( _value ) ) {} Option( Option const& _other ) : nullableValue( _other ? new( storage ) T( *_other ) : NULL ) {} ~Option() { reset(); } Option& operator= ( Option const& _other ) { reset(); if( _other ) nullableValue = new( storage ) T( *_other ); return *this; } Option& operator = ( T const& _value ) { reset(); nullableValue = new( storage ) T( _value ); return *this; } void reset() { if( nullableValue ) nullableValue->~T(); nullableValue = NULL; } T& operator*() { return *nullableValue; } T const& operator*() const { return *nullableValue; } T* operator->() { return nullableValue; } const T* operator->() const { return nullableValue; } T valueOr( T const& defaultValue ) const { return nullableValue ? *nullableValue : defaultValue; } bool some() const { return nullableValue != NULL; } bool none() const { return nullableValue == NULL; } bool operator !() const { return nullableValue == NULL; } operator SafeBool::type() const { return SafeBool::makeSafe( some() ); } private: T* nullableValue; char storage[sizeof(T)]; }; } // end namespace Catch #include #include #include #include namespace Catch { struct ReporterConfig { explicit ReporterConfig( Ptr const& _fullConfig ) : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} std::ostream& stream() const { return *m_stream; } Ptr fullConfig() const { return m_fullConfig; } private: std::ostream* m_stream; Ptr m_fullConfig; }; struct ReporterPreferences { ReporterPreferences() : shouldRedirectStdOut( false ) {} bool shouldRedirectStdOut; }; template struct LazyStat : Option { LazyStat() : used( false ) {} LazyStat& operator=( T const& _value ) { Option::operator=( _value ); used = false; return *this; } void reset() { Option::reset(); used = false; } bool used; }; struct TestRunInfo { TestRunInfo( std::string const& _name ) : name( _name ) {} std::string name; }; struct GroupInfo { GroupInfo( std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount ) : name( _name ), groupIndex( _groupIndex ), groupsCounts( _groupsCount ) {} std::string name; std::size_t groupIndex; std::size_t groupsCounts; }; struct SectionInfo { SectionInfo( std::string const& _name, std::string const& _description, SourceLineInfo const& _lineInfo ) : name( _name ), description( _description ), lineInfo( _lineInfo ) {} std::string name; std::string description; SourceLineInfo lineInfo; }; struct AssertionStats { AssertionStats( AssertionResult const& _assertionResult, std::vector const& _infoMessages, Totals const& _totals ) : assertionResult( _assertionResult ), infoMessages( _infoMessages ), totals( _totals ) { if( assertionResult.hasMessage() ) { // Copy message into messages list. // !TBD This should have been done earlier, somewhere MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); builder << assertionResult.getMessage(); builder.m_info.message = builder.m_stream.str(); infoMessages.push_back( builder.m_info ); } } virtual ~AssertionStats(); AssertionResult assertionResult; std::vector infoMessages; Totals totals; }; struct SectionStats { SectionStats( SectionInfo const& _sectionInfo, Counts const& _assertions, double _durationInSeconds, bool _missingAssertions ) : sectionInfo( _sectionInfo ), assertions( _assertions ), durationInSeconds( _durationInSeconds ), missingAssertions( _missingAssertions ) {} virtual ~SectionStats(); SectionInfo sectionInfo; Counts assertions; double durationInSeconds; bool missingAssertions; }; struct TestCaseStats { TestCaseStats( TestCaseInfo const& _testInfo, Totals const& _totals, std::string const& _stdOut, std::string const& _stdErr, bool _aborting ) : testInfo( _testInfo ), totals( _totals ), stdOut( _stdOut ), stdErr( _stdErr ), aborting( _aborting ) {} virtual ~TestCaseStats(); TestCaseInfo testInfo; Totals totals; std::string stdOut; std::string stdErr; bool aborting; }; struct TestGroupStats { TestGroupStats( GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting ) : groupInfo( _groupInfo ), totals( _totals ), aborting( _aborting ) {} TestGroupStats( GroupInfo const& _groupInfo ) : groupInfo( _groupInfo ), aborting( false ) {} virtual ~TestGroupStats(); GroupInfo groupInfo; Totals totals; bool aborting; }; struct TestRunStats { TestRunStats( TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting ) : runInfo( _runInfo ), totals( _totals ), aborting( _aborting ) {} TestRunStats( TestRunStats const& _other ) : runInfo( _other.runInfo ), totals( _other.totals ), aborting( _other.aborting ) {} virtual ~TestRunStats(); TestRunInfo runInfo; Totals totals; bool aborting; }; struct IStreamingReporter : IShared { virtual ~IStreamingReporter(); // Implementing class must also provide the following static method: // static std::string getDescription(); virtual ReporterPreferences getPreferences() const = 0; virtual void noMatchingTestCases( std::string const& spec ) = 0; virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; virtual void sectionEnded( SectionStats const& sectionStats ) = 0; virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; }; struct StreamingReporterBase : SharedImpl { StreamingReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) {} virtual ~StreamingReporterBase(); virtual void noMatchingTestCases( std::string const& ) {} virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { currentTestRunInfo = _testRunInfo; } virtual void testGroupStarting( GroupInfo const& _groupInfo ) { currentGroupInfo = _groupInfo; } virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { currentTestCaseInfo = _testInfo; } virtual void sectionStarting( SectionInfo const& _sectionInfo ) { m_sectionStack.push_back( _sectionInfo ); } virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { m_sectionStack.pop_back(); } virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { currentTestCaseInfo.reset(); assert( m_sectionStack.empty() ); } virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { currentGroupInfo.reset(); } virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { currentTestCaseInfo.reset(); currentGroupInfo.reset(); currentTestRunInfo.reset(); } Ptr m_config; std::ostream& stream; LazyStat currentTestRunInfo; LazyStat currentGroupInfo; LazyStat currentTestCaseInfo; std::vector m_sectionStack; }; struct CumulativeReporterBase : SharedImpl { template struct Node : SharedImpl<> { explicit Node( T const& _value ) : value( _value ) {} virtual ~Node() {} typedef std::vector > ChildNodes; T value; ChildNodes children; }; struct SectionNode : SharedImpl<> { explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} virtual ~SectionNode(); bool operator == ( SectionNode const& other ) const { return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; } bool operator == ( Ptr const& other ) const { return operator==( *other ); } SectionStats stats; typedef std::vector > ChildSections; typedef std::vector Assertions; ChildSections childSections; Assertions assertions; std::string stdOut; std::string stdErr; }; friend bool operator == ( Ptr const& node, SectionInfo const& other ) { return node->stats.sectionInfo.lineInfo == other.lineInfo; } typedef Node TestCaseNode; typedef Node TestGroupNode; typedef Node TestRunNode; CumulativeReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) {} ~CumulativeReporterBase(); virtual void testRunStarting( TestRunInfo const& ) {} virtual void testGroupStarting( GroupInfo const& ) {} virtual void testCaseStarting( TestCaseInfo const& ) {} virtual void sectionStarting( SectionInfo const& sectionInfo ) { SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); Ptr node; if( m_sectionStack.empty() ) { if( !m_rootSection ) m_rootSection = new SectionNode( incompleteStats ); node = m_rootSection; } else { SectionNode& parentNode = *m_sectionStack.back(); SectionNode::ChildSections::const_iterator it = std::find( parentNode.childSections.begin(), parentNode.childSections.end(), sectionInfo ); if( it == parentNode.childSections.end() ) { node = new SectionNode( incompleteStats ); parentNode.childSections.push_back( node ); } else node = *it; } m_sectionStack.push_back( node ); m_deepestSection = node; } virtual void assertionStarting( AssertionInfo const& ) {} virtual bool assertionEnded( AssertionStats const& assertionStats ) { assert( !m_sectionStack.empty() ); SectionNode& sectionNode = *m_sectionStack.back(); sectionNode.assertions.push_back( assertionStats ); return true; } virtual void sectionEnded( SectionStats const& sectionStats ) { assert( !m_sectionStack.empty() ); SectionNode& node = *m_sectionStack.back(); node.stats = sectionStats; m_sectionStack.pop_back(); } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { Ptr node = new TestCaseNode( testCaseStats ); assert( m_sectionStack.size() == 0 ); node->children.push_back( m_rootSection ); m_testCases.push_back( node ); m_rootSection.reset(); assert( m_deepestSection ); m_deepestSection->stdOut = testCaseStats.stdOut; m_deepestSection->stdErr = testCaseStats.stdErr; } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { Ptr node = new TestGroupNode( testGroupStats ); node->children.swap( m_testCases ); m_testGroups.push_back( node ); } virtual void testRunEnded( TestRunStats const& testRunStats ) { Ptr node = new TestRunNode( testRunStats ); node->children.swap( m_testGroups ); m_testRuns.push_back( node ); testRunEnded(); } virtual void testRunEnded() = 0; Ptr m_config; std::ostream& stream; std::vector m_assertions; std::vector > > m_sections; std::vector > m_testCases; std::vector > m_testGroups; std::vector > m_testRuns; Ptr m_rootSection; Ptr m_deepestSection; std::vector > m_sectionStack; }; // Deprecated struct IReporter : IShared { virtual ~IReporter(); virtual bool shouldRedirectStdout() const = 0; virtual void StartTesting() = 0; virtual void EndTesting( Totals const& totals ) = 0; virtual void StartGroup( std::string const& groupName ) = 0; virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; virtual void Aborted() = 0; virtual void Result( AssertionResult const& result ) = 0; }; struct IReporterFactory { virtual ~IReporterFactory(); virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; virtual std::string getDescription() const = 0; }; struct IReporterRegistry { typedef std::map FactoryMap; virtual ~IReporterRegistry(); virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; virtual FactoryMap const& getFactories() const = 0; }; inline std::string trim( std::string const& str ) { static char const* whitespaceChars = "\n\r\t "; std::string::size_type start = str.find_first_not_of( whitespaceChars ); std::string::size_type end = str.find_last_not_of( whitespaceChars ); return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; } } #include namespace Catch { class TestCase; struct ITestCaseRegistry; struct IExceptionTranslatorRegistry; struct IExceptionTranslator; struct IRegistryHub { virtual ~IRegistryHub(); virtual IReporterRegistry const& getReporterRegistry() const = 0; virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; }; struct IMutableRegistryHub { virtual ~IMutableRegistryHub(); virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; virtual void registerTest( TestCase const& testInfo ) = 0; virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; }; IRegistryHub& getRegistryHub(); IMutableRegistryHub& getMutableRegistryHub(); void cleanUp(); std::string translateActiveException(); } #include namespace Catch { inline IResultCapture& getResultCapture() { return getCurrentContext().getResultCapture(); } template ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher, std::string const& matcherCallAsString ) { std::string matcherAsString = matcher.toString(); if( matcherAsString == "{?}" ) matcherAsString = matcherCallAsString; return ExpressionResultBuilder() .setRhs( matcherAsString ) .setOp( "matches" ); } template ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher, ArgT const& arg, std::string const& matcherCallAsString ) { return expressionResultBuilderFromMatcher( matcher, matcherCallAsString ) .setLhs( Catch::toString( arg ) ) .setResultType( matcher.match( arg ) ); } template ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher, ArgT* arg, std::string const& matcherCallAsString ) { return expressionResultBuilderFromMatcher( matcher, matcherCallAsString ) .setLhs( Catch::toString( arg ) ) .setResultType( matcher.match( arg ) ); } struct TestFailureException{}; } // end namespace Catch /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ASSERTIONINFO_NAME INTERNAL_CATCH_UNIQUE_NAME( __assertionInfo ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ACCEPT_EXPR( evaluatedExpr, resultDisposition, originalExpr ) \ if( Catch::ResultAction::Value internal_catch_action = Catch::getResultCapture().acceptExpression( evaluatedExpr, INTERNAL_CATCH_ASSERTIONINFO_NAME ) ) { \ if( internal_catch_action & Catch::ResultAction::Debug ) BreakIntoDebugger(); \ if( internal_catch_action & Catch::ResultAction::Abort ) throw Catch::TestFailureException(); \ if( !Catch::shouldContinueOnFailure( resultDisposition ) ) throw Catch::TestFailureException(); \ Catch::isTrue( false && originalExpr ); \ } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ACCEPT_INFO( expr, macroName, resultDisposition ) \ Catch::AssertionInfo INTERNAL_CATCH_ASSERTIONINFO_NAME( macroName, CATCH_INTERNAL_LINEINFO, expr, resultDisposition ); /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ try { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionDecomposer()->*expr ).endExpression( resultDisposition ), resultDisposition, expr ); \ } catch( Catch::TestFailureException& ) { \ throw; \ } catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), \ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, expr ); \ } \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ if( Catch::getResultCapture().getLastResult()->succeeded() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ if( !Catch::getResultCapture().getLastResult()->succeeded() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ try { \ expr; \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \ } \ catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), resultDisposition, false ); \ } \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \ try { \ if( Catch::getCurrentContext().getConfig()->allowThrows() ) { \ expr; \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::DidntThrowException ), resultDisposition, false ); \ } \ } \ catch( Catch::TestFailureException& ) { \ throw; \ } \ catch( exceptionType ) { \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \ } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS( expr, exceptionType, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \ INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \ catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \ } \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_MSG( log, messageType, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( messageType ) << log, resultDisposition, true ) \ } while( Catch::isTrue( false ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_INFO( log, macroName ) \ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ do { \ INTERNAL_CATCH_ACCEPT_INFO( #arg " " #matcher, macroName, resultDisposition ); \ try { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::expressionResultBuilderFromMatcher( ::Catch::Matchers::matcher, arg, #matcher ) ), resultDisposition, false ); \ } catch( Catch::TestFailureException& ) { \ throw; \ } catch( ... ) { \ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \ } \ } while( Catch::isTrue( false ) ) // #included from: internal/catch_section.hpp #define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED // #included from: catch_timer.h #define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED #ifdef CATCH_PLATFORM_WINDOWS typedef unsigned long long uint64_t; #else #include #endif namespace Catch { class Timer { public: Timer() : m_ticks( 0 ) {} void start(); unsigned int getElapsedNanoseconds() const; unsigned int getElapsedMilliseconds() const; double getElapsedSeconds() const; private: uint64_t m_ticks; }; } // namespace Catch #include namespace Catch { class Section { public: Section( SourceLineInfo const& lineInfo, std::string const& name, std::string const& description = "" ) : m_info( name, description, lineInfo ), m_sectionIncluded( getCurrentContext().getResultCapture().sectionStarted( m_info, m_assertions ) ) { m_timer.start(); } ~Section() { if( m_sectionIncluded ) getCurrentContext().getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); } // This indicates whether the section should be executed or not operator bool() { return m_sectionIncluded; } private: SectionInfo m_info; std::string m_name; Counts m_assertions; bool m_sectionIncluded; Timer m_timer; }; } // end namespace Catch #ifdef CATCH_CONFIG_VARIADIC_MACROS #define INTERNAL_CATCH_SECTION( ... ) \ if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) #else #define INTERNAL_CATCH_SECTION( name, desc ) \ if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( CATCH_INTERNAL_LINEINFO, name, desc ) ) #endif // #included from: internal/catch_generators.hpp #define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED #include #include #include #include namespace Catch { template struct IGenerator { virtual ~IGenerator() {} virtual T getValue( std::size_t index ) const = 0; virtual std::size_t size () const = 0; }; template class BetweenGenerator : public IGenerator { public: BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} virtual T getValue( std::size_t index ) const { return m_from+static_cast( index ); } virtual std::size_t size() const { return static_cast( 1+m_to-m_from ); } private: T m_from; T m_to; }; template class ValuesGenerator : public IGenerator { public: ValuesGenerator(){} void add( T value ) { m_values.push_back( value ); } virtual T getValue( std::size_t index ) const { return m_values[index]; } virtual std::size_t size() const { return m_values.size(); } private: std::vector m_values; }; template class CompositeGenerator { public: CompositeGenerator() : m_totalSize( 0 ) {} // *** Move semantics, similar to auto_ptr *** CompositeGenerator( CompositeGenerator& other ) : m_fileInfo( other.m_fileInfo ), m_totalSize( 0 ) { move( other ); } CompositeGenerator& setFileInfo( const char* fileInfo ) { m_fileInfo = fileInfo; return *this; } ~CompositeGenerator() { deleteAll( m_composed ); } operator T () const { size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); typename std::vector*>::const_iterator it = m_composed.begin(); typename std::vector*>::const_iterator itEnd = m_composed.end(); for( size_t index = 0; it != itEnd; ++it ) { const IGenerator* generator = *it; if( overallIndex >= index && overallIndex < index + generator->size() ) { return generator->getValue( overallIndex-index ); } index += generator->size(); } CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so } void add( const IGenerator* generator ) { m_totalSize += generator->size(); m_composed.push_back( generator ); } CompositeGenerator& then( CompositeGenerator& other ) { move( other ); return *this; } CompositeGenerator& then( T value ) { ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( value ); add( valuesGen ); return *this; } private: void move( CompositeGenerator& other ) { std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); m_totalSize += other.m_totalSize; other.m_composed.clear(); } std::vector*> m_composed; std::string m_fileInfo; size_t m_totalSize; }; namespace Generators { template CompositeGenerator between( T from, T to ) { CompositeGenerator generators; generators.add( new BetweenGenerator( from, to ) ); return generators; } template CompositeGenerator values( T val1, T val2 ) { CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); generators.add( valuesGen ); return generators; } template CompositeGenerator values( T val1, T val2, T val3 ){ CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); valuesGen->add( val3 ); generators.add( valuesGen ); return generators; } template CompositeGenerator values( T val1, T val2, T val3, T val4 ) { CompositeGenerator generators; ValuesGenerator* valuesGen = new ValuesGenerator(); valuesGen->add( val1 ); valuesGen->add( val2 ); valuesGen->add( val3 ); valuesGen->add( val4 ); generators.add( valuesGen ); return generators; } } // end namespace Generators using namespace Generators; } // end namespace Catch #define INTERNAL_CATCH_LINESTR2( line ) #line #define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) #define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) // #included from: internal/catch_interfaces_exception.h #define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED #include namespace Catch { typedef std::string(*exceptionTranslateFunction)(); struct IExceptionTranslator { virtual ~IExceptionTranslator(); virtual std::string translate() const = 0; }; struct IExceptionTranslatorRegistry { virtual ~IExceptionTranslatorRegistry(); virtual std::string translateActiveException() const = 0; }; class ExceptionTranslatorRegistrar { template class ExceptionTranslator : public IExceptionTranslator { public: ExceptionTranslator( std::string(*translateFunction)( T& ) ) : m_translateFunction( translateFunction ) {} virtual std::string translate() const { try { throw; } catch( T& ex ) { return m_translateFunction( ex ); } } protected: std::string(*m_translateFunction)( T& ); }; public: template ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { getMutableRegistryHub().registerTranslator ( new ExceptionTranslator( translateFunction ) ); } }; } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) // #included from: internal/catch_approx.hpp #define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED #include #include namespace Catch { namespace Detail { class Approx { public: explicit Approx ( double value ) : m_epsilon( std::numeric_limits::epsilon()*100 ), m_scale( 1.0 ), m_value( value ) {} Approx( Approx const& other ) : m_epsilon( other.m_epsilon ), m_scale( other.m_scale ), m_value( other.m_value ) {} static Approx custom() { return Approx( 0 ); } Approx operator()( double value ) { Approx approx( value ); approx.epsilon( m_epsilon ); approx.scale( m_scale ); return approx; } friend bool operator == ( double lhs, Approx const& rhs ) { // Thanks to Richard Harris for his help refining this formula return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); } friend bool operator == ( Approx const& lhs, double rhs ) { return operator==( rhs, lhs ); } friend bool operator != ( double lhs, Approx const& rhs ) { return !operator==( lhs, rhs ); } friend bool operator != ( Approx const& lhs, double rhs ) { return !operator==( rhs, lhs ); } Approx& epsilon( double newEpsilon ) { m_epsilon = newEpsilon; return *this; } Approx& scale( double newScale ) { m_scale = newScale; return *this; } std::string toString() const { std::ostringstream oss; oss << "Approx( " << m_value << " )"; return oss.str(); } private: double m_epsilon; double m_scale; double m_value; }; } template<> inline std::string toString( Detail::Approx const& value ) { return value.toString(); } } // end namespace Catch // #included from: internal/catch_matchers.hpp #define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED namespace Catch { namespace Matchers { namespace Impl { template struct Matcher : SharedImpl { typedef ExpressionT ExpressionType; virtual ~Matcher() {} virtual Ptr clone() const = 0; virtual bool match( ExpressionT const& expr ) const = 0; virtual std::string toString() const = 0; }; template struct MatcherImpl : Matcher { virtual Ptr > clone() const { return Ptr >( new DerivedT( static_cast( *this ) ) ); } }; namespace Generic { template class AllOf : public MatcherImpl, ExpressionT> { public: AllOf() {} AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} AllOf& add( Matcher const& matcher ) { m_matchers.push_back( matcher.clone() ); return *this; } virtual bool match( ExpressionT const& expr ) const { for( std::size_t i = 0; i < m_matchers.size(); ++i ) if( !m_matchers[i]->match( expr ) ) return false; return true; } virtual std::string toString() const { std::ostringstream oss; oss << "( "; for( std::size_t i = 0; i < m_matchers.size(); ++i ) { if( i != 0 ) oss << " and "; oss << m_matchers[i]->toString(); } oss << " )"; return oss.str(); } private: std::vector > > m_matchers; }; template class AnyOf : public MatcherImpl, ExpressionT> { public: AnyOf() {} AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} AnyOf& add( Matcher const& matcher ) { m_matchers.push_back( matcher.clone() ); return *this; } virtual bool match( ExpressionT const& expr ) const { for( std::size_t i = 0; i < m_matchers.size(); ++i ) if( m_matchers[i]->match( expr ) ) return true; return false; } virtual std::string toString() const { std::ostringstream oss; oss << "( "; for( std::size_t i = 0; i < m_matchers.size(); ++i ) { if( i != 0 ) oss << " or "; oss << m_matchers[i]->toString(); } oss << " )"; return oss.str(); } private: std::vector > > m_matchers; }; } namespace StdString { inline std::string makeString( std::string const& str ) { return str; } inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } struct Equals : MatcherImpl { Equals( std::string const& str ) : m_str( str ){} Equals( Equals const& other ) : m_str( other.m_str ){} virtual ~Equals(); virtual bool match( std::string const& expr ) const { return m_str == expr; } virtual std::string toString() const { return "equals: \"" + m_str + "\""; } std::string m_str; }; struct Contains : MatcherImpl { Contains( std::string const& substr ) : m_substr( substr ){} Contains( Contains const& other ) : m_substr( other.m_substr ){} virtual ~Contains(); virtual bool match( std::string const& expr ) const { return expr.find( m_substr ) != std::string::npos; } virtual std::string toString() const { return "contains: \"" + m_substr + "\""; } std::string m_substr; }; struct StartsWith : MatcherImpl { StartsWith( std::string const& substr ) : m_substr( substr ){} StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){} virtual ~StartsWith(); virtual bool match( std::string const& expr ) const { return expr.find( m_substr ) == 0; } virtual std::string toString() const { return "starts with: \"" + m_substr + "\""; } std::string m_substr; }; struct EndsWith : MatcherImpl { EndsWith( std::string const& substr ) : m_substr( substr ){} EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){} virtual ~EndsWith(); virtual bool match( std::string const& expr ) const { return expr.find( m_substr ) == expr.size() - m_substr.size(); } virtual std::string toString() const { return "ends with: \"" + m_substr + "\""; } std::string m_substr; }; } // namespace StdString } // namespace Impl // The following functions create the actual matcher objects. // This allows the types to be inferred template inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, Impl::Matcher const& m2 ) { return Impl::Generic::AllOf().add( m1 ).add( m2 ); } template inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, Impl::Matcher const& m2, Impl::Matcher const& m3 ) { return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); } template inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, Impl::Matcher const& m2 ) { return Impl::Generic::AnyOf().add( m1 ).add( m2 ); } template inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, Impl::Matcher const& m2, Impl::Matcher const& m3 ) { return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); } inline Impl::StdString::Equals Equals( std::string const& str ) { return Impl::StdString::Equals( str ); } inline Impl::StdString::Equals Equals( const char* str ) { return Impl::StdString::Equals( Impl::StdString::makeString( str ) ); } inline Impl::StdString::Contains Contains( std::string const& substr ) { return Impl::StdString::Contains( substr ); } inline Impl::StdString::Contains Contains( const char* substr ) { return Impl::StdString::Contains( Impl::StdString::makeString( substr ) ); } inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { return Impl::StdString::StartsWith( substr ); } inline Impl::StdString::StartsWith StartsWith( const char* substr ) { return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); } inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { return Impl::StdString::EndsWith( substr ); } inline Impl::StdString::EndsWith EndsWith( const char* substr ) { return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); } } // namespace Matchers using namespace Matchers; } // namespace Catch // These files are included here so the single_include script doesn't put them // in the conditionally compiled sections // #included from: internal/catch_interfaces_runner.h #define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED #include namespace Catch { class TestCase; struct IRunner { virtual ~IRunner(); }; } #ifdef __OBJC__ // #included from: internal/catch_objc.hpp #define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED #import #include // NB. Any general catch headers included here must be included // in catch.hpp first to make sure they are included by the single // header for non obj-usage /////////////////////////////////////////////////////////////////////////////// // This protocol is really only here for (self) documenting purposes, since // all its methods are optional. @protocol OcFixture @optional -(void) setUp; -(void) tearDown; @end namespace Catch { class OcMethod : public SharedImpl { public: OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} virtual void invoke() const { id obj = [[m_cls alloc] init]; performOptionalSelector( obj, @selector(setUp) ); performOptionalSelector( obj, m_sel ); performOptionalSelector( obj, @selector(tearDown) ); arcSafeRelease( obj ); } private: virtual ~OcMethod() {} Class m_cls; SEL m_sel; }; namespace Detail{ inline bool startsWith( std::string const& str, std::string const& sub ) { return str.length() > sub.length() && str.substr( 0, sub.length() ) == sub; } inline std::string getAnnotation( Class cls, std::string const& annotationName, std::string const& testCaseName ) { NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; SEL sel = NSSelectorFromString( selStr ); arcSafeRelease( selStr ); id value = performOptionalSelector( cls, sel ); if( value ) return [(NSString*)value UTF8String]; return ""; } } inline size_t registerTestMethods() { size_t noTestMethods = 0; int noClasses = objc_getClassList( NULL, 0 ); Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); objc_getClassList( classes, noClasses ); for( int c = 0; c < noClasses; c++ ) { Class cls = classes[c]; { u_int count; Method* methods = class_copyMethodList( cls, &count ); for( u_int m = 0; m < count ; m++ ) { SEL selector = method_getName(methods[m]); std::string methodName = sel_getName(selector); if( Detail::startsWith( methodName, "Catch_TestCase_" ) ) { std::string testCaseName = methodName.substr( 15 ); std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); const char* className = class_getName( cls ); getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); noTestMethods++; } } free(methods); } } return noTestMethods; } namespace Matchers { namespace Impl { namespace NSStringMatchers { template struct StringHolder : MatcherImpl{ StringHolder( NSString* substr ) : m_substr( [substr copy] ){} StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} StringHolder() { arcSafeRelease( m_substr ); } NSString* m_substr; }; struct Equals : StringHolder { Equals( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str isEqualToString:m_substr]; } virtual std::string toString() const { return "equals string: \"" + Catch::toString( m_substr ) + "\""; } }; struct Contains : StringHolder { Contains( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location != NSNotFound; } virtual std::string toString() const { return "contains string: \"" + Catch::toString( m_substr ) + "\""; } }; struct StartsWith : StringHolder { StartsWith( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == 0; } virtual std::string toString() const { return "starts with: \"" + Catch::toString( m_substr ) + "\""; } }; struct EndsWith : StringHolder { EndsWith( NSString* substr ) : StringHolder( substr ){} virtual bool match( ExpressionType const& str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == [str length] - [m_substr length]; } virtual std::string toString() const { return "ends with: \"" + Catch::toString( m_substr ) + "\""; } }; } // namespace NSStringMatchers } // namespace Impl inline Impl::NSStringMatchers::Equals Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } inline Impl::NSStringMatchers::Contains Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } inline Impl::NSStringMatchers::StartsWith StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } inline Impl::NSStringMatchers::EndsWith EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } } // namespace Matchers using namespace Matchers; } // namespace Catch /////////////////////////////////////////////////////////////////////////////// #define OC_TEST_CASE( name, desc )\ +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ {\ return @ name; \ }\ +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ { \ return @ desc; \ } \ -(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) #endif #if defined( CATCH_CONFIG_MAIN ) || defined( CATCH_CONFIG_RUNNER ) // #included from: internal/catch_impl.hpp #define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED // Collect all the implementation files together here // These are the equivalent of what would usually be cpp files #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wweak-vtables" #endif // #included from: catch_runner.hpp #define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED // #included from: internal/catch_commandline.hpp #define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED // #included from: clara.h #define TWOBLUECUBES_CLARA_H_INCLUDED // #included from: catch_text.h #define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED #include #include namespace Catch { struct TextAttributes { TextAttributes() : initialIndent( std::string::npos ), indent( 0 ), width( CATCH_CONFIG_CONSOLE_WIDTH-1 ), tabChar( '\t' ) {} TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } std::size_t initialIndent; // indent of first line, or npos std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos std::size_t width; // maximum width of text, including indent. Longer text will wrap char tabChar; // If this char is seen the indent is changed to current pos }; class Text { public: Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ); void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ); typedef std::vector::const_iterator const_iterator; const_iterator begin() const { return lines.begin(); } const_iterator end() const { return lines.end(); } std::string const& last() const { return lines.back(); } std::size_t size() const { return lines.size(); } std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } std::string toString() const; friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ); private: std::string str; TextAttributes attr; std::vector lines; }; } // end namespace Catch namespace Clara { namespace Detail { template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct RemoveConstRef{ typedef T type; }; template struct IsBool { static const bool value = false; }; template<> struct IsBool { static const bool value = true; }; template void convertInto( std::string const& _source, T& _dest ) { std::stringstream ss; ss << _source; ss >> _dest; if( ss.fail() ) throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); } inline void convertInto( std::string const& _source, std::string& _dest ) { _dest = _source; } inline void convertInto( std::string const& _source, bool& _dest ) { std::string sourceLC = _source; std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) _dest = true; else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) _dest = false; else throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); } inline void convertInto( bool _source, bool& _dest ) { _dest = _source; } template inline void convertInto( bool, T& ) { throw std::runtime_error( "Invalid conversion" ); } template struct IArgFunction { virtual ~IArgFunction() {} virtual void set( ConfigT& config, std::string const& value ) const = 0; virtual void setFlag( ConfigT& config ) const = 0; virtual bool takesArg() const = 0; virtual IArgFunction* clone() const = 0; }; template class BoundArgFunction { public: BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj->clone() ) {} BoundArgFunction& operator = ( BoundArgFunction const& other ) { IArgFunction* newFunctionObj = other.functionObj->clone(); delete functionObj; functionObj = newFunctionObj; return *this; } ~BoundArgFunction() { delete functionObj; } void set( ConfigT& config, std::string const& value ) const { functionObj->set( config, value ); } void setFlag( ConfigT& config ) const { functionObj->setFlag( config ); } bool takesArg() const { return functionObj->takesArg(); } private: IArgFunction* functionObj; }; template struct NullBinder : IArgFunction{ virtual void set( C&, std::string const& ) const {} virtual void setFlag( C& ) const {} virtual bool takesArg() const { return true; } virtual IArgFunction* clone() const { return new NullBinder( *this ); } }; template struct BoundDataMember : IArgFunction{ BoundDataMember( M C::* _member ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { convertInto( stringValue, p.*member ); } virtual void setFlag( C& p ) const { convertInto( true, p.*member ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } M C::* member; }; template struct BoundUnaryMethod : IArgFunction{ BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { typename RemoveConstRef::type value; convertInto( stringValue, value ); (p.*member)( value ); } virtual void setFlag( C& p ) const { typename RemoveConstRef::type value; convertInto( true, value ); (p.*member)( value ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } void (C::*member)( M ); }; template struct BoundNullaryMethod : IArgFunction{ BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} virtual void set( C& p, std::string const& stringValue ) const { bool value; convertInto( stringValue, value ); if( value ) (p.*member)(); } virtual void setFlag( C& p ) const { (p.*member)(); } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } void (C::*member)(); }; template struct BoundUnaryFunction : IArgFunction{ BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} virtual void set( C& obj, std::string const& stringValue ) const { bool value; convertInto( stringValue, value ); if( value ) function( obj ); } virtual void setFlag( C& p ) const { function( p ); } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } void (*function)( C& ); }; template struct BoundBinaryFunction : IArgFunction{ BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} virtual void set( C& obj, std::string const& stringValue ) const { typename RemoveConstRef::type value; convertInto( stringValue, value ); function( obj, value ); } virtual void setFlag( C& obj ) const { typename RemoveConstRef::type value; convertInto( true, value ); function( obj, value ); } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } void (*function)( C&, T ); }; template BoundArgFunction makeBoundField( M C::* _member ) { return BoundArgFunction( new BoundDataMember( _member ) ); } template BoundArgFunction makeBoundField( void (C::*_member)( M ) ) { return BoundArgFunction( new BoundUnaryMethod( _member ) ); } template BoundArgFunction makeBoundField( void (C::*_member)() ) { return BoundArgFunction( new BoundNullaryMethod( _member ) ); } template BoundArgFunction makeBoundField( void (*_function)( C& ) ) { return BoundArgFunction( new BoundUnaryFunction( _function ) ); } template BoundArgFunction makeBoundField( void (*_function)( C&, T ) ) { return BoundArgFunction( new BoundBinaryFunction( _function ) ); } } // namespace Detail struct Parser { Parser() : separators( " \t=:" ) {} struct Token { enum Type { Positional, ShortOpt, LongOpt }; Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} Type type; std::string data; }; void parseIntoTokens( int argc, char const * const * argv, std::vector& tokens ) const { for( int i = 1; i < argc; ++i ) parseIntoTokens( argv[i] , tokens); } void parseIntoTokens( std::string arg, std::vector& tokens ) const { while( !arg.empty() ) { Parser::Token token( Parser::Token::Positional, arg ); arg = ""; if( token.data[0] == '-' ) { if( token.data.size() > 1 && token.data[1] == '-' ) { token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); } else { token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { arg = "-" + token.data.substr( 1 ); token.data = token.data.substr( 0, 1 ); } } } if( token.type != Parser::Token::Positional ) { std::size_t pos = token.data.find_first_of( separators ); if( pos != std::string::npos ) { arg = token.data.substr( pos+1 ); token.data = token.data.substr( 0, pos ); } } tokens.push_back( token ); } } std::string separators; }; template class CommandLine { struct Arg { Arg( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ), position( -1 ) {} bool hasShortName( std::string const& shortName ) const { for( std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); it != itEnd; ++it ) if( *it == shortName ) return true; return false; } bool hasLongName( std::string const& _longName ) const { return _longName == longName; } bool takesArg() const { return !hint.empty(); } bool isFixedPositional() const { return position != -1; } bool isAnyPositional() const { return position == -1 && shortNames.empty() && longName.empty(); } std::string dbgName() const { if( !longName.empty() ) return "--" + longName; if( !shortNames.empty() ) return "-" + shortNames[0]; return "positional args"; } void validate() const { if( boundField.takesArg() && !takesArg() ) throw std::logic_error( dbgName() + " must specify an arg name" ); } std::string commands() const { std::ostringstream oss; bool first = true; std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); for(; it != itEnd; ++it ) { if( first ) first = false; else oss << ", "; oss << "-" << *it; } if( !longName.empty() ) { if( !first ) oss << ", "; oss << "--" << longName; } if( !hint.empty() ) oss << " <" << hint << ">"; return oss.str(); } Detail::BoundArgFunction boundField; std::vector shortNames; std::string longName; std::string description; std::string hint; int position; }; class ArgBinder { public: template ArgBinder( CommandLine* cl, F f ) : m_cl( cl ), m_arg( Detail::makeBoundField( f ) ) {} ArgBinder( ArgBinder& other ) : m_cl( other.m_cl ), m_arg( other.m_arg ) { other.m_cl = NULL; } ~ArgBinder() { if( m_cl ) { m_arg.validate(); if( m_arg.isFixedPositional() ) { m_cl->m_positionalArgs.insert( std::make_pair( m_arg.position, m_arg ) ); if( m_arg.position > m_cl->m_highestSpecifiedArgPosition ) m_cl->m_highestSpecifiedArgPosition = m_arg.position; } else if( m_arg.isAnyPositional() ) { if( m_cl->m_arg.get() ) throw std::logic_error( "Only one unpositional argument can be added" ); m_cl->m_arg = std::auto_ptr( new Arg( m_arg ) ); } else m_cl->m_options.push_back( m_arg ); } } ArgBinder& shortOpt( std::string const& name ) { m_arg.shortNames.push_back( name ); return *this; } ArgBinder& longOpt( std::string const& name ) { m_arg.longName = name; return *this; } ArgBinder& describe( std::string const& description ) { m_arg.description = description; return *this; } ArgBinder& hint( std::string const& hint ) { m_arg.hint = hint; return *this; } ArgBinder& position( int position ) { m_arg.position = position; return *this; } private: CommandLine* m_cl; Arg m_arg; }; public: CommandLine() : m_boundProcessName( new Detail::NullBinder() ), m_highestSpecifiedArgPosition( 0 ) {} CommandLine( CommandLine const& other ) : m_boundProcessName( other.m_boundProcessName ), m_options ( other.m_options ), m_positionalArgs( other.m_positionalArgs ), m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ) { if( other.m_arg.get() ) m_arg = std::auto_ptr( new Arg( *other.m_arg ) ); } template ArgBinder bind( F f ) { ArgBinder binder( this, f ); return binder; } template void bindProcessName( F f ) { m_boundProcessName = Detail::makeBoundField( f ); } void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = CATCH_CONFIG_CONSOLE_WIDTH ) const { typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; std::size_t maxWidth = 0; for( it = itBegin; it != itEnd; ++it ) maxWidth = (std::max)( maxWidth, it->commands().size() ); for( it = itBegin; it != itEnd; ++it ) { Catch::Text usage( it->commands(), Catch::TextAttributes() .setWidth( maxWidth+indent ) .setIndent( indent ) ); // !TBD handle longer usage strings Catch::Text desc( it->description, Catch::TextAttributes() .setWidth( width - maxWidth -3 ) ); for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { std::string usageCol = i < usage.size() ? usage[i] : ""; os << usageCol; if( i < desc.size() && !desc[i].empty() ) os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) << desc[i]; os << "\n"; } } } std::string optUsage() const { std::ostringstream oss; optUsage( oss ); return oss.str(); } void argSynopsis( std::ostream& os ) const { for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { if( i > 1 ) os << " "; typename std::map::const_iterator it = m_positionalArgs.find( i ); if( it != m_positionalArgs.end() ) os << "<" << it->second.hint << ">"; else if( m_arg.get() ) os << "<" << m_arg->hint << ">"; else throw std::logic_error( "non consecutive positional arguments with no floating args" ); } // !TBD No indication of mandatory args if( m_arg.get() ) { if( m_highestSpecifiedArgPosition > 1 ) os << " "; os << "[<" << m_arg->hint << "> ...]"; } } std::string argSynopsis() const { std::ostringstream oss; argSynopsis( oss ); return oss.str(); } void usage( std::ostream& os, std::string const& procName ) const { os << "usage:\n " << procName << " "; argSynopsis( os ); if( !m_options.empty() ) { os << " [options]\n\nwhere options are: \n"; optUsage( os, 2 ); } os << "\n"; } std::string usage( std::string const& procName ) const { std::ostringstream oss; usage( oss, procName ); return oss.str(); } std::vector parseInto( int argc, char const * const * argv, ConfigT& config ) const { std::string processName = argv[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); if( lastSlash != std::string::npos ) processName = processName.substr( lastSlash+1 ); m_boundProcessName.set( config, processName ); std::vector tokens; Parser parser; parser.parseIntoTokens( argc, argv, tokens ); return populate( tokens, config ); } std::vector populate( std::vector const& tokens, ConfigT& config ) const { if( m_options.empty() && m_positionalArgs.empty() ) throw std::logic_error( "No options or arguments specified" ); std::vector unusedTokens = populateOptions( tokens, config ); unusedTokens = populateFixedArgs( unusedTokens, config ); unusedTokens = populateFloatingArgs( unusedTokens, config ); return unusedTokens; } std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { std::vector unusedTokens; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); for(; it != itEnd; ++it ) { Arg const& arg = *it; try { if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { if( arg.takesArg() ) { if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) throw std::domain_error( "Expected argument to option " + token.data ); arg.boundField.set( config, tokens[++i].data ); } else { arg.boundField.setFlag( config ); } break; } } catch( std::exception& ex ) { throw std::runtime_error( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); } } if( it == itEnd ) unusedTokens.push_back( token ); } return unusedTokens; } std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { std::vector unusedTokens; int position = 1; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; typename std::map::const_iterator it = m_positionalArgs.find( position ); if( it != m_positionalArgs.end() ) it->second.boundField.set( config, token.data ); else unusedTokens.push_back( token ); if( token.type == Parser::Token::Positional ) position++; } return unusedTokens; } std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { if( !m_arg.get() ) return tokens; std::vector unusedTokens; for( std::size_t i = 0; i < tokens.size(); ++i ) { Parser::Token const& token = tokens[i]; if( token.type == Parser::Token::Positional ) m_arg->boundField.set( config, token.data ); else unusedTokens.push_back( token ); } return unusedTokens; } private: Detail::BoundArgFunction m_boundProcessName; std::vector m_options; std::map m_positionalArgs; std::auto_ptr m_arg; int m_highestSpecifiedArgPosition; }; } // end namespace Clara namespace Catch { inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } inline void abortAfterX( ConfigData& config, int x ) { if( x < 1 ) throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); config.abortAfter = x; } inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } inline void addWarning( ConfigData& config, std::string const& _warning ) { if( _warning == "NoAssertions" ) config.warnings = (WarnAbout::What)( config.warnings | WarnAbout::NoAssertions ); else throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); } inline void setVerbosity( ConfigData& config, int level ) { // !TBD: accept strings? config.verbosity = (Verbosity::Level)level; } inline void setShowDurations( ConfigData& config, bool _showDurations ) { config.showDurations = _showDurations ? ShowDurations::Always : ShowDurations::Never; } inline Clara::CommandLine makeCommandLineParser() { Clara::CommandLine cli; cli.bindProcessName( &ConfigData::processName ); cli.bind( &ConfigData::showHelp ) .describe( "display usage information" ) .shortOpt( "?") .shortOpt( "h") .longOpt( "help" ); cli.bind( &ConfigData::listTests ) .describe( "list all (or matching) test cases" ) .shortOpt( "l") .longOpt( "list-tests" ); cli.bind( &ConfigData::listTags ) .describe( "list all (or matching) tags" ) .shortOpt( "t") .longOpt( "list-tags" ); cli.bind( &ConfigData::listReporters ) .describe( "list all reporters" ) .longOpt( "list-reporters" ); cli.bind( &ConfigData::showSuccessfulTests ) .describe( "include successful tests in output" ) .shortOpt( "s") .longOpt( "success" ); cli.bind( &ConfigData::shouldDebugBreak ) .describe( "break into debugger on failure" ) .shortOpt( "b") .longOpt( "break" ); cli.bind( &ConfigData::noThrow ) .describe( "skip exception tests" ) .shortOpt( "e") .longOpt( "nothrow" ); cli.bind( &ConfigData::outputFilename ) .describe( "output filename" ) .shortOpt( "o") .longOpt( "out" ) .hint( "filename" ); cli.bind( &ConfigData::reporterName ) .describe( "reporter to use - defaults to console" ) .shortOpt( "r") .longOpt( "reporter" ) // .hint( "name[:filename]" ); .hint( "name" ); cli.bind( &ConfigData::name ) .describe( "suite name" ) .shortOpt( "n") .longOpt( "name" ) .hint( "name" ); cli.bind( &abortAfterFirst ) .describe( "abort at first failure" ) .shortOpt( "a") .longOpt( "abort" ); cli.bind( &abortAfterX ) .describe( "abort after x failures" ) .shortOpt( "x") .longOpt( "abortx" ) .hint( "number of failures" ); cli.bind( &addWarning ) .describe( "enable warnings" ) .shortOpt( "w") .longOpt( "warn" ) .hint( "warning name" ); // cli.bind( &setVerbosity ) // .describe( "level of verbosity (0=no output)" ) // .shortOpt( "v") // .longOpt( "verbosity" ) // .hint( "level" ); cli.bind( &addTestOrTags ) .describe( "which test or tests to use" ) .hint( "test name, pattern or tags" ); cli.bind( &setShowDurations ) .describe( "show test durations" ) .shortOpt( "d") .longOpt( "durations" ) .hint( "yes/no" ); return cli; } } // end namespace Catch // #included from: internal/catch_list.hpp #define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED // #included from: catch_console_colour.hpp #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED namespace Catch { namespace Detail { struct IColourImpl; } struct Colour { enum Code { None = 0, White, Red, Green, Blue, Cyan, Yellow, Grey, Bright = 0x10, BrightRed = Bright | Red, BrightGreen = Bright | Green, LightGrey = Bright | Grey, BrightWhite = Bright | White, // By intention FileName = LightGrey, ResultError = BrightRed, ResultSuccess = BrightGreen, Error = BrightRed, Success = Green, OriginalExpression = Cyan, ReconstructedExpression = Yellow, SecondaryText = LightGrey, Headers = White }; // Use constructed object for RAII guard Colour( Code _colourCode ); ~Colour(); // Use static method for one-shot changes static void use( Code _colourCode ); private: static Detail::IColourImpl* impl; }; } // end namespace Catch #include #include namespace Catch { inline bool matchesFilters( std::vector const& filters, TestCase const& testCase ) { std::vector::const_iterator it = filters.begin(); std::vector::const_iterator itEnd = filters.end(); for(; it != itEnd; ++it ) if( !it->shouldInclude( testCase ) ) return false; return true; } inline std::size_t listTests( Config const& config ) { if( config.filters().empty() ) std::cout << "All available test cases:\n"; else std::cout << "Matching test cases:\n"; std::vector const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests(); std::vector::const_iterator it = allTests.begin(), itEnd = allTests.end(); // First pass - get max tags std::size_t maxTagLen = 0; std::size_t maxNameLen = 0; for(; it != itEnd; ++it ) { if( matchesFilters( config.filters(), *it ) ) { maxTagLen = (std::max)( it->getTestCaseInfo().tagsAsString.size(), maxTagLen ); maxNameLen = (std::max)( it->getTestCaseInfo().name.size(), maxNameLen ); } } // Try to fit everything in. If not shrink tag column first, down to 30 // then shrink name column until it all fits (strings will be wrapped within column) while( maxTagLen + maxNameLen > CATCH_CONFIG_CONSOLE_WIDTH-5 ) { if( maxTagLen > 30 ) --maxTagLen; else --maxNameLen; } std::size_t matchedTests = 0; for( it = allTests.begin(); it != itEnd; ++it ) { if( matchesFilters( config.filters(), *it ) ) { matchedTests++; Text nameWrapper( it->getTestCaseInfo().name, TextAttributes() .setWidth( maxNameLen ) .setInitialIndent(2) .setIndent(4) ); Text tagsWrapper( it->getTestCaseInfo().tagsAsString, TextAttributes() .setWidth( maxTagLen ) .setInitialIndent(0) .setIndent( 2 ) ); for( std::size_t i = 0; i < (std::max)( nameWrapper.size(), tagsWrapper.size() ); ++i ) { Colour::Code colour = Colour::None; if( it->getTestCaseInfo().isHidden ) colour = Colour::SecondaryText; std::string nameCol; if( i < nameWrapper.size() ) { nameCol = nameWrapper[i]; } else { nameCol = " ..."; colour = Colour::SecondaryText; } { Colour colourGuard( colour ); std::cout << nameCol; } if( i < tagsWrapper.size() && !tagsWrapper[i].empty() ) { if( i == 0 ) { Colour colourGuard( Colour::SecondaryText ); std::cout << " " << std::string( maxNameLen - nameCol.size(), '.' ) << " "; } else { std::cout << std::string( maxNameLen - nameCol.size(), ' ' ) << " "; } std::cout << tagsWrapper[i]; } std::cout << "\n"; } } } if( config.filters().empty() ) std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl; else std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; return matchedTests; } inline std::size_t listTags( Config const& config ) { if( config.filters().empty() ) std::cout << "All available tags:\n"; else std::cout << "Matching tags:\n"; std::vector const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests(); std::vector::const_iterator it = allTests.begin(), itEnd = allTests.end(); std::map tagCounts; std::size_t maxTagLen = 0; for(; it != itEnd; ++it ) { if( matchesFilters( config.filters(), *it ) ) { for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), tagItEnd = it->getTestCaseInfo().tags.end(); tagIt != tagItEnd; ++tagIt ) { std::string tagName = *tagIt; maxTagLen = (std::max)( maxTagLen, tagName.size() ); std::map::iterator countIt = tagCounts.find( tagName ); if( countIt == tagCounts.end() ) tagCounts.insert( std::make_pair( tagName, 1 ) ); else countIt->second++; } } } maxTagLen +=4; if( maxTagLen > CATCH_CONFIG_CONSOLE_WIDTH-10 ) maxTagLen = CATCH_CONFIG_CONSOLE_WIDTH-10; for( std::map::const_iterator countIt = tagCounts.begin(), countItEnd = tagCounts.end(); countIt != countItEnd; ++countIt ) { Text wrapper( "[" + countIt->first + "]", TextAttributes() .setIndent(2) .setWidth( maxTagLen ) ); std::cout << wrapper; std::size_t dots = 2; if( maxTagLen > wrapper.last().size() ) dots += maxTagLen - wrapper.last().size(); { Colour colourGuard( Colour::SecondaryText ); std::cout << std::string( dots, '.' ); } std::cout << countIt->second << "\n"; } std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; return tagCounts.size(); } inline std::size_t listReporters( Config const& /*config*/ ) { std::cout << "Available reports:\n"; IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; std::size_t maxNameLen = 0; for(it = itBegin; it != itEnd; ++it ) maxNameLen = (std::max)( maxNameLen, it->first.size() ); for(it = itBegin; it != itEnd; ++it ) { Text wrapper( it->second->getDescription(), TextAttributes() .setInitialIndent( 0 ) .setIndent( 7+maxNameLen ) .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); std::cout << " " << it->first << ":" << std::string( maxNameLen - it->first.size() + 2, ' ' ) << wrapper << "\n"; } std::cout << std::endl; return factories.size(); } inline Option list( Config const& config ) { Option listedCount; if( config.listTests() ) listedCount = listedCount.valueOr(0) + listTests( config ); if( config.listTags() ) listedCount = listedCount.valueOr(0) + listTags( config ); if( config.listReporters() ) listedCount = listedCount.valueOr(0) + listReporters( config ); return listedCount; } } // end namespace Catch // #included from: internal/catch_runner_impl.hpp #define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED // #included from: catch_test_case_tracker.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED #include #include #include namespace Catch { namespace SectionTracking { class TrackedSection { typedef std::map TrackedSections; public: enum RunState { NotStarted, Executing, ExecutingChildren, Completed }; TrackedSection( std::string const& name, TrackedSection* parent ) : m_name( name ), m_runState( NotStarted ), m_parent( parent ) {} RunState runState() const { return m_runState; } void addChild( std::string const& childName ) { m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) ); } TrackedSection* getChild( std::string const& childName ) { return &m_children.find( childName )->second; } void enter() { if( m_runState == NotStarted ) m_runState = Executing; } void leave() { for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end(); it != itEnd; ++it ) if( it->second.runState() != Completed ) { m_runState = ExecutingChildren; return; } m_runState = Completed; } TrackedSection* getParent() { return m_parent; } bool hasChildren() const { return !m_children.empty(); } private: std::string m_name; RunState m_runState; TrackedSections m_children; TrackedSection* m_parent; }; class TestCaseTracker { public: TestCaseTracker( std::string const& testCaseName ) : m_testCase( testCaseName, NULL ), m_currentSection( &m_testCase ), m_completedASectionThisRun( false ) {} bool enterSection( std::string const& name ) { if( m_completedASectionThisRun ) return false; if( m_currentSection->runState() == TrackedSection::Executing ) { m_currentSection->addChild( name ); return false; } else { TrackedSection* child = m_currentSection->getChild( name ); if( child->runState() != TrackedSection::Completed ) { m_currentSection = child; m_currentSection->enter(); return true; } return false; } } void leaveSection() { m_currentSection->leave(); m_currentSection = m_currentSection->getParent(); assert( m_currentSection != NULL ); m_completedASectionThisRun = true; } bool currentSectionHasChildren() const { return m_currentSection->hasChildren(); } bool isCompleted() const { return m_testCase.runState() == TrackedSection::Completed; } class Guard { public: Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) { m_tracker.enterTestCase(); } ~Guard() { m_tracker.leaveTestCase(); } private: Guard( Guard const& ); void operator = ( Guard const& ); TestCaseTracker& m_tracker; }; private: void enterTestCase() { m_currentSection = &m_testCase; m_completedASectionThisRun = false; m_testCase.enter(); } void leaveTestCase() { m_testCase.leave(); } TrackedSection m_testCase; TrackedSection* m_currentSection; bool m_completedASectionThisRun; }; } // namespace SectionTracking using SectionTracking::TestCaseTracker; } // namespace Catch #include #include namespace Catch { class StreamRedirect { public: StreamRedirect( std::ostream& stream, std::string& targetString ) : m_stream( stream ), m_prevBuf( stream.rdbuf() ), m_targetString( targetString ) { stream.rdbuf( m_oss.rdbuf() ); } ~StreamRedirect() { m_targetString += m_oss.str(); m_stream.rdbuf( m_prevBuf ); } private: std::ostream& m_stream; std::streambuf* m_prevBuf; std::ostringstream m_oss; std::string& m_targetString; }; /////////////////////////////////////////////////////////////////////////// class RunContext : public IResultCapture, public IRunner { RunContext( RunContext const& ); void operator =( RunContext const& ); public: explicit RunContext( Ptr const& config, Ptr const& reporter ) : m_runInfo( config->name() ), m_context( getCurrentMutableContext() ), m_activeTestCase( NULL ), m_config( config ), m_reporter( reporter ), m_prevRunner( &m_context.getRunner() ), m_prevResultCapture( &m_context.getResultCapture() ), m_prevConfig( m_context.getConfig() ) { m_context.setRunner( this ); m_context.setConfig( m_config ); m_context.setResultCapture( this ); m_reporter->testRunStarting( m_runInfo ); } virtual ~RunContext() { m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); m_context.setRunner( m_prevRunner ); m_context.setConfig( NULL ); m_context.setResultCapture( m_prevResultCapture ); m_context.setConfig( m_prevConfig ); } void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); } void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); } Totals runMatching( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { std::vector matchingTests = getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec ); Totals totals; testGroupStarting( testSpec, groupIndex, groupsCount ); std::vector::const_iterator it = matchingTests.begin(); std::vector::const_iterator itEnd = matchingTests.end(); for(; it != itEnd; ++it ) totals += runTest( *it ); testGroupEnded( testSpec, totals, groupIndex, groupsCount ); return totals; } Totals runTest( TestCase const& testCase ) { Totals prevTotals = m_totals; std::string redirectedCout; std::string redirectedCerr; TestCaseInfo testInfo = testCase.getTestCaseInfo(); m_reporter->testCaseStarting( testInfo ); m_activeTestCase = &testCase; m_testCaseTracker = TestCaseTracker( testInfo.name ); do { do { runCurrentTest( redirectedCout, redirectedCerr ); } while( !m_testCaseTracker->isCompleted() && !aborting() ); } while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); Totals deltaTotals = m_totals.delta( prevTotals ); m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded( TestCaseStats( testInfo, deltaTotals, redirectedCout, redirectedCerr, aborting() ) ); m_activeTestCase = NULL; m_testCaseTracker.reset(); return deltaTotals; } Ptr config() const { return m_config; } private: // IResultCapture virtual ResultAction::Value acceptExpression( ExpressionResultBuilder const& assertionResult, AssertionInfo const& assertionInfo ) { m_lastAssertionInfo = assertionInfo; return actOnCurrentResult( assertionResult.buildResult( assertionInfo ) ); } virtual void assertionEnded( AssertionResult const& result ) { if( result.getResultType() == ResultWas::Ok ) { m_totals.assertions.passed++; } else if( !result.isOk() ) { m_totals.assertions.failed++; } if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) m_messages.clear(); // Reset working state m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); } virtual bool sectionStarted ( SectionInfo const& sectionInfo, Counts& assertions ) { std::ostringstream oss; oss << sectionInfo.name << "@" << sectionInfo.lineInfo; if( !m_testCaseTracker->enterSection( oss.str() ) ) return false; m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; m_reporter->sectionStarting( sectionInfo ); assertions = m_totals.assertions; return true; } bool testForMissingAssertions( Counts& assertions ) { if( assertions.total() != 0 || !m_config->warnAboutMissingAssertions() || m_testCaseTracker->currentSectionHasChildren() ) return false; m_totals.assertions.failed++; assertions.failed++; return true; } virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) { if( std::uncaught_exception() ) { m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) ); return; } Counts assertions = m_totals.assertions - prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); m_testCaseTracker->leaveSection(); m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) ); m_messages.clear(); } virtual void pushScopedMessage( MessageInfo const& message ) { m_messages.push_back( message ); } virtual void popScopedMessage( MessageInfo const& message ) { m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); } virtual bool shouldDebugBreak() const { return m_config->shouldDebugBreak(); } virtual std::string getCurrentTestName() const { return m_activeTestCase ? m_activeTestCase->getTestCaseInfo().name : ""; } virtual const AssertionResult* getLastResult() const { return &m_lastResult; } public: // !TBD We need to do this another way! bool aborting() const { return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); } private: ResultAction::Value actOnCurrentResult( AssertionResult const& result ) { m_lastResult = result; assertionEnded( m_lastResult ); ResultAction::Value action = ResultAction::None; if( !m_lastResult.isOk() ) { action = ResultAction::Failed; if( shouldDebugBreak() ) action = (ResultAction::Value)( action | ResultAction::Debug ); if( aborting() ) action = (ResultAction::Value)( action | ResultAction::Abort ); } return action; } void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); SectionInfo testCaseSection( testCaseInfo.name, testCaseInfo.description, testCaseInfo.lineInfo ); m_reporter->sectionStarting( testCaseSection ); Counts prevAssertions = m_totals.assertions; double duration = 0; try { m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); TestCaseTracker::Guard guard( *m_testCaseTracker ); Timer timer; timer.start(); if( m_reporter->getPreferences().shouldRedirectStdOut ) { StreamRedirect coutRedir( std::cout, redirectedCout ); StreamRedirect cerrRedir( std::cerr, redirectedCerr ); m_activeTestCase->invoke(); } else { m_activeTestCase->invoke(); } duration = timer.getElapsedSeconds(); } catch( TestFailureException& ) { // This just means the test was aborted due to failure } catch(...) { ExpressionResultBuilder exResult( ResultWas::ThrewException ); exResult << translateActiveException(); actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) ); } // If sections ended prematurely due to an exception we stored their // infos here so we can tear them down outside the unwind process. for( std::vector::const_iterator it = m_unfinishedSections.begin(), itEnd = m_unfinishedSections.end(); it != itEnd; ++it ) sectionEnded( it->info, it->prevAssertions, it->durationInSeconds ); m_unfinishedSections.clear(); m_messages.clear(); Counts assertions = m_totals.assertions - prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); m_reporter->sectionEnded( testCaseSectionStats ); } private: struct UnfinishedSections { UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds ) : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) {} SectionInfo info; Counts prevAssertions; double durationInSeconds; }; TestRunInfo m_runInfo; IMutableContext& m_context; TestCase const* m_activeTestCase; Option m_testCaseTracker; AssertionResult m_lastResult; Ptr m_config; Totals m_totals; Ptr m_reporter; std::vector m_messages; IRunner* m_prevRunner; IResultCapture* m_prevResultCapture; Ptr m_prevConfig; AssertionInfo m_lastAssertionInfo; std::vector m_unfinishedSections; }; } // end namespace Catch // #included from: internal/catch_version.h #define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED namespace Catch { // Versioning information struct Version { Version( unsigned int _majorVersion, unsigned int _minorVersion, unsigned int _buildNumber, std::string const& _branchName ) : majorVersion( _majorVersion ), minorVersion( _minorVersion ), buildNumber( _buildNumber ), branchName( _branchName ) {} const unsigned int majorVersion; const unsigned int minorVersion; const unsigned int buildNumber; const std::string branchName; private: void operator=( Version const& ); }; extern Version libraryVersion; } #include #include #include namespace Catch { class Runner { public: Runner( Ptr const& config ) : m_config( config ) { openStream(); makeReporter(); } Totals runTests() { std::vector filterGroups = m_config->filters(); if( filterGroups.empty() ) { TestCaseFilters filterGroup( "" ); filterGroups.push_back( filterGroup ); } RunContext context( m_config.get(), m_reporter ); Totals totals; for( std::size_t i=0; i < filterGroups.size() && !context.aborting(); ++i ) { context.testGroupStarting( filterGroups[i].getName(), i, filterGroups.size() ); totals += runTestsForGroup( context, filterGroups[i] ); context.testGroupEnded( filterGroups[i].getName(), totals, i, filterGroups.size() ); } return totals; } Totals runTestsForGroup( RunContext& context, const TestCaseFilters& filterGroup ) { Totals totals; std::vector::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin(); std::vector::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end(); int testsRunForGroup = 0; for(; it != itEnd; ++it ) { if( filterGroup.shouldInclude( *it ) ) { testsRunForGroup++; if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) { if( context.aborting() ) break; totals += context.runTest( *it ); m_testsAlreadyRun.insert( *it ); } } } if( testsRunForGroup == 0 && !filterGroup.getName().empty() ) m_reporter->noMatchingTestCases( filterGroup.getName() ); return totals; } private: void openStream() { // Open output file, if specified if( !m_config->getFilename().empty() ) { m_ofs.open( m_config->getFilename().c_str() ); if( m_ofs.fail() ) { std::ostringstream oss; oss << "Unable to open file: '" << m_config->getFilename() << "'"; throw std::domain_error( oss.str() ); } m_config->setStreamBuf( m_ofs.rdbuf() ); } } void makeReporter() { std::string reporterName = m_config->getReporterName().empty() ? "console" : m_config->getReporterName(); m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() ); if( !m_reporter ) { std::ostringstream oss; oss << "No reporter registered with name: '" << reporterName << "'"; throw std::domain_error( oss.str() ); } } private: Ptr m_config; std::ofstream m_ofs; Ptr m_reporter; std::set m_testsAlreadyRun; }; class Session { static bool alreadyInstantiated; public: struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; Session() : m_cli( makeCommandLineParser() ) { if( alreadyInstantiated ) { std::string msg = "Only one instance of Catch::Session can ever be used"; std::cerr << msg << std::endl; throw std::logic_error( msg ); } alreadyInstantiated = true; } ~Session() { Catch::cleanUp(); } void showHelp( std::string const& processName ) { std::cout << "\nCatch v" << libraryVersion.majorVersion << "." << libraryVersion.minorVersion << " build " << libraryVersion.buildNumber; if( libraryVersion.branchName != "master" ) std::cout << " (" << libraryVersion.branchName << " branch)"; std::cout << "\n"; m_cli.usage( std::cout, processName ); std::cout << "For more detail usage please see the project docs\n" << std::endl; } int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { try { m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); if( unusedOptionBehaviour == OnUnusedOptions::Fail ) enforceNoUsedTokens(); if( m_configData.showHelp ) showHelp( m_configData.processName ); m_config.reset(); } catch( std::exception& ex ) { { Colour colourGuard( Colour::Red ); std::cerr << "\nError in input:\n" << Text( ex.what(), TextAttributes().setIndent(2) ) << "\n\n"; } m_cli.usage( std::cout, m_configData.processName ); return (std::numeric_limits::max)(); } return 0; } void useConfigData( ConfigData const& _configData ) { m_configData = _configData; m_config.reset(); } void enforceNoUsedTokens() const { if( !m_unusedTokens.empty() ) { std::vector::const_iterator it = m_unusedTokens.begin(), itEnd = m_unusedTokens.end(); std::string msg; for(; it != itEnd; ++it ) msg += " unrecognised option: " + it->data + "\n"; throw std::runtime_error( msg.substr( 0, msg.size()-1 ) ); } } int run( int argc, char* const argv[] ) { int returnCode = applyCommandLine( argc, argv ); if( returnCode == 0 ) returnCode = run(); return returnCode; } int run() { if( m_configData.showHelp ) return 0; try { config(); // Force config to be constructed Runner runner( m_config ); // Handle list request if( Option listed = list( config() ) ) return static_cast( *listed ); return static_cast( runner.runTests().assertions.failed ); } catch( std::exception& ex ) { std::cerr << ex.what() << std::endl; return (std::numeric_limits::max)(); } } Clara::CommandLine const& cli() const { return m_cli; } std::vector const& unusedTokens() const { return m_unusedTokens; } ConfigData& configData() { return m_configData; } Config& config() { if( !m_config ) m_config = new Config( m_configData ); return *m_config; } private: Clara::CommandLine m_cli; std::vector m_unusedTokens; ConfigData m_configData; Ptr m_config; }; bool Session::alreadyInstantiated = false; } // end namespace Catch // #included from: catch_registry_hub.hpp #define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED // #included from: catch_test_case_registry_impl.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED #include #include #include #include namespace Catch { class TestRegistry : public ITestCaseRegistry { public: TestRegistry() : m_unnamedCount( 0 ) {} virtual ~TestRegistry(); virtual void registerTest( TestCase const& testCase ) { std::string name = testCase.getTestCaseInfo().name; if( name == "" ) { std::ostringstream oss; oss << "Anonymous test case " << ++m_unnamedCount; return registerTest( testCase.withName( oss.str() ) ); } if( m_functions.find( testCase ) == m_functions.end() ) { m_functions.insert( testCase ); m_functionsInOrder.push_back( testCase ); if( !testCase.isHidden() ) m_nonHiddenFunctions.push_back( testCase ); } else { TestCase const& prev = *m_functions.find( testCase ); std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n" << "\tFirst seen at " << SourceLineInfo( prev.getTestCaseInfo().lineInfo ) << "\n" << "\tRedefined at " << SourceLineInfo( testCase.getTestCaseInfo().lineInfo ) << std::endl; exit(1); } } virtual std::vector const& getAllTests() const { return m_functionsInOrder; } virtual std::vector const& getAllNonHiddenTests() const { return m_nonHiddenFunctions; } // !TBD deprecated virtual std::vector getMatchingTestCases( std::string const& rawTestSpec ) const { std::vector matchingTests; getMatchingTestCases( rawTestSpec, matchingTests ); return matchingTests; } // !TBD deprecated virtual void getMatchingTestCases( std::string const& rawTestSpec, std::vector& matchingTestsOut ) const { TestCaseFilter filter( rawTestSpec ); std::vector::const_iterator it = m_functionsInOrder.begin(); std::vector::const_iterator itEnd = m_functionsInOrder.end(); for(; it != itEnd; ++it ) { if( filter.shouldInclude( *it ) ) { matchingTestsOut.push_back( *it ); } } } virtual void getMatchingTestCases( TestCaseFilters const& filters, std::vector& matchingTestsOut ) const { std::vector::const_iterator it = m_functionsInOrder.begin(); std::vector::const_iterator itEnd = m_functionsInOrder.end(); // !TBD: replace with algorithm for(; it != itEnd; ++it ) if( filters.shouldInclude( *it ) ) matchingTestsOut.push_back( *it ); } private: std::set m_functions; std::vector m_functionsInOrder; std::vector m_nonHiddenFunctions; size_t m_unnamedCount; }; /////////////////////////////////////////////////////////////////////////// class FreeFunctionTestCase : public SharedImpl { public: FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} virtual void invoke() const { m_fun(); } private: virtual ~FreeFunctionTestCase(); TestFunction m_fun; }; inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { std::string className = classOrQualifiedMethodName; if( startsWith( className, "&" ) ) { std::size_t lastColons = className.rfind( "::" ); std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); if( penultimateColons == std::string::npos ) penultimateColons = 1; className = className.substr( penultimateColons, lastColons-penultimateColons ); } return className; } /////////////////////////////////////////////////////////////////////////// AutoReg::AutoReg( TestFunction function, SourceLineInfo const& lineInfo, NameAndDesc const& nameAndDesc ) { registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); } AutoReg::~AutoReg() {} void AutoReg::registerTestCase( ITestCase* testCase, char const* classOrQualifiedMethodName, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ) { getMutableRegistryHub().registerTest ( makeTestCase( testCase, extractClassName( classOrQualifiedMethodName ), nameAndDesc.name, nameAndDesc.description, lineInfo ) ); } } // end namespace Catch // #included from: catch_reporter_registry.hpp #define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED #include namespace Catch { class ReporterRegistry : public IReporterRegistry { public: virtual ~ReporterRegistry() { deleteAllValues( m_factories ); } virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const { FactoryMap::const_iterator it = m_factories.find( name ); if( it == m_factories.end() ) return NULL; return it->second->create( ReporterConfig( config ) ); } void registerReporter( std::string const& name, IReporterFactory* factory ) { m_factories.insert( std::make_pair( name, factory ) ); } FactoryMap const& getFactories() const { return m_factories; } private: FactoryMap m_factories; }; } // #included from: catch_exception_translator_registry.hpp #define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED #ifdef __OBJC__ #import "Foundation/Foundation.h" #endif namespace Catch { class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { public: ~ExceptionTranslatorRegistry() { deleteAll( m_translators ); } virtual void registerTranslator( const IExceptionTranslator* translator ) { m_translators.push_back( translator ); } virtual std::string translateActiveException() const { try { #ifdef __OBJC__ // In Objective-C try objective-c exceptions first @try { throw; } @catch (NSException *exception) { return toString( [exception description] ); } #else throw; #endif } catch( std::exception& ex ) { return ex.what(); } catch( std::string& msg ) { return msg; } catch( const char* msg ) { return msg; } catch(...) { return tryTranslators( m_translators.begin() ); } } std::string tryTranslators( std::vector::const_iterator it ) const { if( it == m_translators.end() ) return "Unknown exception"; try { return (*it)->translate(); } catch(...) { return tryTranslators( it+1 ); } } private: std::vector m_translators; }; } namespace Catch { namespace { class RegistryHub : public IRegistryHub, public IMutableRegistryHub { RegistryHub( RegistryHub const& ); void operator=( RegistryHub const& ); public: // IRegistryHub RegistryHub() { } virtual IReporterRegistry const& getReporterRegistry() const { return m_reporterRegistry; } virtual ITestCaseRegistry const& getTestCaseRegistry() const { return m_testCaseRegistry; } virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { return m_exceptionTranslatorRegistry; } public: // IMutableRegistryHub virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { m_reporterRegistry.registerReporter( name, factory ); } virtual void registerTest( TestCase const& testInfo ) { m_testCaseRegistry.registerTest( testInfo ); } virtual void registerTranslator( const IExceptionTranslator* translator ) { m_exceptionTranslatorRegistry.registerTranslator( translator ); } private: TestRegistry m_testCaseRegistry; ReporterRegistry m_reporterRegistry; ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; }; // Single, global, instance inline RegistryHub*& getTheRegistryHub() { static RegistryHub* theRegistryHub = NULL; if( !theRegistryHub ) theRegistryHub = new RegistryHub(); return theRegistryHub; } } IRegistryHub& getRegistryHub() { return *getTheRegistryHub(); } IMutableRegistryHub& getMutableRegistryHub() { return *getTheRegistryHub(); } void cleanUp() { delete getTheRegistryHub(); getTheRegistryHub() = NULL; cleanUpContext(); } std::string translateActiveException() { return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); } } // end namespace Catch // #included from: catch_notimplemented_exception.hpp #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED #include namespace Catch { NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) : m_lineInfo( lineInfo ) { std::ostringstream oss; oss << lineInfo << ": function "; oss << "not implemented"; m_what = oss.str(); } const char* NotImplementedException::what() const throw() { return m_what.c_str(); } } // end namespace Catch // #included from: catch_context_impl.hpp #define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED namespace Catch { class Context : public IMutableContext { Context() : m_config( NULL ) {} Context( Context const& ); void operator=( Context const& ); public: // IContext virtual IResultCapture& getResultCapture() { return *m_resultCapture; } virtual IRunner& getRunner() { return *m_runner; } virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { return getGeneratorsForCurrentTest() .getGeneratorInfo( fileInfo, totalSize ) .getCurrentIndex(); } virtual bool advanceGeneratorsForCurrentTest() { IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); return generators && generators->moveNext(); } virtual Ptr getConfig() const { return m_config; } public: // IMutableContext virtual void setResultCapture( IResultCapture* resultCapture ) { m_resultCapture = resultCapture; } virtual void setRunner( IRunner* runner ) { m_runner = runner; } virtual void setConfig( Ptr const& config ) { m_config = config; } friend IMutableContext& getCurrentMutableContext(); private: IGeneratorsForTest* findGeneratorsForCurrentTest() { std::string testName = getResultCapture().getCurrentTestName(); std::map::const_iterator it = m_generatorsByTestName.find( testName ); return it != m_generatorsByTestName.end() ? it->second : NULL; } IGeneratorsForTest& getGeneratorsForCurrentTest() { IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); if( !generators ) { std::string testName = getResultCapture().getCurrentTestName(); generators = createGeneratorsForTest(); m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); } return *generators; } private: IRunner* m_runner; IResultCapture* m_resultCapture; Ptr m_config; std::map m_generatorsByTestName; }; namespace { Context* currentContext = NULL; } IMutableContext& getCurrentMutableContext() { if( !currentContext ) currentContext = new Context(); return *currentContext; } IContext& getCurrentContext() { return getCurrentMutableContext(); } Stream createStream( std::string const& streamName ) { if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); if( streamName == "debug" ) return Stream( new StreamBufImpl, true ); throw std::domain_error( "Unknown stream: " + streamName ); } void cleanUpContext() { delete currentContext; currentContext = NULL; } } // #included from: catch_console_colour_impl.hpp #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED namespace Catch { namespace Detail { struct IColourImpl { virtual ~IColourImpl() {} virtual void use( Colour::Code _colourCode ) = 0; }; }} #if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// #ifndef NOMINMAX #define NOMINMAX #endif #ifdef __AFXDLL #include #else #include #endif namespace Catch { namespace { class Win32ColourImpl : public Detail::IColourImpl { public: Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) { CONSOLE_SCREEN_BUFFER_INFO csbiInfo; GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); originalAttributes = csbiInfo.wAttributes; } virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { case Colour::None: return setTextAttribute( originalAttributes ); case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Red: return setTextAttribute( FOREGROUND_RED ); case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); case Colour::Grey: return setTextAttribute( 0 ); case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Bright: throw std::logic_error( "not a colour" ); } } private: void setTextAttribute( WORD _textAttribute ) { SetConsoleTextAttribute( stdoutHandle, _textAttribute ); } HANDLE stdoutHandle; WORD originalAttributes; }; inline bool shouldUseColourForPlatform() { return true; } Win32ColourImpl platformColourImpl; } // end anon namespace } // end namespace Catch #else // Not Windows - assumed to be POSIX compatible ////////////////////////// #include namespace Catch { namespace { // use POSIX/ ANSI console terminal codes // Thanks to Adam Strzelecki for original contribution // (http://github.com/nanoant) // https://github.com/philsquared/Catch/pull/131 class PosixColourImpl : public Detail::IColourImpl { public: virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { case Colour::None: case Colour::White: return setColour( "[0m" ); case Colour::Red: return setColour( "[0;31m" ); case Colour::Green: return setColour( "[0;32m" ); case Colour::Blue: return setColour( "[0:34m" ); case Colour::Cyan: return setColour( "[0;36m" ); case Colour::Yellow: return setColour( "[0;33m" ); case Colour::Grey: return setColour( "[1;30m" ); case Colour::LightGrey: return setColour( "[0;37m" ); case Colour::BrightRed: return setColour( "[1;31m" ); case Colour::BrightGreen: return setColour( "[1;32m" ); case Colour::BrightWhite: return setColour( "[1;37m" ); case Colour::Bright: throw std::logic_error( "not a colour" ); } } private: void setColour( const char* _escapeCode ) { std::cout << '\033' << _escapeCode; } }; inline bool shouldUseColourForPlatform() { return isatty( fileno(stdout) ); } PosixColourImpl platformColourImpl; } // end anon namespace } // end namespace Catch #endif // not Windows namespace Catch { namespace { struct NoColourImpl : Detail::IColourImpl { void use( Colour::Code ) {} }; NoColourImpl noColourImpl; static const bool shouldUseColour = shouldUseColourForPlatform() && !isDebuggerActive(); } Colour::Colour( Code _colourCode ){ use( _colourCode ); } Colour::~Colour(){ use( None ); } void Colour::use( Code _colourCode ) { impl->use( _colourCode ); } Detail::IColourImpl* Colour::impl = shouldUseColour ? static_cast( &platformColourImpl ) : static_cast( &noColourImpl ); } // end namespace Catch // #included from: catch_generators_impl.hpp #define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED #include #include #include namespace Catch { struct GeneratorInfo : IGeneratorInfo { GeneratorInfo( std::size_t size ) : m_size( size ), m_currentIndex( 0 ) {} bool moveNext() { if( ++m_currentIndex == m_size ) { m_currentIndex = 0; return false; } return true; } std::size_t getCurrentIndex() const { return m_currentIndex; } std::size_t m_size; std::size_t m_currentIndex; }; /////////////////////////////////////////////////////////////////////////// class GeneratorsForTest : public IGeneratorsForTest { public: ~GeneratorsForTest() { deleteAll( m_generatorsInOrder ); } IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { std::map::const_iterator it = m_generatorsByName.find( fileInfo ); if( it == m_generatorsByName.end() ) { IGeneratorInfo* info = new GeneratorInfo( size ); m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); m_generatorsInOrder.push_back( info ); return *info; } return *it->second; } bool moveNext() { std::vector::const_iterator it = m_generatorsInOrder.begin(); std::vector::const_iterator itEnd = m_generatorsInOrder.end(); for(; it != itEnd; ++it ) { if( (*it)->moveNext() ) return true; } return false; } private: std::map m_generatorsByName; std::vector m_generatorsInOrder; }; IGeneratorsForTest* createGeneratorsForTest() { return new GeneratorsForTest(); } } // end namespace Catch // #included from: catch_assertionresult.hpp #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED namespace Catch { AssertionInfo::AssertionInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, std::string const& _capturedExpression, ResultDisposition::Flags _resultDisposition ) : macroName( _macroName ), lineInfo( _lineInfo ), capturedExpression( _capturedExpression ), resultDisposition( _resultDisposition ) {} AssertionResult::AssertionResult() {} AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) : m_info( info ), m_resultData( data ) {} AssertionResult::~AssertionResult() {} // Result was a success bool AssertionResult::succeeded() const { return Catch::isOk( m_resultData.resultType ); } // Result was a success, or failure is suppressed bool AssertionResult::isOk() const { return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); } ResultWas::OfType AssertionResult::getResultType() const { return m_resultData.resultType; } bool AssertionResult::hasExpression() const { return !m_info.capturedExpression.empty(); } bool AssertionResult::hasMessage() const { return !m_resultData.message.empty(); } std::string AssertionResult::getExpression() const { if( shouldNegate( m_info.resultDisposition ) ) return "!" + m_info.capturedExpression; else return m_info.capturedExpression; } std::string AssertionResult::getExpressionInMacro() const { if( m_info.macroName.empty() ) return m_info.capturedExpression; else return m_info.macroName + "( " + m_info.capturedExpression + " )"; } bool AssertionResult::hasExpandedExpression() const { return hasExpression() && getExpandedExpression() != getExpression(); } std::string AssertionResult::getExpandedExpression() const { return m_resultData.reconstructedExpression; } std::string AssertionResult::getMessage() const { return m_resultData.message; } SourceLineInfo AssertionResult::getSourceInfo() const { return m_info.lineInfo; } std::string AssertionResult::getTestMacroName() const { return m_info.macroName; } } // end namespace Catch // #included from: catch_expressionresult_builder.hpp #define TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED #include namespace Catch { ExpressionResultBuilder::ExpressionResultBuilder( ResultWas::OfType resultType ) { m_data.resultType = resultType; } ExpressionResultBuilder::ExpressionResultBuilder( ExpressionResultBuilder const& other ) : m_data( other.m_data ), m_exprComponents( other.m_exprComponents ) { m_stream << other.m_stream.str(); } ExpressionResultBuilder& ExpressionResultBuilder::operator=(ExpressionResultBuilder const& other ) { m_data = other.m_data; m_exprComponents = other.m_exprComponents; m_stream.str(""); m_stream << other.m_stream.str(); return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setResultType( ResultWas::OfType result ) { m_data.resultType = result; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setResultType( bool result ) { m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::endExpression( ResultDisposition::Flags resultDisposition ) { m_exprComponents.shouldNegate = shouldNegate( resultDisposition ); return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setLhs( std::string const& lhs ) { m_exprComponents.lhs = lhs; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setRhs( std::string const& rhs ) { m_exprComponents.rhs = rhs; return *this; } ExpressionResultBuilder& ExpressionResultBuilder::setOp( std::string const& op ) { m_exprComponents.op = op; return *this; } AssertionResult ExpressionResultBuilder::buildResult( AssertionInfo const& info ) const { assert( m_data.resultType != ResultWas::Unknown ); AssertionResultData data = m_data; // Flip bool results if shouldNegate is set if( m_exprComponents.shouldNegate && data.resultType == ResultWas::Ok ) data.resultType = ResultWas::ExpressionFailed; else if( m_exprComponents.shouldNegate && data.resultType == ResultWas::ExpressionFailed ) data.resultType = ResultWas::Ok; data.message = m_stream.str(); data.reconstructedExpression = reconstructExpression( info ); if( m_exprComponents.shouldNegate ) { if( m_exprComponents.op == "" ) data.reconstructedExpression = "!" + data.reconstructedExpression; else data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; } return AssertionResult( info, data ); } std::string ExpressionResultBuilder::reconstructExpression( AssertionInfo const& info ) const { if( m_exprComponents.op == "" ) return m_exprComponents.lhs.empty() ? info.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; else if( m_exprComponents.op == "matches" ) return m_exprComponents.lhs + " " + m_exprComponents.rhs; else if( m_exprComponents.op != "!" ) { if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && m_exprComponents.lhs.find("\n") == std::string::npos && m_exprComponents.rhs.find("\n") == std::string::npos ) return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; else return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; } else return "{can't expand - use " + info.macroName + "_FALSE( " + info.capturedExpression.substr(1) + " ) instead of " + info.macroName + "( " + info.capturedExpression + " ) for better diagnostics}"; } } // end namespace Catch // #included from: catch_test_case_info.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED namespace Catch { TestCase makeTestCase( ITestCase* _testCase, std::string const& _className, std::string const& _name, std::string const& _descOrTags, SourceLineInfo const& _lineInfo ) { std::string desc = _descOrTags; bool isHidden( startsWith( _name, "./" ) ); std::set tags; TagExtracter( tags ).parse( desc ); if( tags.find( "hide" ) != tags.end() || tags.find( "." ) != tags.end() ) isHidden = true; TestCaseInfo info( _name, _className, desc, tags, isHidden, _lineInfo ); return TestCase( _testCase, info ); } TestCaseInfo::TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::set const& _tags, bool _isHidden, SourceLineInfo const& _lineInfo ) : name( _name ), className( _className ), description( _description ), tags( _tags ), lineInfo( _lineInfo ), isHidden( _isHidden ) { std::ostringstream oss; for( std::set::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) oss << "[" << *it << "]"; tagsAsString = oss.str(); } TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) : name( other.name ), className( other.className ), description( other.description ), tags( other.tags ), tagsAsString( other.tagsAsString ), lineInfo( other.lineInfo ), isHidden( other.isHidden ) {} TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} TestCase::TestCase( TestCase const& other ) : TestCaseInfo( other ), test( other.test ) {} TestCase TestCase::withName( std::string const& _newName ) const { TestCase other( *this ); other.name = _newName; return other; } void TestCase::invoke() const { test->invoke(); } bool TestCase::isHidden() const { return TestCaseInfo::isHidden; } bool TestCase::hasTag( std::string const& tag ) const { return tags.find( toLower( tag ) ) != tags.end(); } bool TestCase::matchesTags( std::string const& tagPattern ) const { TagExpression exp; TagExpressionParser( exp ).parse( tagPattern ); return exp.matches( tags ); } std::set const& TestCase::getTags() const { return tags; } void TestCase::swap( TestCase& other ) { test.swap( other.test ); className.swap( other.className ); name.swap( other.name ); description.swap( other.description ); std::swap( lineInfo, other.lineInfo ); } bool TestCase::operator == ( TestCase const& other ) const { return test.get() == other.test.get() && name == other.name && className == other.className; } bool TestCase::operator < ( TestCase const& other ) const { return name < other.name; } TestCase& TestCase::operator = ( TestCase const& other ) { TestCase temp( other ); swap( temp ); return *this; } TestCaseInfo const& TestCase::getTestCaseInfo() const { return *this; } } // end namespace Catch // #included from: catch_version.hpp #define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED namespace Catch { // These numbers are maintained by a script Version libraryVersion( 1, 0, 10, "master" ); } // #included from: catch_text.hpp #define TWOBLUECUBES_CATCH_TEXT_HPP_INCLUDED #include #include namespace Catch { Text::Text( std::string const& _str, TextAttributes const& _attr ) : attr( _attr ) { std::string wrappableChars = " [({.,/|\\-"; std::size_t indent = _attr.initialIndent != std::string::npos ? _attr.initialIndent : _attr.indent; std::string remainder = _str; while( !remainder.empty() ) { assert( lines.size() < 1000 ); std::size_t tabPos = std::string::npos; std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); std::size_t pos = remainder.find_first_of( '\n' ); if( pos <= width ) { width = pos; } pos = remainder.find_last_of( _attr.tabChar, width ); if( pos != std::string::npos ) { tabPos = pos; if( remainder[width] == '\n' ) width--; remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); } if( width == remainder.size() ) { spliceLine( indent, remainder, width ); } else if( remainder[width] == '\n' ) { spliceLine( indent, remainder, width ); if( width <= 1 || remainder.size() != 1 ) remainder = remainder.substr( 1 ); indent = _attr.indent; } else { pos = remainder.find_last_of( wrappableChars, width ); if( pos != std::string::npos && pos > 0 ) { spliceLine( indent, remainder, pos ); if( remainder[0] == ' ' ) remainder = remainder.substr( 1 ); } else { spliceLine( indent, remainder, width-1 ); lines.back() += "-"; } if( lines.size() == 1 ) indent = _attr.indent; if( tabPos != std::string::npos ) indent += tabPos; } } } void Text::spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); _remainder = _remainder.substr( _pos ); } std::string Text::toString() const { std::ostringstream oss; oss << *this; return oss.str(); } std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); it != itEnd; ++it ) { if( it != _text.begin() ) _stream << "\n"; _stream << *it; } return _stream; } } // end namespace Catch // #included from: catch_message.hpp #define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED namespace Catch { MessageInfo::MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ) : macroName( _macroName ), lineInfo( _lineInfo ), type( _type ), sequence( ++globalCount ) {} // This may need protecting if threading support is added unsigned int MessageInfo::globalCount = 0; //////////////////////////////////////////////////////////////////////////// ScopedMessage::ScopedMessage( MessageBuilder const& builder ) : m_info( builder.m_info ) { m_info.message = builder.m_stream.str(); getResultCapture().pushScopedMessage( m_info ); } ScopedMessage::~ScopedMessage() { getResultCapture().popScopedMessage( m_info ); } } // end namespace Catch // #included from: catch_legacy_reporter_adapter.hpp #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED // #included from: catch_legacy_reporter_adapter.h #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED namespace Catch { class LegacyReporterAdapter : public SharedImpl { public: LegacyReporterAdapter( Ptr const& legacyReporter ); virtual ~LegacyReporterAdapter(); virtual ReporterPreferences getPreferences() const; virtual void noMatchingTestCases( std::string const& ); virtual void testRunStarting( TestRunInfo const& ); virtual void testGroupStarting( GroupInfo const& groupInfo ); virtual void testCaseStarting( TestCaseInfo const& testInfo ); virtual void sectionStarting( SectionInfo const& sectionInfo ); virtual void assertionStarting( AssertionInfo const& ); virtual bool assertionEnded( AssertionStats const& assertionStats ); virtual void sectionEnded( SectionStats const& sectionStats ); virtual void testCaseEnded( TestCaseStats const& testCaseStats ); virtual void testGroupEnded( TestGroupStats const& testGroupStats ); virtual void testRunEnded( TestRunStats const& testRunStats ); private: Ptr m_legacyReporter; }; } namespace Catch { LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) : m_legacyReporter( legacyReporter ) {} LegacyReporterAdapter::~LegacyReporterAdapter() {} ReporterPreferences LegacyReporterAdapter::getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); return prefs; } void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { m_legacyReporter->StartTesting(); } void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { m_legacyReporter->StartGroup( groupInfo.name ); } void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { m_legacyReporter->StartTestCase( testInfo ); } void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); } void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { // Not on legacy interface } bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); it != itEnd; ++it ) { if( it->type == ResultWas::Info ) { ExpressionResultBuilder expressionBuilder( it->type ); expressionBuilder << it->message; AssertionInfo info( it->macroName, it->lineInfo, "", ResultDisposition::Normal ); AssertionResult result = expressionBuilder.buildResult( info ); m_legacyReporter->Result( result ); } } } m_legacyReporter->Result( assertionStats.assertionResult ); return true; } void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { if( sectionStats.missingAssertions ) m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); } void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { m_legacyReporter->EndTestCase ( testCaseStats.testInfo, testCaseStats.totals, testCaseStats.stdOut, testCaseStats.stdErr ); } void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { if( testGroupStats.aborting ) m_legacyReporter->Aborted(); m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); } void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { m_legacyReporter->EndTesting( testRunStats.totals ); } } // #included from: catch_timer.hpp #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wc++11-long-long" #endif #ifdef CATCH_PLATFORM_WINDOWS #include #else #include #endif namespace Catch { namespace { #ifdef CATCH_PLATFORM_WINDOWS uint64_t getCurrentTicks() { static uint64_t hz=0, hzo=0; if (!hz) { QueryPerformanceFrequency((LARGE_INTEGER*)&hz); QueryPerformanceCounter((LARGE_INTEGER*)&hzo); } uint64_t t; QueryPerformanceCounter((LARGE_INTEGER*)&t); return ((t-hzo)*1000000)/hz; } #else uint64_t getCurrentTicks() { timeval t; gettimeofday(&t,NULL); return (uint64_t)t.tv_sec * 1000000ull + (uint64_t)t.tv_usec; } #endif } void Timer::start() { m_ticks = getCurrentTicks(); } unsigned int Timer::getElapsedNanoseconds() const { return (unsigned int)(getCurrentTicks() - m_ticks); } unsigned int Timer::getElapsedMilliseconds() const { return (unsigned int)((getCurrentTicks() - m_ticks)/1000); } double Timer::getElapsedSeconds() const { return (getCurrentTicks() - m_ticks)/1000000.0; } } // namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif // #included from: ../reporters/catch_reporter_xml.hpp #define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED // #included from: ../internal/catch_reporter_registrars.hpp #define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED namespace Catch { template class LegacyReporterRegistrar { class ReporterFactory : public IReporterFactory { virtual IStreamingReporter* create( ReporterConfig const& config ) const { return new LegacyReporterAdapter( new T( config ) ); } virtual std::string getDescription() const { return T::getDescription(); } }; public: LegacyReporterRegistrar( std::string const& name ) { getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); } }; template class ReporterRegistrar { class ReporterFactory : public IReporterFactory { // *** Please Note ***: // - If you end up here looking at a compiler error because it's trying to register // your custom reporter class be aware that the native reporter interface has changed // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. // However please consider updating to the new interface as the old one is now // deprecated and will probably be removed quite soon! // Please contact me via github if you have any questions at all about this. // In fact, ideally, please contact me anyway to let me know you've hit this - as I have // no idea who is actually using custom reporters at all (possibly no-one!). // The new interface is designed to minimise exposure to interface changes in the future. virtual IStreamingReporter* create( ReporterConfig const& config ) const { return new T( config ); } virtual std::string getDescription() const { return T::getDescription(); } }; public: ReporterRegistrar( std::string const& name ) { getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); } }; } #define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); #define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); // #included from: ../internal/catch_xmlwriter.hpp #define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED #include #include #include #include namespace Catch { class XmlWriter { public: class ScopedElement { public: ScopedElement( XmlWriter* writer ) : m_writer( writer ) {} ScopedElement( ScopedElement const& other ) : m_writer( other.m_writer ){ other.m_writer = NULL; } ~ScopedElement() { if( m_writer ) m_writer->endElement(); } ScopedElement& writeText( std::string const& text, bool indent = true ) { m_writer->writeText( text, indent ); return *this; } template ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { m_writer->writeAttribute( name, attribute ); return *this; } private: mutable XmlWriter* m_writer; }; XmlWriter() : m_tagIsOpen( false ), m_needsNewline( false ), m_os( &std::cout ) {} XmlWriter( std::ostream& os ) : m_tagIsOpen( false ), m_needsNewline( false ), m_os( &os ) {} ~XmlWriter() { while( !m_tags.empty() ) endElement(); } XmlWriter& operator = ( XmlWriter const& other ) { XmlWriter temp( other ); swap( temp ); return *this; } void swap( XmlWriter& other ) { std::swap( m_tagIsOpen, other.m_tagIsOpen ); std::swap( m_needsNewline, other.m_needsNewline ); std::swap( m_tags, other.m_tags ); std::swap( m_indent, other.m_indent ); std::swap( m_os, other.m_os ); } XmlWriter& startElement( std::string const& name ) { ensureTagClosed(); newlineIfNecessary(); stream() << m_indent << "<" << name; m_tags.push_back( name ); m_indent += " "; m_tagIsOpen = true; return *this; } ScopedElement scopedElement( std::string const& name ) { ScopedElement scoped( this ); startElement( name ); return scoped; } XmlWriter& endElement() { newlineIfNecessary(); m_indent = m_indent.substr( 0, m_indent.size()-2 ); if( m_tagIsOpen ) { stream() << "/>\n"; m_tagIsOpen = false; } else { stream() << m_indent << "\n"; } m_tags.pop_back(); return *this; } XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { if( !name.empty() && !attribute.empty() ) { stream() << " " << name << "=\""; writeEncodedText( attribute ); stream() << "\""; } return *this; } XmlWriter& writeAttribute( std::string const& name, bool attribute ) { stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; return *this; } template XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { if( !name.empty() ) stream() << " " << name << "=\"" << attribute << "\""; return *this; } XmlWriter& writeText( std::string const& text, bool indent = true ) { if( !text.empty() ){ bool tagWasOpen = m_tagIsOpen; ensureTagClosed(); if( tagWasOpen && indent ) stream() << m_indent; writeEncodedText( text ); m_needsNewline = true; } return *this; } XmlWriter& writeComment( std::string const& text ) { ensureTagClosed(); stream() << m_indent << ""; m_needsNewline = true; return *this; } XmlWriter& writeBlankLine() { ensureTagClosed(); stream() << "\n"; return *this; } private: std::ostream& stream() { return *m_os; } void ensureTagClosed() { if( m_tagIsOpen ) { stream() << ">\n"; m_tagIsOpen = false; } } void newlineIfNecessary() { if( m_needsNewline ) { stream() << "\n"; m_needsNewline = false; } } void writeEncodedText( std::string const& text ) { static const char* charsToEncode = "<&\""; std::string mtext = text; std::string::size_type pos = mtext.find_first_of( charsToEncode ); while( pos != std::string::npos ) { stream() << mtext.substr( 0, pos ); switch( mtext[pos] ) { case '<': stream() << "<"; break; case '&': stream() << "&"; break; case '\"': stream() << """; break; } mtext = mtext.substr( pos+1 ); pos = mtext.find_first_of( charsToEncode ); } stream() << mtext; } bool m_tagIsOpen; bool m_needsNewline; std::vector m_tags; std::string m_indent; std::ostream* m_os; }; } namespace Catch { class XmlReporter : public SharedImpl { public: XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} static std::string getDescription() { return "Reports test results as an XML document"; } virtual ~XmlReporter(); private: // IReporter virtual bool shouldRedirectStdout() const { return true; } virtual void StartTesting() { m_xml = XmlWriter( m_config.stream() ); m_xml.startElement( "Catch" ); if( !m_config.fullConfig()->name().empty() ) m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); } virtual void EndTesting( const Totals& totals ) { m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", totals.assertions.passed ) .writeAttribute( "failures", totals.assertions.failed ); m_xml.endElement(); } virtual void StartGroup( const std::string& groupName ) { m_xml.startElement( "Group" ) .writeAttribute( "name", groupName ); } virtual void EndGroup( const std::string&, const Totals& totals ) { m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", totals.assertions.passed ) .writeAttribute( "failures", totals.assertions.failed ); m_xml.endElement(); } virtual void StartSection( const std::string& sectionName, const std::string& description ) { if( m_sectionDepth++ > 0 ) { m_xml.startElement( "Section" ) .writeAttribute( "name", sectionName ) .writeAttribute( "description", description ); } } virtual void NoAssertionsInSection( const std::string& ) {} virtual void NoAssertionsInTestCase( const std::string& ) {} virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { if( --m_sectionDepth > 0 ) { m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", assertions.passed ) .writeAttribute( "failures", assertions.failed ); m_xml.endElement(); } } virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { m_xml.startElement( "TestCase" ).writeAttribute( "name", testInfo.name ); m_currentTestSuccess = true; } virtual void Result( const Catch::AssertionResult& assertionResult ) { if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) return; if( assertionResult.hasExpression() ) { m_xml.startElement( "Expression" ) .writeAttribute( "success", assertionResult.succeeded() ) .writeAttribute( "filename", assertionResult.getSourceInfo().file ) .writeAttribute( "line", assertionResult.getSourceInfo().line ); m_xml.scopedElement( "Original" ) .writeText( assertionResult.getExpression() ); m_xml.scopedElement( "Expanded" ) .writeText( assertionResult.getExpandedExpression() ); m_currentTestSuccess &= assertionResult.succeeded(); } switch( assertionResult.getResultType() ) { case ResultWas::ThrewException: m_xml.scopedElement( "Exception" ) .writeAttribute( "filename", assertionResult.getSourceInfo().file ) .writeAttribute( "line", assertionResult.getSourceInfo().line ) .writeText( assertionResult.getMessage() ); m_currentTestSuccess = false; break; case ResultWas::Info: m_xml.scopedElement( "Info" ) .writeText( assertionResult.getMessage() ); break; case ResultWas::Warning: m_xml.scopedElement( "Warning" ) .writeText( assertionResult.getMessage() ); break; case ResultWas::ExplicitFailure: m_xml.scopedElement( "Failure" ) .writeText( assertionResult.getMessage() ); m_currentTestSuccess = false; break; case ResultWas::Unknown: case ResultWas::Ok: case ResultWas::FailureBit: case ResultWas::ExpressionFailed: case ResultWas::Exception: case ResultWas::DidntThrowException: break; } if( assertionResult.hasExpression() ) m_xml.endElement(); } virtual void Aborted() { // !TBD } virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); m_xml.endElement(); } private: ReporterConfig m_config; bool m_currentTestSuccess; XmlWriter m_xml; int m_sectionDepth; }; } // end namespace Catch // #included from: ../reporters/catch_reporter_junit.hpp #define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED #include namespace Catch { class JunitReporter : public CumulativeReporterBase { public: JunitReporter( ReporterConfig const& _config ) : CumulativeReporterBase( _config ), xml( _config.stream() ) {} ~JunitReporter(); static std::string getDescription() { return "Reports test results in an XML format that looks like Ant's junitreport target"; } virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} virtual ReporterPreferences getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = true; return prefs; } virtual void testRunStarting( TestRunInfo const& runInfo ) { CumulativeReporterBase::testRunStarting( runInfo ); xml.startElement( "testsuites" ); } virtual void testGroupStarting( GroupInfo const& groupInfo ) { suiteTimer.start(); stdOutForSuite.str(""); stdErrForSuite.str(""); unexpectedExceptions = 0; CumulativeReporterBase::testGroupStarting( groupInfo ); } virtual bool assertionEnded( AssertionStats const& assertionStats ) { if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) unexpectedExceptions++; return CumulativeReporterBase::assertionEnded( assertionStats ); } virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { stdOutForSuite << testCaseStats.stdOut; stdErrForSuite << testCaseStats.stdErr; CumulativeReporterBase::testCaseEnded( testCaseStats ); } virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { double suiteTime = suiteTimer.getElapsedSeconds(); CumulativeReporterBase::testGroupEnded( testGroupStats ); writeGroup( *m_testGroups.back(), suiteTime ); } virtual void testRunEnded() { xml.endElement(); } void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); TestGroupStats const& stats = groupNode.value; xml.writeAttribute( "name", stats.groupInfo.name ); xml.writeAttribute( "errors", unexpectedExceptions ); xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); xml.writeAttribute( "tests", stats.totals.assertions.total() ); xml.writeAttribute( "hostname", "tbd" ); // !TBD if( m_config->showDurations() == ShowDurations::Never ) xml.writeAttribute( "time", "" ); else xml.writeAttribute( "time", suiteTime ); xml.writeAttribute( "timestamp", "tbd" ); // !TBD // Write test cases for( TestGroupNode::ChildNodes::const_iterator it = groupNode.children.begin(), itEnd = groupNode.children.end(); it != itEnd; ++it ) writeTestCase( **it ); xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); } void writeTestCase( TestCaseNode const& testCaseNode ) { TestCaseStats const& stats = testCaseNode.value; // All test cases have exactly one section - which represents the // test case itself. That section may have 0-n nested sections assert( testCaseNode.children.size() == 1 ); SectionNode const& rootSection = *testCaseNode.children.front(); std::string className = stats.testInfo.className; if( className.empty() ) { if( rootSection.childSections.empty() ) className = "global"; } writeSection( className, "", rootSection ); } void writeSection( std::string const& className, std::string const& rootName, SectionNode const& sectionNode ) { std::string name = trim( sectionNode.stats.sectionInfo.name ); if( !rootName.empty() ) name = rootName + "/" + name; if( !sectionNode.assertions.empty() || !sectionNode.stdOut.empty() || !sectionNode.stdErr.empty() ) { XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); if( className.empty() ) { xml.writeAttribute( "classname", name ); xml.writeAttribute( "name", "root" ); } else { xml.writeAttribute( "classname", className ); xml.writeAttribute( "name", name ); } xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) ); writeAssertions( sectionNode ); if( !sectionNode.stdOut.empty() ) xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); if( !sectionNode.stdErr.empty() ) xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); } for( SectionNode::ChildSections::const_iterator it = sectionNode.childSections.begin(), itEnd = sectionNode.childSections.end(); it != itEnd; ++it ) if( className.empty() ) writeSection( name, "", **it ); else writeSection( className, name, **it ); } void writeAssertions( SectionNode const& sectionNode ) { for( SectionNode::Assertions::const_iterator it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); it != itEnd; ++it ) writeAssertion( *it ); } void writeAssertion( AssertionStats const& stats ) { AssertionResult const& result = stats.assertionResult; if( !result.isOk() ) { std::string elementName; switch( result.getResultType() ) { case ResultWas::ThrewException: elementName = "error"; break; case ResultWas::ExplicitFailure: elementName = "failure"; break; case ResultWas::ExpressionFailed: elementName = "failure"; break; case ResultWas::DidntThrowException: elementName = "failure"; break; // We should never see these here: case ResultWas::Info: case ResultWas::Warning: case ResultWas::Ok: case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: elementName = "internalError"; break; } XmlWriter::ScopedElement e = xml.scopedElement( elementName ); xml.writeAttribute( "message", result.getExpandedExpression() ); xml.writeAttribute( "type", result.getTestMacroName() ); std::ostringstream oss; if( !result.getMessage().empty() ) oss << result.getMessage() << "\n"; for( std::vector::const_iterator it = stats.infoMessages.begin(), itEnd = stats.infoMessages.end(); it != itEnd; ++it ) if( it->type == ResultWas::Info ) oss << it->message << "\n"; oss << "at " << result.getSourceInfo(); xml.writeText( oss.str(), false ); } } XmlWriter xml; Timer suiteTimer; std::ostringstream stdOutForSuite; std::ostringstream stdErrForSuite; unsigned int unexpectedExceptions; }; INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) } // end namespace Catch // #included from: ../reporters/catch_reporter_console.hpp #define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED namespace Catch { struct ConsoleReporter : StreamingReporterBase { ConsoleReporter( ReporterConfig const& _config ) : StreamingReporterBase( _config ), m_headerPrinted( false ), m_atLeastOneTestCasePrinted( false ) {} virtual ~ConsoleReporter(); static std::string getDescription() { return "Reports test results as plain lines of text"; } virtual ReporterPreferences getPreferences() const { ReporterPreferences prefs; prefs.shouldRedirectStdOut = false; return prefs; } virtual void noMatchingTestCases( std::string const& spec ) { stream << "No test cases matched '" << spec << "'" << std::endl; } virtual void assertionStarting( AssertionInfo const& ) { } virtual bool assertionEnded( AssertionStats const& _assertionStats ) { AssertionResult const& result = _assertionStats.assertionResult; // Drop out if result was successful and we're not printing those if( !m_config->includeSuccessfulResults() && result.isOk() ) return false; lazyPrint(); AssertionPrinter printer( stream, _assertionStats ); printer.print(); stream << std::endl; return true; } virtual void sectionStarting( SectionInfo const& _sectionInfo ) { m_headerPrinted = false; StreamingReporterBase::sectionStarting( _sectionInfo ); } virtual void sectionEnded( SectionStats const& _sectionStats ) { if( _sectionStats.missingAssertions ) { lazyPrint(); Colour colour( Colour::ResultError ); if( m_sectionStack.size() > 1 ) stream << "\nNo assertions in section"; else stream << "\nNo assertions in test case"; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; } if( m_headerPrinted ) { if( m_config->showDurations() == ShowDurations::Always ) stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; m_headerPrinted = false; } else { if( m_config->showDurations() == ShowDurations::Always ) stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; } StreamingReporterBase::sectionEnded( _sectionStats ); } virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { StreamingReporterBase::testCaseEnded( _testCaseStats ); m_headerPrinted = false; } virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { if( currentGroupInfo.used ) { printSummaryDivider(); stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; printTotals( _testGroupStats.totals ); stream << "\n" << std::endl; } StreamingReporterBase::testGroupEnded( _testGroupStats ); } virtual void testRunEnded( TestRunStats const& _testRunStats ) { if( m_atLeastOneTestCasePrinted ) printTotalsDivider(); printTotals( _testRunStats.totals ); stream << "\n" << std::endl; StreamingReporterBase::testRunEnded( _testRunStats ); } private: class AssertionPrinter { void operator= ( AssertionPrinter const& ); public: AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats ) : stream( _stream ), stats( _stats ), result( _stats.assertionResult ), colour( Colour::None ), message( result.getMessage() ), messages( _stats.infoMessages ) { switch( result.getResultType() ) { case ResultWas::Ok: colour = Colour::Success; passOrFail = "PASSED"; //if( result.hasMessage() ) if( _stats.infoMessages.size() == 1 ) messageLabel = "with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "with messages"; break; case ResultWas::ExpressionFailed: if( result.isOk() ) { colour = Colour::Success; passOrFail = "FAILED - but was ok"; } else { colour = Colour::Error; passOrFail = "FAILED"; } if( _stats.infoMessages.size() == 1 ) messageLabel = "with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "with messages"; break; case ResultWas::ThrewException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "due to unexpected exception with message"; break; case ResultWas::DidntThrowException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "because no exception was thrown where one was expected"; break; case ResultWas::Info: messageLabel = "info"; break; case ResultWas::Warning: messageLabel = "warning"; break; case ResultWas::ExplicitFailure: passOrFail = "FAILED"; colour = Colour::Error; if( _stats.infoMessages.size() == 1 ) messageLabel = "explicitly with message"; if( _stats.infoMessages.size() > 1 ) messageLabel = "explicitly with messages"; break; // These cases are here to prevent compiler warnings case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: passOrFail = "** internal error **"; colour = Colour::Error; break; } } void print() const { printSourceInfo(); if( stats.totals.assertions.total() > 0 ) { if( result.isOk() ) stream << "\n"; printResultType(); printOriginalExpression(); printReconstructedExpression(); } else { stream << "\n"; } printMessage(); } private: void printResultType() const { if( !passOrFail.empty() ) { Colour colourGuard( colour ); stream << passOrFail << ":\n"; } } void printOriginalExpression() const { if( result.hasExpression() ) { Colour colourGuard( Colour::OriginalExpression ); stream << " "; stream << result.getExpressionInMacro(); stream << "\n"; } } void printReconstructedExpression() const { if( result.hasExpandedExpression() ) { stream << "with expansion:\n"; Colour colourGuard( Colour::ReconstructedExpression ); stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; } } void printMessage() const { if( !messageLabel.empty() ) stream << messageLabel << ":" << "\n"; for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); it != itEnd; ++it ) { stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; } } void printSourceInfo() const { Colour colourGuard( Colour::FileName ); stream << result.getSourceInfo() << ": "; } std::ostream& stream; AssertionStats const& stats; AssertionResult const& result; Colour::Code colour; std::string passOrFail; std::string messageLabel; std::string message; std::vector messages; }; void lazyPrint() { if( !currentTestRunInfo.used ) lazyPrintRunInfo(); if( !currentGroupInfo.used ) lazyPrintGroupInfo(); if( !m_headerPrinted ) { printTestCaseAndSectionHeader(); m_headerPrinted = true; } m_atLeastOneTestCasePrinted = true; } void lazyPrintRunInfo() { stream << "\n" << getTildes() << "\n"; Colour colour( Colour::SecondaryText ); stream << currentTestRunInfo->name << " is a Catch v" << libraryVersion.majorVersion << "." << libraryVersion.minorVersion << " b" << libraryVersion.buildNumber; if( libraryVersion.branchName != "master" ) stream << " (" << libraryVersion.branchName << ")"; stream << " host application.\n" << "Run with -? for options\n\n"; currentTestRunInfo.used = true; } void lazyPrintGroupInfo() { if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { printClosedHeader( "Group: " + currentGroupInfo->name ); currentGroupInfo.used = true; } } void printTestCaseAndSectionHeader() { assert( !m_sectionStack.empty() ); printOpenHeader( currentTestCaseInfo->name ); if( m_sectionStack.size() > 1 ) { Colour colourGuard( Colour::Headers ); std::vector::const_iterator it = m_sectionStack.begin()+1, // Skip first section (test case) itEnd = m_sectionStack.end(); for( ; it != itEnd; ++it ) printHeaderString( it->name, 2 ); } SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; if( !lineInfo.empty() ){ stream << getDashes() << "\n"; Colour colourGuard( Colour::FileName ); stream << lineInfo << "\n"; } stream << getDots() << "\n" << std::endl; } void printClosedHeader( std::string const& _name ) { printOpenHeader( _name ); stream << getDots() << "\n"; } void printOpenHeader( std::string const& _name ) { stream << getDashes() << "\n"; { Colour colourGuard( Colour::Headers ); printHeaderString( _name ); } } // if string has a : in first line will set indent to follow it on // subsequent lines void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { std::size_t i = _string.find( ": " ); if( i != std::string::npos ) i+=2; else i = 0; stream << Text( _string, TextAttributes() .setIndent( indent+i) .setInitialIndent( indent ) ) << "\n"; } void printTotals( const Totals& totals ) { if( totals.assertions.total() == 0 ) { stream << "No tests ran"; } else if( totals.assertions.failed ) { Colour colour( Colour::ResultError ); printCounts( "test case", totals.testCases ); if( totals.testCases.failed > 0 ) { stream << " ("; printCounts( "assertion", totals.assertions ); stream << ")"; } } else { Colour colour( Colour::ResultSuccess ); stream << "All tests passed (" << pluralise( totals.assertions.passed, "assertion" ) << " in " << pluralise( totals.testCases.passed, "test case" ) << ")"; } } void printCounts( std::string const& label, Counts const& counts ) { if( counts.total() == 1 ) { stream << "1 " << label << " - "; if( counts.failed ) stream << "failed"; else stream << "passed"; } else { stream << counts.total() << " " << label << "s "; if( counts.passed ) { if( counts.failed ) stream << "- " << counts.failed << " failed"; else if( counts.passed == 2 ) stream << "- both passed"; else stream << "- all passed"; } else { if( counts.failed == 2 ) stream << "- both failed"; else stream << "- all failed"; } } } void printTotalsDivider() { stream << getDoubleDashes() << "\n"; } void printSummaryDivider() { stream << getDashes() << "\n"; } static std::string const& getDashes() { static const std::string dashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '-' ); return dashes; } static std::string const& getDots() { static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '.' ); return dots; } static std::string const& getDoubleDashes() { static const std::string doubleDashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); return doubleDashes; } static std::string const& getTildes() { static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '~' ); return dots; } private: bool m_headerPrinted; bool m_atLeastOneTestCasePrinted; }; INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) } // end namespace Catch namespace Catch { NonCopyable::~NonCopyable() {} IShared::~IShared() {} StreamBufBase::~StreamBufBase() throw() {} IContext::~IContext() {} IResultCapture::~IResultCapture() {} ITestCase::~ITestCase() {} ITestCaseRegistry::~ITestCaseRegistry() {} IRegistryHub::~IRegistryHub() {} IMutableRegistryHub::~IMutableRegistryHub() {} IExceptionTranslator::~IExceptionTranslator() {} IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} IReporter::~IReporter() {} IReporterFactory::~IReporterFactory() {} IReporterRegistry::~IReporterRegistry() {} IStreamingReporter::~IStreamingReporter() {} AssertionStats::~AssertionStats() {} SectionStats::~SectionStats() {} TestCaseStats::~TestCaseStats() {} TestGroupStats::~TestGroupStats() {} TestRunStats::~TestRunStats() {} CumulativeReporterBase::SectionNode::~SectionNode() {} CumulativeReporterBase::~CumulativeReporterBase() {} StreamingReporterBase::~StreamingReporterBase() {} ConsoleReporter::~ConsoleReporter() {} IRunner::~IRunner() {} IMutableContext::~IMutableContext() {} IConfig::~IConfig() {} XmlReporter::~XmlReporter() {} JunitReporter::~JunitReporter() {} TestRegistry::~TestRegistry() {} FreeFunctionTestCase::~FreeFunctionTestCase() {} IGeneratorInfo::~IGeneratorInfo() {} IGeneratorsForTest::~IGeneratorsForTest() {} TagParser::~TagParser() {} TagExtracter::~TagExtracter() {} TagExpressionParser::~TagExpressionParser() {} Matchers::Impl::StdString::Equals::~Equals() {} Matchers::Impl::StdString::Contains::~Contains() {} Matchers::Impl::StdString::StartsWith::~StartsWith() {} Matchers::Impl::StdString::EndsWith::~EndsWith() {} void Config::dummy() {} INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) } #ifdef __clang__ #pragma clang diagnostic pop #endif #endif #ifdef CATCH_CONFIG_MAIN // #included from: internal/catch_default_main.hpp #define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED #ifndef __OBJC__ // Standard C/C++ main entry point int main (int argc, char * const argv[]) { return Catch::Session().run( argc, argv ); } #else // __OBJC__ // Objective-C entry point int main (int argc, char * const argv[]) { #if !CATCH_ARC_ENABLED NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; #endif Catch::registerTestMethods(); int result = Catch::Session().run( argc, (char* const*)argv ); #if !CATCH_ARC_ENABLED [pool drain]; #endif return result; } #endif // __OBJC__ #endif ////// // If this config identifier is defined then all CATCH macros are prefixed with CATCH_ #ifdef CATCH_CONFIG_PREFIX_ALL #define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) #define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "CATCH_REQUIRE_FALSE" ) #define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" ) #define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) #define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) #define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) #define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CATCH_CHECK_FALSE" ) #define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) #define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) #define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) #define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) #define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) #define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) #define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) #define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) #define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN" ) #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL" ) #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED" ) #define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) #define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) #define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) #ifdef CATCH_CONFIG_VARIADIC_MACROS #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #else #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) #endif #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) #define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) #define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) #define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) // "BDD-style" convenience wrappers #ifdef CATCH_CONFIG_VARIADIC_MACROS #define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) #else #define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) #endif #define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" ) #define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" ) #define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" ) #define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" ) #define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" ) // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required #else #define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) #define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "REQUIRE_FALSE" ) #define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "REQUIRE_THROWS" ) #define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) #define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) #define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) #define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CHECK_FALSE" ) #define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) #define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) #define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) #define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" ) #define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) #define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) #define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) #define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) #define WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN" ) #define FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL" ) #define SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED" ) #define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) #define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) #define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) #ifdef CATCH_CONFIG_VARIADIC_MACROS #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #else #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) #endif #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) #define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) #define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) #define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) #endif #define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) // "BDD-style" convenience wrappers #ifdef CATCH_CONFIG_VARIADIC_MACROS #define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) #else #define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) #endif #define GIVEN( desc ) SECTION( " Given: " desc, "" ) #define WHEN( desc ) SECTION( " When: " desc, "" ) #define AND_WHEN( desc ) SECTION( "And when: " desc, "" ) #define THEN( desc ) SECTION( " Then: " desc, "" ) #define AND_THEN( desc ) SECTION( " And: " desc, "" ) using Catch::Detail::Approx; #ifdef __clang__ #pragma clang diagnostic pop #endif #endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED