PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/local/share/man/man3
Viewing File: /usr/local/share/man/man3/Test::Warnings.3pm
.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Test::Warnings 3" .TH Test::Warnings 3 "2024-01-23" "perl v5.26.3" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Test::Warnings \- Test for warnings and the lack of them .SH "VERSION" .IX Header "VERSION" version 0.033 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 2 \& use Test::More; \& use Test::Warnings; \& \& pass(\*(Aqyay!\*(Aq); \& done_testing; .Ve .PP emits \s-1TAP:\s0 .PP .Vb 3 \& ok 1 \- yay! \& ok 2 \- no (unexpected) warnings (via done_testing) \& 1..2 .Ve .PP and: .PP .Vb 2 \& use Test::More tests => 3; \& use Test::Warnings 0.005 \*(Aq:all\*(Aq; \& \& pass(\*(Aqyay!\*(Aq); \& like(warning { warn "oh noes!" }, qr/^oh noes/, \*(Aqwe warned\*(Aq); .Ve .PP emits \s-1TAP:\s0 .PP .Vb 4 \& ok 1 \- yay! \& ok 2 \- we warned \& ok 3 \- no (unexpected) warnings (via END block) \& 1..3 .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" If you've ever tried to use Test::NoWarnings to confirm there are no warnings generated by your tests, combined with the convenience of \f(CW\*(C`done_testing\*(C'\fR to not have to declare a test count, you'll have discovered that these two features do not play well together, as the test count will be calculated \fIbefore\fR the warnings test is run, resulting in a \s-1TAP\s0 error. (See \f(CW\*(C`examples/test_nowarnings.pl\*(C'\fR in this distribution for a demonstration.) .PP This module is intended to be used as a drop-in replacement for Test::NoWarnings: it also adds an extra test, but runs this test \fIbefore\fR \&\f(CW\*(C`done_testing\*(C'\fR calculates the test count, rather than after. It does this by hooking into \f(CW\*(C`done_testing\*(C'\fR as well as via an \f(CW\*(C`END\*(C'\fR block. You can declare a plan, or not, and things will still Just Work. .PP It is actually equivalent to: .PP .Vb 1 \& use Test::NoWarnings 1.04 \*(Aq:early\*(Aq; .Ve .PP as warnings are still printed normally as they occur. You are safe, and enthusiastically encouraged, to perform a global search-replace of the above with \f(CW\*(C`use Test::Warnings;\*(C'\fR whether or not your tests have a plan. .PP It can also be used as a replacement for Test::Warn, if you wish to test the content of expected warnings; read on to find out how. .SH "FUNCTIONS" .IX Header "FUNCTIONS" The following functions are available for import (not included by default; you can also get all of them by importing the tag \f(CW\*(C`:all\*(C'\fR): .ie n .SS """allow_warnings([bool])"" \- \s-1EXPERIMENTAL\s0 \- \s-1MAY BE REMOVED\s0" .el .SS "\f(CWallow_warnings([bool])\fP \- \s-1EXPERIMENTAL\s0 \- \s-1MAY BE REMOVED\s0" .IX Subsection "allow_warnings([bool]) - EXPERIMENTAL - MAY BE REMOVED" When passed a true value, or no value at all, subsequent warnings will not result in a test failure; when passed a false value, subsequent warnings will result in a test failure. Initial value is \f(CW\*(C`false\*(C'\fR. .PP When warnings are allowed, any warnings will instead be emitted via Test::Builder::note. .ie n .SS """allowing_warnings"" \- \s-1EXPERIMENTAL\s0 \- \s-1MAY BE REMOVED\s0" .el .SS "\f(CWallowing_warnings\fP \- \s-1EXPERIMENTAL\s0 \- \s-1MAY BE REMOVED\s0" .IX Subsection "allowing_warnings - EXPERIMENTAL - MAY BE REMOVED" Returns whether we are currently allowing warnings (set by \f(CW\*(C`allow_warnings\*(C'\fR as described above). .ie n .SS """had_no_warnings(<optional test name>)""" .el .SS "\f(CWhad_no_warnings(<optional test name>)\fP" .IX Subsection "had_no_warnings(<optional test name>)" Tests whether there have been any warnings so far, not preceded by an \&\f(CW\*(C`allowing_warnings\*(C'\fR call. It is run automatically at the end of all tests, but can also be called manually at any time, as often as desired. .ie n .SS """warnings( { code } )""" .el .SS "\f(CWwarnings( { code } )\fP" .IX Subsection "warnings( { code } )" Given a code block, runs the block and returns a list of all the (not previously allowed via \f(CW\*(C`allow_warnings\*(C'\fR) warnings issued within. This lets you test for the presence of warnings that you not only would \fIallow\fR, but \fImust\fR be issued. Testing functions are not provided; given the strings returned, you can test these yourself using your favourite testing functions, such as Test::More::is or Test::Deep::cmp_deeply. .PP You can use this construct as a replacement for Test::Warn::warnings_are: .PP .Vb 8 \& is_deeply( \& [ warnings { ... } ], \& [ \& \*(Aqwarning message 1\*(Aq, \& \*(Aqwarning message 2\*(Aq, \& ], \& \*(Aqgot expected warnings\*(Aq, \& ); .Ve .PP or, to replace Test::Warn::warnings_like: .PP .Vb 8 \& cmp_deeply( \& [ warnings { ... } ], \& bag( # ordering of messages doesn\*(Aqt matter \& re(qr/warning message 1/), \& re(qr/warning message 2/), \& ), \& \*(Aqgot expected warnings (in any order)\*(Aq, \& ); .Ve .PP Warnings generated by this code block are \fI\s-1NOT\s0\fR propagated further. However, since they are returned from this function with their filename and line numbers intact, you can re-issue them yourself immediately after calling \&\f(CW\*(C`warnings(...)\*(C'\fR, if desired. .PP Note that \f(CW\*(C`use Test::Warnings \*(Aqwarnings\*(Aq\*(C'\fR will give you a \f(CW\*(C`warnings\*(C'\fR subroutine in your namespace (most likely \f(CW\*(C`main\*(C'\fR, if you're writing a test), so you (or things you load) can't subsequently do \f(CW\*(C`warnings\->import\*(C'\fR \*(-- it will result in the error: \*(L"Not enough arguments for Test::Warnings::warnings at ..., near \*(R"warnings\->import"". To work around this, either use the fully-qualified form (\f(CW\*(C`Test::warnings\*(C'\fR) or make your calls to the \f(CW\*(C`warnings\*(C'\fR package first. .ie n .SS """warning( { code } )""" .el .SS "\f(CWwarning( { code } )\fP" .IX Subsection "warning( { code } )" Same as \f(CW\*(C`warnings( { code } )\*(C'\fR, except a scalar is always returned \- the single warning produced, if there was one, or an arrayref otherwise \*(-- which can be more convenient to use than \f(CW\*(C`warnings()\*(C'\fR if you are expecting exactly one warning. .PP However, you are advised to capture the result from \f(CW\*(C`warning()\*(C'\fR into a temp variable so you can dump its value if it doesn't contain what you expect. e.g. with this test: .PP .Vb 5 \& like( \& warning { foo() }, \& qr/^this is a warning/, \& \*(Aqgot a warning from foo()\*(Aq, \& ); .Ve .PP if you get two warnings (or none) back instead of one, you'll get an arrayref, which will result in an unhelpful test failure message like: .PP .Vb 4 \& # Failed test \*(Aqgot a warning from foo()\*(Aq \& # at t/mytest.t line 10. \& # \*(AqARRAY(0xdeadbeef)\*(Aq \& # doesn\*(Aqt match \*(Aq(?^:^this is a warning)\*(Aq .Ve .PP So instead, change your test to: .PP .Vb 6 \& my $warning = warning { foo() }; \& like( \& $warning, \& qr/^this is a warning/, \& \*(Aqgot a warning from foo()\*(Aq, \& ) or diag \*(Aqgot warning(s): \*(Aq, explain($warning); .Ve .SS "allow_patterns" .IX Subsection "allow_patterns" .Vb 5 \& allow_patterns(qr/always allow this warning/); \& { \& my $temp = allow_patterns(qr/only allow in this scope/, qr/another temporary warning/); \& ... stuff ... \& } .Ve .PP Given one or more regular expressions, in \f(CW\*(C`qr/.../\*(C'\fR form, add them to the allow-list (warnings will be emitted with \f(CW\*(C`note\*(C'\fR rather than triggering the warning handler). If the return value is saved in a local variable, the warning exemption will only be in effect for that local scope (the addition is reversed at the end of the scope); otherwise, the effect is global. .SS "disallow_patterns" .IX Subsection "disallow_patterns" Given one or more regular expressions, in \f(CW\*(C`qr/.../\*(C'\fR form, remove it from the allow-list. The pattern must exactly match a pattern previously provided to \*(L"allow_patterns\*(R". .SH "IMPORT OPTIONS" .IX Header "IMPORT OPTIONS" .ie n .SS """:all""" .el .SS "\f(CW:all\fP" .IX Subsection ":all" Imports all functions listed above .ie n .SS """:no_end_test""" .el .SS "\f(CW:no_end_test\fP" .IX Subsection ":no_end_test" Disables the addition of a \f(CW\*(C`had_no_warnings\*(C'\fR test via \f(CW\*(C`END\*(C'\fR or \f(CW\*(C`done_testing\*(C'\fR .ie n .SS """:fail_on_warning""" .el .SS "\f(CW:fail_on_warning\fP" .IX Subsection ":fail_on_warning" When used, fail immediately when an unexempted warning is generated (as opposed to waiting until \&\*(L"had_no_warnings\*(R" or \f(CW\*(C`done_testing\*(C'\fR is called). .PP I recommend you only turn this option on when debugging a test, to see where a surprise warning is coming from, and rely on the end-of-tests check otherwise. .ie n .SS """:report_warnings""" .el .SS "\f(CW:report_warnings\fP" .IX Subsection ":report_warnings" When used, \f(CW\*(C`had_no_warnings()\*(C'\fR will print all the unexempted warning content, in case it had been suppressed earlier by other captures (such as \*(L"stderr_like\*(R" in Test::Output or \*(L"capture\*(R" in Capture::Tiny). .SH "OTHER OPTIONS" .IX Header "OTHER OPTIONS" You can temporarily turn off the failure behaviour of this module, swapping it out for reporting (see \f(CW\*(C`:report_warnings\*(C'\fR above) with: .PP .Vb 1 \& $ENV{PERL_TEST_WARNINGS_ONLY_REPORT_WARNINGS} = 1; .Ve .PP This can be useful for working around problematic modules that have warnings in newer Perl versions. .SH "CAVEATS" .IX Header "CAVEATS" Sometimes new warnings can appear in Perl that should \fBnot\fR block installation \*(-- for example, smartmatch was recently deprecated in perl 5.17.11, so now any distribution that uses smartmatch and also tests for warnings cannot be installed under 5.18.0. You might want to consider only making warnings fail tests in an author environment \*(-- you can do this with the if pragma: .PP .Vb 1 \& use if $ENV{AUTHOR_TESTING} || $ENV{RELEASE_TESTING}, \*(AqTest::Warnings\*(Aq; .Ve .PP In future versions of this module, when interfaces are added to test the content of warnings, there will likely be additional sugar available to indicate that warnings should be checked only in author tests (or \s-1TODO\s0 when not in author testing), but will still provide exported subs. Comments are enthusiastically solicited \- drop me an email, write up an \s-1RT\s0 ticket, or come by \f(CW\*(C`#perl\-qa\*(C'\fR on irc! .PP \&\fBAchtung!\fR This is not a great idea: .PP .Vb 4 \& sub warning_like(&$;$) { \& my ($code, $pattern, $name) = @_; \& like( &warning($code), $pattern, $name ); \& } \& \& warning_like( { ... }, qr/foo/, \*(Aqfoo appears in the warning\*(Aq ); .Ve .PP If the code in the \f(CW\*(C`{ ... }\*(C'\fR is going to warn with a stack trace with the arguments to each subroutine in its call stack (for example via \f(CW\*(C`Carp::cluck\*(C'\fR), the test name, \*(L"foo appears in the warning\*(R" will itself be matched by the regex (see \fIexamples/warning_like.t\fR). Instead, write this: .PP .Vb 1 \& like( warning { ... }, qr/foo/, \*(Aqfoo appears in the warning\*(Aq ); .Ve .SH "CAVEATS" .IX Header "CAVEATS" If you are using another module that sets its own warning handler (for example Devel::Confess or diagnostics) your results may be mixed, as those handlers will interfere with this module's ability to properly detect and capture warnings in their original form. .SH "TO DO (or: POSSIBLE FEATURES COMING IN FUTURE RELEASES)" .IX Header "TO DO (or: POSSIBLE FEATURES COMING IN FUTURE RELEASES)" .IP "\(bu" 4 \&\f(CW\*(C`allow_warnings(qr/.../)\*(C'\fR \- allow some warnings and not others .IP "\(bu" 4 more sophisticated handling in subtests \- if we save some state on the Test::Builder object itself, we can allow warnings in a subtest and then the state will revert when the subtest ends, as well as check for warnings at the end of every subtest via \f(CW\*(C`done_testing\*(C'\fR. .IP "\(bu" 4 sugar for making failures \s-1TODO\s0 when testing outside an author environment .SH "SEE ALSO" .IX Header "SEE ALSO" .IP "\(bu" 4 Test::NoWarnings .IP "\(bu" 4 Test::FailWarnings .IP "\(bu" 4 blogs.perl.org: \s-1YANWT\s0 (Yet Another No-Warnings Tester) <http://blogs.perl.org/users/ether/2013/03/yanwt-yet-another-no-warnings-tester.html> .IP "\(bu" 4 strictures \- which makes all warnings fatal in tests, hence lessening the need for special warning testing .IP "\(bu" 4 Test::Warn .IP "\(bu" 4 Test::Fatal .SH "SUPPORT" .IX Header "SUPPORT" Bugs may be submitted through the \s-1RT\s0 bug tracker <https://rt.cpan.org/Public/Dist/Display.html?Name=Test-Warnings> (or bug\-Test\-Warnings@rt.cpan.org <mailto:bug-Test-Warnings@rt.cpan.org>). .PP There is also a mailing list available for users of this distribution, at <http://lists.perl.org/list/perl\-qa.html>. .PP There is also an irc channel available for users of this distribution, at \&\f(CW\*(C`#perl\*(C'\fR on \f(CW\*(C`irc.perl.org\*(C'\fR <irc://irc.perl.org/#perl-qa>. .PP I am also usually active on irc, as 'ether' at \f(CW\*(C`irc.perl.org\*(C'\fR and \f(CW\*(C`irc.libera.chat\*(C'\fR. .SH "AUTHOR" .IX Header "AUTHOR" Karen Etheridge <ether@cpan.org> .SH "CONTRIBUTORS" .IX Header "CONTRIBUTORS" .IP "\(bu" 4 Graham Knop <haarg@haarg.org> .IP "\(bu" 4 A. Sinan Unur <nanis@cpan.org> .IP "\(bu" 4 Leon Timmermans <fawaka@gmail.com> .IP "\(bu" 4 Tina Mueller <cpan2@tinita.de> .SH "COPYRIGHT AND LICENCE" .IX Header "COPYRIGHT AND LICENCE" This software is copyright (c) 2013 by Karen Etheridge. .PP This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.