Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Pygments / examplefiles / output / twig_test
Size: Mime:
€]q(cpygments.token
_TokenType
qXOtherq…q…qq}q(Xsubtypesqcbuiltins
set
q]q	…q
RqXparentqh)…q
q}q(hh]q(hXEscapeq…q…qq}q(hh]q…qRqhhubhXOperatorq…q…qq}q(hh]q(hhXDBSq†q …q!q"}q#(hh]q$…q%Rq&hhubhhXWordq'†q(…q)q*}q+(hh]q,…q-Rq.hhube…q/Rq0hhh'h*hh"ubhXNameq1…q2…q3q4}q5(hh]q6(hh1XTagq7†q8…q9q:}q;(hh]q<…q=Rq>hh4ubhh1XEntityq?†q@…qAqB}qC(hh]qDhh1h?h‡qE…qFqG}qH(hh]qI…qJRqKhhBuba…qLRqMhh4hhGubhh1X	ExceptionqN†qO…qPqQ}qR(hh]qS…qTRqUhh4ubhh1X	DecoratorqV†qW…qXqY}qZ(hh]q[…q\Rq]hh4ubhh1XClassq^†q_…q`qa}qb(hh]qc(hh1h^h‡qd…qeqf}qg(hh]qh…qiRqjhhaubhh1h^XStartqk‡ql…qmqn}qo(hh]qp…qqRqrhhaube…qsRqthh4hkhnhhfubhh1XVariablequ†qv…qwqx}qy(hh]qz(hh1huX	Anonymousq{‡q|…q}q~}q(hh]q€…qRq‚hhxubhh1huh^‡qƒ…q„q…}q†(hh]q‡…qˆRq‰hhxubhh1huXMagicqЇq‹…qŒq}qŽ(hh]q…qRq‘hhxubhh1huXGlobalq’‡q“…q”q•}q–(hh]q—…q˜Rq™hhxubhh1huXInstanceqš‡q›…qœq}qž(hh]qŸ…q Rq¡hhxube…q¢Rq£hh4h^h…h’h•hšhhŠhh{h~ubhh1X	Attributeq¤†q¥…q¦q§}q¨(hh]q©hh1h¤hu‡qª…q«q¬}q­(hh]q®…q¯Rq°hh§uba…q±Rq²hh4huh¬ubhh1X	Namespaceq³†q´…qµq¶}q·(hh]q¸…q¹Rqºhh4ubhh1XPropertyq»†q¼…q½q¾}q¿(hh]qqÁRqÂhh4ubhh1XSymbolqÆqąqŁqÆ}qÇ(hh]qȅqÉRqÊhh4ubhh1XClassesqˆq̅q́qÎ}qÏ(hh]qЅqÑRqÒhh4ubhh1XPseudoqӆqԅqՁqÖ}q×(hh]q؅qÙRqÚhh4ubhh1XLabelqۆq܅q݁qÞ}qß(hh]qà…qáRqâhh4ubhh1h†qã…qäqå}qæ(hh]qç…qèRqéhh4ubhh1XBuiltinqê†që…qìqí}qî(hh]qï(hh1hêhӇqð…qñqò}qó(hh]qô…qõRqöhhíubhh1hêXTypeq÷‡qø…qùqú}qû(hh]qü…qýRqþhhíube…qÿRrhh4hÓhòh÷húubhh1XFieldr†r…rr}r(hh]r…rRrhh4ubhh1h†r	…r
r}r(hh]r
hh1hXMemberr‡r…rr}r(hh]r…rRrhjuba…rRrhh4jjubhh1XFunctionr†r…rr}r(hh]rhh1jhЇr…rr }r!(hh]r"…r#Rr$hjuba…r%Rr&hh4hŠj ubhh1h÷†r'…r(r)}r*(hh]r+…r,Rr-hh4ubhh1XConstantr.†r/…r0r1}r2(hh]r3…r4Rr5hh4ube…r6Rr7hhh¤h§hêhíh^haj.j1hVhYh?hBhNhQjjh»h¾hÛhÞh³h¶hjh7h:huhxjjhÃhÆhÓhÖhhåhËhÎh÷j)ubhXLiteralr8…r9…r:r;}r<(hh]r=(hj8h†r>…r?r@}rA(hh]rB…rCRrDhj;ubhj8XCharrE†rF…rGrH}rI(hh]rJ…rKRrLhj;ubhj8XDaterM†rN…rOrP}rQ(hh]rR…rSRrThj;ubhj8XScalarrU†rV…rWrX}rY(hh]rZhj8jUXPlainr[‡r\…r]r^}r_(hh]r`…raRrbhjXuba…rcRrdhj;j[j^ubhj8XStringre†rf…rgrh}ri(hh]rj(hj8jeXInterpolrk‡rl…rmrn}ro(hh]rp…rqRrrhjhubhj8jeX	Delimeterrs‡rt…rurv}rw(hh]rx…ryRrzhjhubhj8jejE‡r{…r|r}}r~(hh]r…r€Rrhjhubhj8jehÇr‚…rƒr„}r…(hh]r†…r‡Rrˆhjhubhj8jeXSingler‰‡rŠ…r‹rŒ}r(hh]rŽ…rRrhjhubhj8jeh‡r‘…r’r“}r”(hh]r•…r–Rr—hjhubhj8jeXBacktickr˜‡r™…ršr›}rœ(hh]r…ržRrŸhjhubhj8jeh‡r …r¡r¢}r£(hh]r¤…r¥Rr¦hjhubhj8jeXRegexr§‡r¨…r©rª}r«(hh]r¬…r­Rr®hjhubhj8jeXMomentr¯‡r°…r±r²}r³(hh]r´…rµRr¶hjhubhj8jeXBooleanr·‡r¸…r¹rº}r»(hh]r¼…r½Rr¾hjhubhj8jeX	Characterr¿‡rÀ…rÁrÂ}rÃ(hh]rÄ…rÅRrÆhjhubhj8jeX	DelimiterrLJrÈ…rɁrÊ}rË(hh]rÌ…rÍRrÎhjhubhj8jeXDocrχrÐ…rсrÒ}rÓ(hh]rÔ…rÕRrÖhjhubhj8jeh1‡r×…r؁rÙ}rÚ(hh]rÛ…rÜRrÝhjhubhj8jeXAffixrÞ‡rß…ràrá}râ(hh]rã…räRråhjhubhj8jeXHeredocræ‡rç…rèré}rê(hh]rë…rìRríhjhubhj8jeXDoublerî‡rï…rðrñ}rò(hh]ró…rôRrõhjhubhj8jeXInterprö‡r÷…rørù}rú(hh]rû…rüRrýhjhubhj8jeXAtomrþ‡rÿ…rr}r(hh]r…rRrhjhube…rRrhj;jÞjáj˜j›jEj}jÇjÊjÏjÒjîjñhj¢jæjéjkjnhj“j§jªj‰jŒhÃj„j¿jÂj¯j²jöjùj·jºjsjvjþjh1jÙubhj8XNumberr†r	…r
r}r(hh]r
(hj8jXFloatr‡r…rr}r(hh]r…rRrhjubhj8jXDecr‡r…rr}r(hh]r…rRrhjubhj8jXRadixr‡r…r r!}r"(hh]r#…r$Rr%hjubhj8jXOctr&‡r'…r(r)}r*(hh]r+…r,Rr-hjubhj8jXBinr.‡r/…r0r1}r2(hh]r3…r4Rr5hjubhj8jh¤‡r6…r7r8}r9(hh]r:…r;Rr<hjubhj8jXHexr=‡r>…r?r@}rA(hh]rB…rCRrDhjubhj8jXIntegerrE‡rF…rGrH}rI(hh]rJh(j8jjEXLongrKtrL…rMrN}rO(hh]rP…rQRrRhjHuba…rSRrThjjKjNubhj8jXDecimalrU‡rV…rWrX}rY(hh]rZ…r[Rr\hjube…r]Rr^hj;j.j1jjj=j@jEjHj&j)jj!h¤j8jUjXjjube…r_Rr`hhjejhjjjMjPjUjXhj@jEjHubhXGenericra…rb…rcrd}re(hh]rf(hjaXErrorrg†rh…rirj}rk(hh]rl…rmRrnhjdubhjaX
Subheadingro†rp…rqrr}rs(hh]rt…ruRrvhjdubhjaX	Tracebackrw†rx…ryrz}r{(hh]r|…r}Rr~hjdubhjaXOutputr†r€…rr‚}rƒ(hh]r„…r…Rr†hjdubhjaXPromptr‡†rˆ…r‰rŠ}r‹(hh]rŒ…rRrŽhjdubhjaXDeletedr†r…r‘r’}r“(hh]r”…r•Rr–hjdubhjaXInsertedr—†r˜…r™rš}r›(hh]rœ…rRržhjdubhjaXHeadingrŸ†r …r¡r¢}r£(hh]r¤…r¥Rr¦hjdubhjaXStrongr§†r¨…r©rª}r«(hh]r¬…r­Rr®hjdubhjaXEmphr¯†r°…r±r²}r³(hh]r´…rµRr¶hjdube…r·Rr¸hhjj’j¯j²jgjjjŸj¢j—jšjj‚j‡jŠj§jªjojrjwjzubhjg…r¹…rºr»}r¼(hh]r½…r¾Rr¿hhubhXKeywordrÀ…rÁ…rrÃ}rÄ(hh]rÅ(hjÀh'†rÆ…rǁrÈ}rÉ(hh]rÊ…rËRrÌhjÃubhjÀjÀ†rÍ…r΁rÏ}rÐ(hh]rÑ…rÒRrÓhjÃubhjÀh÷†rÔ…rՁrÖ}r×(hh]rØ…rÙRrÚhjÃubhjÀXPreProcrÛ†rÜ…r݁rÞ}rß(hh]rà…ráRrâhjÃubhjÀXControlrã†rä…råræ}rç(hh]rè…réRrêhjÃubhjÀj.†rë…rìrí}rî(hh]rï…rðRrñhjÃubhjÀh³†rò…rórô}rõ(hh]rö…r÷RrøhjÃubhjÀhӆrù…rúrû}rü(hh]rý…rþRrÿhjÃubhjÀXDeclarationr†r…rr}r(hh]r…rRrhjÃubhjÀXReservedr†r	…r
r}r(hh]r
…rRrhjÃube…rRrhhj.jíjjh³jôhÓjûjjh÷jÖjãjæjÀjÏjÛjÞh'jÈubhhXTextr…r…rr}r(hh]r(hjXRootr†r…rr}r(hh]r…rRrhjubhjhÆr …r!r"}r#(hh]r$…r%Rr&hjubhjXRagr'†r(…r)r*}r+(hh]r,…r-Rr.hjubhjX
Whitespacer/†r0…r1r2}r3(hh]r4…r5Rr6hjubhjXBeerr7†r8…r9r:}r;(hh]r<…r=Rr>hjubhjXPunctuationr?†r@…rArB}rC(hh]rD…rERrFhjube…rGRrHhhj/j2hÃj"j?jBjjj7j:j'j*ubhXCommentrI…rJ…rKrL}rM(hh]rN(hjIXPreprocrO†rP…rQrR}rS(hh]rT…rURrVhjLubhjIXMultirW†rX…rYrZ}r[(hh]r\…r]Rr^hjLubhjIXHashbangr_†r`…rarb}rc(hh]rd…reRrfhjLubhjIj‰†rg…rhri}rj(hh]rk…rlRrmhjLubhjIX
SingleLinern†ro…rprq}rr(hh]rs…rtRruhjLubhjIjφrv…rwrx}ry(hh]rz…r{Rr|hjLubhjIX	Directiver}†r~…rr€}r(hh]r‚…rƒRr„hjLubhjIX	Multiliner…†r†…r‡rˆ}r‰(hh]rŠ…r‹RrŒhjLubhjIX
Singleliner†rŽ…rr}r‘(hh]r’…r“Rr”hjLubhjIXPreprocFiler•†r–…r—r˜}r™(hh]rš…r›RrœhjLubhjIXSpecialr†rž…rŸr }r¡(hh]r¢…r£Rr¤hjLube…r¥Rr¦hhj_jbj…jˆjOjRj•j˜j‰jijj j}j€jnjqjÏjxjWjZjjubhj?…r§…r¨r©}rª(hh]r«hj?X	Indicatorr¬†r­…r®r¯}r°(hh]r±…r²Rr³hj©uba…r´Rrµhhj¬j¯ube…r¶Rr·jjhhjgj»hhjÀjÃh1h4j8j;j?j©hhjIjLjajdXTokenr¸hjejhjjububXŒFrom the Twig test suite, https://github.com/fabpot/Twig, available under BSD license.

--TEST--
Exception for an unclosed tag
--TEMPLATE--
r¹†rºjRX{%r»†r¼jX r½†r¾jÃXblockr¿†rÀjj½†rÁhxXfoor†rÃjj½†rÄjRX%}rņrÆhX
     rdžrÈjRX{%rɆrÊjj½†rËjÃXifr̆rÍjj½†rÎhxXfoorφrÐjj½†rÑjRX%}rÒ†rÓhX




         rÔ†rÕjRX{%rÖ†r×jj½†rØjÃXforrÙ†rÚjj½†rÛhxXir܆rÝjj½†rÞjÃXinr߆ràjj½†ráhxXforâ†rãjj½†räjRX%}rå†ræhX




         rç†rèjRX{%ré†rêjj½†rëjÃXendforrì†ríjj½†rîjRX%}rï†rðhX



rñ†ròjRX{%ró†rôjj½†rõjÃXendblockrö†r÷jj½†røjRX%}rù†rúhXÐ
--EXCEPTION--
Twig_Error_Syntax: Unexpected tag name "endblock" (expecting closing tag for the "if" tag defined near line 4) in "index.twig" at line 16
--TEST--
Exception for an undefined trait
--TEMPLATE--
rû†rüjRX{%rý†rþjj½†rÿjÃXuser†rjj½†rjŒX'foo'r†rjj½†rhxXwithr†rjj½†rhxXfoobarr	†r
jj½†rhxXasr†r
jj½†rhxXbarr†rjj½†rjRX%}r†rhX
--TEMPLATE(foo)--
r†rjRX{%r†rjj½†rjÃXblockr†rjj½†rhxXbarr†rjj½†rjRX%}r†r hX
r!†r"jRX{%r#†r$jj½†r%jÃXendblockr&†r'jj½†r(jRX%}r)†r*hX’
--EXCEPTION--
Twig_Error_Runtime: Block "foobar" is not defined in trait "foo" in "index.twig".
--TEST--
Twig supports method calls
--TEMPLATE--
r+†r,jRX{{r-†r.jj½†r/hxXitemsr0†r1hxX.foor2†r3jj½†r4jRX}}r5†r6hj!†r7jRX{{r8†r9jj½†r:hxXitemsr;†r<hX[r=†r>jŒX'foo'r?†r@hX]rA†rBjj½†rCjRX}}rD†rEhj!†rFjRX{{rG†rHjj½†rIhxXitemsrJ†rKhj=†rLhxXfoorM†rNhjA†rOjj½†rPjRX}}rQ†rRhj!†rSjRX{{rT†rUjj½†rVhxXitemsrW†rXhj=†rYhxXitemsrZ†r[hj=†r\hxXfoor]†r^hjA†r_hjA†r`jj½†rajRX}}rb†rchX§
--DATA--
return array('foo' => 'bar', 'items' => array('foo' => 'bar', 'bar' => 'foo'))
--EXPECT--
bar
bar
foo
bar
--TEST--
Twig supports array notation
--TEMPLATE--
rd†rejLX{# empty array #}rf†rghj!†rhjRX{{ri†rjjj½†rkhj=†rlhjA†rmhX|rn†rojXjoinrp†rqhX(rr†rsjŒX','rt†ruhX)rv†rwjj½†rxjRX}}ry†rzhX

r{†r|jRX{{r}†r~jj½†rhj=†r€jX1r†r‚hX,rƒ†r„jj½†r…jX2r††r‡hjA†rˆhjn†r‰jXjoinrІr‹hjr†rŒjŒX','r†rŽhjv†rjj½†rjRX}}r‘†r’hj!†r“jRX{{r”†r•jj½†r–hj=†r—jŒX'foo'r˜†r™hjƒ†ršjj½†r›jñX"bar"rœ†rhjA†ržhjn†rŸjXjoinr †r¡hjr†r¢jŒX','r£†r¤hjv†r¥jj½†r¦jRX}}r§†r¨hj!†r©jRX{{rª†r«jj½†r¬hX{r­†r®jX0r¯†r°hX:r±†r²jj½†r³jj†r´hjƒ†rµjj½†r¶jŒX'foo'r·†r¸hj±†r¹jj½†rºjŒX'bar'r»†r¼hX}r½†r¾hjn†r¿jXjoinrÀ†rÁhjr†rÂjŒX','rÆrÄhjv†rÅjj½†rÆjRX}}rdžrÈhj!†rÉjRX{{rʆrËjj½†rÌhj­†rÍjj¯†rÎhj±†rÏjj½†rÐjj†rÑhjƒ†rÒjj½†rÓjŒX'foo'rÔ†rÕhj±†rÖjj½†r×jŒX'bar'r؆rÙhj½†rÚhjn†rÛjXkeysr܆rÝhjn†rÞjXjoinr߆ràhjr†rájŒX','râ†rãhjv†räjj½†råjRX}}ræ†rçhX

rè†réjRX{{rê†rëjj½†rìhj­†ríjj¯†rîhj±†rïjj½†rðjj†rñhjƒ†ròjj½†róhxXfoorô†rõhj±†röjj½†r÷jŒX'bar'rø†rùhj½†rúhjn†rûjXjoinrü†rýhjr†rþjŒX','rÿ†rhjv†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rhj­†r	jj¯†r
hj±†rjj½†rjj†r
hjƒ†rjj½†rhxXfoor†rhj±†rjj½†rjŒX'bar'r†rhj½†rhjn†rjXkeysr†rhjn†rjXjoinr†rhjr†rjŒX','r†rhjv†r jj½†r!jRX}}r"†r#hX

r$†r%jLX{# nested arrays #}r&†r'hj!†r(jRX{%r)†r*jj½†r+jÃXsetr,†r-jj½†r.hxXar/†r0jj½†r1hX=r2†r3jj½†r4hj=†r5jj†r6hjƒ†r7jj½†r8jj††r9hjƒ†r:jj½†r;hj=†r<jj†r=hjƒ†r>jj½†r?jj††r@hjA†rAhjƒ†rBjj½†rChj­†rDjŒX'foo'rE†rFhj±†rGjj½†rHhj­†rIjŒX'foo'rJ†rKhj±†rLjj½†rMjŒX'bar'rN†rOhj½†rPhj½†rQhjA†rRjj½†rSjRX%}rT†rUhj!†rVjRX{{rW†rXjj½†rYhxj/†rZhj=†r[jj††r\hjA†r]hjn†r^jXjoinr_†r`hjr†rajŒX','rb†rchjv†rdjj½†rejRX}}rf†rghj!†rhjRX{{ri†rjjj½†rkhxj/†rlhj=†rmjX3rn†rohjA†rphj=†rqjñX"foo"rr†rshjA†rthjn†rujXjoinrv†rwhjr†rxjŒX','ry†rzhjv†r{jj½†r|jRX}}r}†r~hX

r†r€jLX/{# works even if [] is used inside the array #}r†r‚hj!†rƒjRX{{r„†r…jj½†r†hj=†r‡hxXfoorˆ†r‰hj=†rŠhxXbarr‹†rŒhjA†rhjA†rŽhjn†rjXjoinr†r‘hjr†r’jŒX','r“†r”hjv†r•jj½†r–jRX}}r—†r˜hX

r™†ršjLX${# elements can be any expression #}r›†rœhj!†rjRX{{rž†rŸjj½†r hj=†r¡jŒX'foo'r¢†r£hjn†r¤jXupperr¥†r¦hjƒ†r§jj½†r¨hxXbarr©†rªhjn†r«jXupperr¬†r­hjƒ†r®jj½†r¯hxXbarr°†r±jj½†r²hX==r³†r´jj½†rµhxXfoor¶†r·hjA†r¸hjn†r¹jXjoinrº†r»hjr†r¼jŒX','r½†r¾hjv†r¿jj½†rÀjRX}}rÁ†rÂhX

rÆrÄjLX.{# arrays can have a trailing , like in PHP #}rņrÆhj!†rÇjRX{{rȆrÉjX
  rʆrËhj=†rÌjX
    r͆rÎjj†rÏhjƒ†rÐjX
    rцrÒjj††rÓhjƒ†rÔjX
  rÕ†rÖhjA†r×hjn†rØjXjoinrÙ†rÚhjr†rÛjŒX','r܆rÝhjv†rÞjj!†rßjRX}}rà†ráhX

râ†rãjLX {# keys can be any expression #}rä†råhj!†ræjRX{%rç†rèjj½†réjÃXsetrê†rëjj½†rìhxj/†ríjj½†rîhj2†rïjj½†rðjj†rñjj½†ròjRX%}ró†rôhj!†rõjRX{%rö†r÷jj½†røjÃXsetrù†rújj½†rûhxXbrü†rýjj½†rþhj2†rÿjj½†rjñX"foo"r†rjj½†rjRX%}r†rhj!†rjRX{%r†rjj½†r	jÃXsetr
†rjj½†rhxXaryr
†rjj½†rhj2†rjj½†rhj­†rjj½†rhjr†rhxj/†rhjv†rhj±†rjj½†rjŒX'a'r†rhjƒ†rjj½†rhjr†rhxjü†rhjv†rhj±†r jj½†r!jŒX'b'r"†r#hjƒ†r$jj½†r%jŒX'c'r&†r'hj±†r(jj½†r)jŒX'c'r*†r+hjƒ†r,jj½†r-hjr†r.hxj/†r/jj½†r0hX~r1†r2jj½†r3hxjü†r4hjv†r5hj±†r6jj½†r7jŒX'd'r8†r9jj½†r:hj½†r;jj½†r<jRX%}r=†r>hj!†r?jRX{{r@†rAjj½†rBhxXaryrC†rDhjn†rEjXkeysrF†rGhjn†rHjXjoinrI†rJhjr†rKjŒX','rL†rMhjv†rNjj½†rOjRX}}rP†rQhj!†rRjRX{{rS†rTjj½†rUhxXaryrV†rWhjn†rXjXjoinrY†rZhjr†r[jŒX','r\†r]hjv†r^jj½†r_jRX}}r`†rahXü
--DATA--
return array('bar' => 'bar', 'foo' => array('bar' => 'bar'))
--EXPECT--
1,2
foo,bar
1,bar
0,foo

1,bar
0,foo

1,2
bar

bar

FOO,BAR,

1,2

1,foo,c,1foo
a,b,c,d
--TEST--
Twig supports binary operations (+, -, *, /, ~, %, and, or)
--TEMPLATE--
rb†rcjRX{{rd†rejj½†rfjj†rgjj½†rhhX+ri†rjjj½†rkjj†rljj½†rmjRX}}rn†rohj!†rpjRX{{rq†rrjj½†rsjj††rtjj½†ruhX-rv†rwjj½†rxjj†ryjj½†rzjRX}}r{†r|hj!†r}jRX{{r~†rjj½†r€jj††rjj½†r‚hX*rƒ†r„jj½†r…jj††r†jj½†r‡jRX}}rˆ†r‰hj!†rŠjRX{{r‹†rŒjj½†rjj††rŽjj½†rhX/r†r‘jj½†r’jj††r“jj½†r”jRX}}r•†r–hj!†r—jRX{{r˜†r™jj½†ršjjn†r›jj½†rœhX%r†ržjj½†rŸjj††r jj½†r¡jRX}}r¢†r£hj!†r¤jRX{{r¥†r¦jj½†r§jj†r¨jj½†r©jÃXandrª†r«jj½†r¬jj†r­jj½†r®jRX}}r¯†r°hj!†r±jRX{{r²†r³jj½†r´jj†rµjj½†r¶jÃXandr·†r¸jj½†r¹jj¯†rºjj½†r»jRX}}r¼†r½hj!†r¾jRX{{r¿†rÀjj½†rÁjj¯†rÂjj½†rÃjÃXandrĆrÅjj½†rÆjj†rÇjj½†rÈjRX}}rɆrÊhj!†rËjRX{{r̆rÍjj½†rÎjj¯†rÏjj½†rÐjÃXandrцrÒjj½†rÓjj¯†rÔjj½†rÕjRX}}rÖ†r×hj!†rØjRX{{rÙ†rÚjj½†rÛjj†rÜjj½†rÝjÃXorrÞ†rßjj½†ràjj†rájj½†râjRX}}rã†rähj!†råjRX{{ræ†rçjj½†rèjj†réjj½†rêjÃXorrë†rìjj½†ríjj¯†rîjj½†rïjRX}}rð†rñhj!†ròjRX{{ró†rôjj½†rõjj¯†röjj½†r÷jÃXorrø†rùjj½†rújj†rûjj½†rüjRX}}rý†rþhj!†rÿjRX{{r†rjj½†rjj¯†rjj½†rjÃXorr†rjj½†rjj¯†rjj½†r	jRX}}r
†rhj!†rjRX{{r
†rjj½†rjj¯†rjj½†rjÃXorr†rjj½†rjj†rjj½†rjÃXandr†rjj½†rjj¯†rjj½†rjRX}}r†rhj!†rjRX{{r†r jj½†r!jj†r"jj½†r#jÃXorr$†r%jj½†r&jj¯†r'jj½†r(jÃXandr)†r*jj½†r+jj†r,jj½†r-jRX}}r.†r/hj!†r0jRX{{r1†r2jj½†r3jñX"foo"r4†r5jj½†r6hj1†r7jj½†r8jñX"bar"r9†r:jj½†r;jRX}}r<†r=hj!†r>jRX{{r?†r@jj½†rAhxXfoorB†rCjj½†rDhj1†rEjj½†rFjñX"bar"rG†rHjj½†rIjRX}}rJ†rKhj!†rLjRX{{rM†rNjj½†rOjñX"foo"rP†rQjj½†rRhj1†rSjj½†rThxXbarrU†rVjj½†rWjRX}}rX†rYhj!†rZjRX{{r[†r\jj½†r]hxXfoor^†r_jj½†r`hj1†rajj½†rbhxXbarrc†rdjj½†rejRX}}rf†rghj!†rhjRX{{ri†rjjj½†rkjj††rljj¯†rmjj½†rnhj†rohj†rpjj½†rqjX7rr†rsjj½†rtjRX}}ru†rvhX°
--DATA--
return array('foo' => 'bar', 'bar' => 'foo')
--EXPECT--
2
1
4
1
1
1



1
1
1


1
foobar
barbar
foofoo
barfoo
2
--TEST--
Twig supports bitwise operations
--TEMPLATE--
rw†rxjRX{{ry†rzjj½†r{jj†r|jj½†r}jÃXb-andr~†rjj½†r€jX5r†r‚jj½†rƒjRX}}r„†r…hj!†r†jRX{{r‡†rˆjj½†r‰jj†rŠjj½†r‹jÃXb-orrŒ†rjj½†rŽjj†rjj½†rjRX}}r‘†r’hj!†r“jRX{{r”†r•jj½†r–jj†r—jj½†r˜jÃXb-xorr™†ršjj½†r›jj†rœjj½†rjRX}}rž†rŸhj!†r jRX{{r¡†r¢jj½†r£hjr†r¤jj†r¥jj½†r¦jÃXandr§†r¨jj½†r©jj¯†rªjj½†r«jÃXb-orr¬†r­jj½†r®jj¯†r¯hjv†r°jj½†r±jÃXisr²†r³jj½†r´jXsamerµ†r¶jj½†r·hxXasr¸†r¹hjr†rºjj†r»jj½†r¼jÃXandr½†r¾jj½†r¿hjr†rÀjj¯†rÁjj½†rÂjÃXb-orrÆrÄjj½†rÅjj¯†rÆhjv†rÇhjv†rÈjj½†rÉhX?rʆrËjj½†rÌjŒX'ok'r͆rÎjj½†rÏhj±†rÐjj½†rÑjŒX'ko'rÒ†rÓjj½†rÔjRX}}rÕ†rÖhX}
--DATA--
return array()
--EXPECT--
1
5
4
ok
--TEST--
Twig supports comparison operators (==, !=, <, >, >=, <=)
--TEMPLATE--
r׆rØjRX{{rÙ†rÚjj½†rÛjj†rÜjj½†rÝhX>rÞ†rßjj½†ràjj††rájj½†râjRX}}rã†rähj†råjRX{{ræ†rçjj½†rèjj†réjj½†rêhjÞ†rëjj½†rìjj†ríjj½†rîjRX}}rï†rðhj†rñjRX{{rò†rójj½†rôjj†rõjj½†röhX>=r÷†røjj½†rùjj††rújj½†rûjRX}}rü†rýhj†rþjRX{{rÿ†rjj½†rjj†rjj½†rhX>=r†rjj½†rjj†rjj½†rjRX}}r	†r
hj!†rjRX{{r†r
jj½†rjj†rjj½†rhX<r†rjj½†rjj††rjj½†rjRX}}r†rhj†rjRX{{r†rjj½†rjj†rjj½†rhj†rjj½†rjj†r jj½†r!jRX}}r"†r#hj†r$jRX{{r%†r&jj½†r'jj†r(jj½†r)hX<=r*†r+jj½†r,jj††r-jj½†r.jRX}}r/†r0hj†r1jRX{{r2†r3jj½†r4jj†r5jj½†r6hX<=r7†r8jj½†r9jj†r:jj½†r;jRX}}r<†r=hj!†r>jRX{{r?†r@jj½†rAjj†rBjj½†rChX==rD†rEjj½†rFjj†rGjj½†rHjRX}}rI†rJhj†rKjRX{{rL†rMjj½†rNjj†rOjj½†rPhX==rQ†rRjj½†rSjj††rTjj½†rUjRX}}rV†rWhj!†rXjRX{{rY†rZjj½†r[jj†r\jj½†r]hX!=r^†r_jj½†r`jj†rajj½†rbjRX}}rc†rdhj†rejRX{{rf†rgjj½†rhjj†rijj½†rjhX!=rk†rljj½†rmjj††rnjj½†rojRX}}rp†rqhXv
--DATA--
return array()
--EXPECT--
///1
1//1/1
1/
/1
--TEST--
Twig supports the "divisible by" operator
--TEMPLATE--
rr†rsjRX{{rt†rujj½†rvjX8rw†rxjj½†ryjÃXisrz†r{jj½†r|jX	divisibler}†r~jj½†rhxXbyr€†rhjr†r‚jj††rƒhjv†r„jj½†r…hjʆr†jj½†r‡jŒX'OK'rˆ†r‰jj½†rŠjRX}}r‹†rŒhj!†rjRX{{rކrjj½†rjjw†r‘jj½†r’jÃXisr“†r”jj½†r•jÃXnotr–†r—jj½†r˜jX	divisibler™†ršjj½†r›hxXbyrœ†rhjr†ržjjn†rŸhjv†r jj½†r¡hjʆr¢jj½†r£jŒX'OK'r¤†r¥jj½†r¦jRX}}r§†r¨hj!†r©jRX{{rª†r«jj½†r¬jjw†r­jj½†r®jÃXisr¯†r°jX    r±†r²jX	divisibler³†r´jX   rµ†r¶hxXbyr·†r¸jX   r¹†rºhjr†r»jj††r¼hjv†r½jj½†r¾hjʆr¿jj½†rÀjŒX'OK'rÁ†rÂjj½†rÃjRX}}rĆrÅhj!†rÆjRX{{rdžrÈjj½†rÉjjw†rÊjj½†rËjÃXisr̆rÍjj½†rÎjÃXnotrφrÐjX
   rцrÒjX	divisiblerÓ†rÔjX
   rÕ†rÖhxXbyr׆rØjX
   rÙ†rÚhjr†rÛjjn†rÜhjv†rÝjj½†rÞhjʆrßjj½†ràjŒX'OK'rá†râjj½†rãjRX}}rä†råhXd
--DATA--
return array()
--EXPECT--
OK
OK
OK
OK
--TEST--
Twig supports the .. operator
--TEMPLATE--
ræ†rçjRX{%rè†réjj½†rêjÃXforrë†rìjj½†ríhxj܆rîjj½†rïjÃXinrð†rñjj½†ròjX0.ró†rôjX.10rõ†röjj½†r÷jRX%}rø†rùjRX{{rú†rûjj½†rühxj܆rýjj½†rþjRX}}rÿ†r	hj½†r	jRX{%r	†r	jj½†r	jÃXendforr	†r	jj½†r	jRX%}r	†r		hX

r
	†r	jRX{%r	†r
	jj½†r	jÃXforr	†r	jj½†r	hxXletterr	†r	jj½†r	jÃXinr	†r	jj½†r	jŒX'a'r	†r	e(hX..r	†r	jŒX'z'r	†r	jj½†r	jRX%}r	†r 	jRX{{r!	†r"	jj½†r#	hxXletterr$	†r%	jj½†r&	jRX}}r'	†r(	hj½†r)	jRX{%r*	†r+	jj½†r,	jÃXendforr-	†r.	jj½†r/	jRX%}r0	†r1	hX

r2	†r3	jRX{%r4	†r5	jj½†r6	jÃXforr7	†r8	jj½†r9	hxXletterr:	†r;	jj½†r<	jÃXinr=	†r>	jj½†r?	jŒX'a'r@	†rA	hjn†rB	jXupperrC	†rD	hX..rE	†rF	jŒX'z'rG	†rH	hjn†rI	jXupperrJ	†rK	jj½†rL	jRX%}rM	†rN	jRX{{rO	†rP	jj½†rQ	hxXletterrR	†rS	jj½†rT	jRX}}rU	†rV	hj½†rW	jRX{%rX	†rY	jj½†rZ	jÃXendforr[	†r\	jj½†r]	jRX%}r^	†r_	hX

r`	†ra	jRX{%rb	†rc	jj½†rd	jÃXforre	†rf	jj½†rg	hxj܆rh	jj½†ri	jÃXinrj	†rk	jj½†rl	hxXfoorm	†rn	hj=†ro	jj¯†rp	hjA†rq	hX..rr	†rs	hxXfoort	†ru	hj=†rv	jj†rw	hjA†rx	jj½†ry	jRX%}rz	†r{	jRX{{r|	†r}	jj½†r~	hxj܆r	jj½†r€	jRX}}r	†r‚	hj½†rƒ	jRX{%r„	†r…	jj½†r†	jÃXendforr‡	†rˆ	jj½†r‰	jRX%}rŠ	†r‹	hX

rŒ	†r	jRX{%rŽ	†r	jj½†r	jÃXforr‘	†r’	jj½†r“	hxj܆r”	jj½†r•	jÃXinr–	†r—	jj½†r˜	jj¯†r™	jj½†rš	hji†r›	jj½†rœ	jj†r	jj½†rž	hX..rŸ	†r 	jj½†r¡	jj†r¢	jj¯†r£	jj½†r¤	hjv†r¥	jj½†r¦	jj†r§	jj½†r¨	jRX%}r©	†rª	jRX{{r«	†r¬	jj½†r­	hxj܆r®	jj½†r¯	jRX}}r°	†r±	hj½†r²	jRX{%r³	†r´	jj½†rµ	jÃXendforr¶	†r·	jj½†r¸	jRX%}r¹	†rº	hX 
--DATA--
return array('foo' => array(1, 10))
--EXPECT--
0 1 2 3 4 5 6 7 8 9 10 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9
--TEST--
Twig supports the "ends with" operator
--TEMPLATE--
r»	†r¼	jRX{{r½	†r¾	jj½†r¿	jŒX'foo'rÀ	†rÁ	jj½†rÂ	jÃX	ends withrÃ	†rÄ	jj½†rÅ	jŒX'o'rÆ	†rÇ	jj½†rÈ	hjʆrÉ	jj½†rÊ	jŒX'OK'rË	†rÌ	jj½†rÍ	hj±†rÎ	jj½†rÏ	jŒX'KO'rÐ	†rÑ	jj½†rÒ	jRX}}rÓ	†rÔ	hj!†rÕ	jRX{{rÖ	†r×	jj½†rØ	jÃXnotrÙ	†rÚ	jj½†rÛ	hjr†rÜ	jŒX'foo'rÝ	†rÞ	jj½†rß	jÃX	ends withrà	†rá	jj½†râ	jŒX'f'rã	†rä	hjv†rå	jj½†ræ	hjʆrç	jj½†rè	jŒX'OK'ré	†rê	jj½†rë	hj±†rì	jj½†rí	jŒX'KO'rî	†rï	jj½†rð	jRX}}rñ	†rò	hj!†ró	jRX{{rô	†rõ	jj½†rö	jÃXnotr÷	†rø	jj½†rù	hjr†rú	jŒX'foo'rû	†rü	jj½†rý	jÃX	ends withrþ	†rÿ	jj½†r
jŒX'foowaytoolong'r
†r
hjv†r
jj½†r
hjʆr
jj½†r
jŒX'OK'r
†r
jj½†r	
hj±†r

jj½†r
jŒX'KO'r
†r
jj½†r
jRX}}r
†r
hj!†r
jRX{{r
†r
jj½†r
jŒX'foo'r
†r
jj½†r
jÃX	ends withr
†r
jj½†r
jŒX''r
†r
jj½†r
hjʆr
jj½†r
jŒX'OK'r 
†r!
jj½†r"
hj±†r#
jj½†r$
jŒX'KO'r%
†r&
jj½†r'
jRX}}r(
†r)
hj!†r*
jRX{{r+
†r,
jj½†r-
jŒX'1'r.
†r/
jj½†r0
jÃX	ends withr1
†r2
jj½†r3
jûXtruer4
†r5
jj½†r6
hjʆr7
jj½†r8
jŒX'OK'r9
†r:
jj½†r;
hj±†r<
jj½†r=
jŒX'KO'r>
†r?
jj½†r@
jRX}}rA
†rB
hj!†rC
jRX{{rD
†rE
jj½†rF
jj†rG
jj½†rH
jÃX	ends withrI
†rJ
jj½†rK
jûXtruerL
†rM
jj½†rN
hjʆrO
jj½†rP
jŒX'OK'rQ
†rR
jj½†rS
hj±†rT
jj½†rU
jŒX'KO'rV
†rW
jj½†rX
jRX}}rY
†rZ
hj!†r[
jRX{{r\
†r]
jj½†r^
jj¯†r_
jj½†r`
jÃX	ends withra
†rb
jj½†rc
jûXfalserd
†re
jj½†rf
hjʆrg
jj½†rh
jŒX'OK'ri
†rj
jj½†rk
hj±†rl
jj½†rm
jŒX'KO'rn
†ro
jj½†rp
jRX}}rq
†rr
hj!†rs
jRX{{rt
†ru
jj½†rv
jŒX''rw
†rx
jj½†ry
jÃX	ends withrz
†r{
jj½†r|
jûXfalser}
†r~
jj½†r
hjʆr€
jj½†r
jŒX'OK'r‚
†rƒ
jj½†r„
hj±†r…
jj½†r†
jŒX'KO'r‡
†rˆ
jj½†r‰
jRX}}rŠ
†r‹
hj!†rŒ
jRX{{r
†rŽ
jj½†r
jûXfalser
†r‘
jj½†r’
jÃX	ends withr“
†r”
jj½†r•
jûXfalser–
†r—
jj½†r˜
hjʆr™
jj½†rš
jŒX'OK'r›
†rœ
jj½†r
hj±†rž
jj½†rŸ
jŒX'KO'r 
†r¡
jj½†r¢
jRX}}r£
†r¤
hj!†r¥
jRX{{r¦
†r§
jj½†r¨
jûXfalser©
†rª
jj½†r«
jÃX	ends withr¬
†r­
jj½†r®
jŒX''r¯
†r°
jj½†r±
hjʆr²
jj½†r³
jŒX'OK'r´
†rµ
jj½†r¶
hj±†r·
jj½†r¸
jŒX'KO'r¹
†rº
jj½†r»
jRX}}r¼
†r½
hX~
--DATA--
return array()
--EXPECT--
OK
OK
OK
OK
KO
KO
KO
KO
KO
KO
--TEST--
Twig supports grouping of expressions
--TEMPLATE--
r¾
†r¿
jRX{{rÀ
†rÁ
jj½†rÂ
hjr†rÃ
jj††rÄ
jj½†rÅ
hji†rÆ
jj½†rÇ
jj††rÈ
hjv†rÉ
jj½†rÊ
hj†rË
jj½†rÌ
jj††rÍ
jj½†rÎ
jRX}}rÏ
†rÐ
hXU
--DATA--
return array()
--EXPECT--
2
--TEST--
Twig supports literals
--TEMPLATE--
1 rÑ
†rÒ
jRX{{rÓ
†rÔ
jj½†rÕ
jûXtruerÖ
†r×
jj½†rØ
jRX}}rÙ
†rÚ
hX
2 rÛ
†rÜ
jRX{{rÝ
†rÞ
jj½†rß
jûXTRUErà
†rá
jj½†râ
jRX}}rã
†rä
hX
3 rå
†ræ
jRX{{rç
†rè
jj½†ré
jûXfalserê
†rë
jj½†rì
jRX}}rí
†rî
hX
4 rï
†rð
jRX{{rñ
†rò
jj½†ró
jûXFALSErô
†rõ
jj½†rö
jRX}}r÷
†rø
hX
5 rù
†rú
jRX{{rû
†rü
jj½†rý
jûXnonerþ
†rÿ
jj½†rjRX}}r†rhX
6 r†rjRX{{r†rjj½†rjûXNONEr†r	jj½†r
jRX}}r†rhX
7 r
†rjRX{{r†rjj½†rjûXnullr†rjj½†rjRX}}r†rhX
8 r†rjRX{{r†rjj½†rjûXNULLr†rjj½†rjRX}}r†r hXz
--DATA--
return array()
--EXPECT--
1 1
2 1
3 
4 
5 
6 
7 
8 
--TEST--
Twig supports __call() for attributes
--TEMPLATE--
r!†r"jRX{{r#†r$jj½†r%hxXfoor&†r'hxX.foor(†r)jj½†r*jRX}}r+†r,hj!†r-jRX{{r.†r/jj½†r0hxXfoor1†r2hxX.barr3†r4jj½†r5jRX}}r6†r7hXe
--EXPECT--
foo_from_call
bar_from_getbar
--TEST--
Twig supports the "matches" operator
--TEMPLATE--
r8†r9jRX{{r:†r;jj½†r<jŒX'foo'r=†r>jj½†r?hxXmatchesr@†rAjj½†rBjŒX'/o/'rC†rDjj½†rEhjʆrFjj½†rGjŒX'OK'rH†rIjj½†rJhj±†rKjj½†rLjŒX'KO'rM†rNjj½†rOjRX}}rP†rQhj!†rRjRX{{rS†rTjj½†rUjŒX'foo'rV†rWjj½†rXhxXmatchesrY†rZjj½†r[jŒX'/^fo/'r\†r]jj½†r^hjʆr_jj½†r`jŒX'OK'ra†rbjj½†rchj±†rdjj½†rejŒX'KO'rf†rgjj½†rhjRX}}ri†rjhj!†rkjRX{{rl†rmjj½†rnjŒX'foo'ro†rpjj½†rqhxXmatchesrr†rsjj½†rtjŒX'/O/i'ru†rvjj½†rwhjʆrxjj½†ryjŒX'OK'rz†r{jj½†r|hj±†r}jj½†r~jŒX'KO'r†r€jj½†rjRX}}r‚†rƒhX^
--DATA--
return array()
--EXPECT--
OK
OK
OK
--TEST--
Twig supports method calls
--TEMPLATE--
r„†r…jRX{{r††r‡jj½†rˆhxXitemsr‰†rŠhxX.foor‹†rŒhxX.foor†rŽjj½†rjRX}}r†r‘hj!†r’jRX{{r“†r”jj½†r•hxXitemsr–†r—hxX.foor˜†r™hxX.getFoorš†r›hjr†rœhjv†rjj½†ržjRX}}rŸ†r hj!†r¡jRX{{r¢†r£jj½†r¤hxXitemsr¥†r¦hxX.foor§†r¨hxX.barr©†rªjj½†r«jRX}}r¬†r­hj!†r®jRX{{r¯†r°jj½†r±hxXitemsr²†r³hxX.foor´†rµhj=†r¶jŒX'bar'r·†r¸hjA†r¹jj½†rºjRX}}r»†r¼hj!†r½jRX{{r¾†r¿jj½†rÀhxXitemsrÁ†rÂhxX.foorÆrÄhxX.barrņrÆhjr†rÇjŒX'a'rȆrÉhjƒ†rÊjj½†rËjX4r̆rÍjjn†rÎhjv†rÏjj½†rÐjRX}}rцrÒhj!†rÓjRX{{rÔ†rÕjj½†rÖhxXitemsr׆rØhxX.foorÙ†rÚhxX.barrÛ†rÜhjr†rÝhxXfoorÞ†rßhjv†ràjj½†rájRX}}râ†rãhj!†räjRX{{rå†ræjj½†rçhxXitemsrè†réhxX.foorê†rëhxX.selfrì†ríhxX.foorî†rïhjr†rðhjv†rñjj½†ròjRX}}ró†rôhj!†rõjRX{{rö†r÷jj½†røhxXitemsrù†rúhxX.foorû†rühxX.isrý†rþjj½†rÿjRX}}r†rhj!†rjRX{{r†rjj½†rhxXitemsr†rhxX.foor†r	hxX.inr
†rjj½†rjRX}}r
†rhj!†rjRX{{r†rjj½†rhxXitemsr†rhxX.foor†rhxX.notr†rjj½†rjRX}}r†rhX
--DATA--
return array('foo' => 'bar', 'items' => array('foo' => new TwigTestFoo(), 'bar' => 'foo'))
--CONFIG--
return array('strict_variables' => false)
--EXPECT--
foo
foo
bar

bar_a-43
bar_bar
foo
is
in
not
--TEST--
Twig allows to use named operators as variable names
--TEMPLATE--
r†rjRX{%r†rjj½†r jÃXforr!†r"jj½†r#hxXmatchr$†r%jj½†r&jÃXinr'†r(jj½†r)hxXmatchesr*†r+jj½†r,jRX%}r-†r.hX
    r/†r0jRX{{r1†r2hjv†r3jj½†r4hxXmatchr5†r6jj½†r7jRX}}r8†r9hj!†r:jRX{%r;†r<jj½†r=jÃXendforr>†r?jj½†r@jRX%}rA†rBhj!†rCjRX{{rD†rEjj½†rFjÃXinrG†rHjj½†rIjRX}}rJ†rKhj!†rLjRX{{rM†rNjj½†rOhxXisrP†rQjj½†rRjRX}}rS†rThX
--DATA--
return array('matches' => array(1, 2, 3), 'in' => 'in', 'is' => 'is')
--EXPECT--
1
2
3
in
is
--TEST--
Twig parses postfix expressions
--TEMPLATE--
rU†rVjRX{%rW†rXjj½†rYjÃXimportrZ†r[jj½†r\hxX_selfr]†r^jj½†r_hxXasr`†rajj½†rbhxXmacrosrc†rdjj½†rejRX%}rf†rghX

rh†rijRX{%rj†rkjj½†rljÃXmacrorm†rnjj½†rohxXfoorp†rqhjr†rrhjv†rsjj½†rtjRX%}ru†rvhXfoorw†rxjRX{%ry†rzjj½†r{jÃXendmacror|†r}jj½†r~jRX%}r†r€hX

r†r‚jRX{{rƒ†r„jj½†r…jŒX'a'r††r‡jj½†rˆjRX}}r‰†rŠhj!†r‹jRX{{rŒ†rjj½†rŽjŒX'a'r†rhjn†r‘jXupperr’†r“jj½†r”jRX}}r•†r–hj!†r—jRX{{r˜†r™jj½†ršhjr†r›jŒX'a'rœ†rhjv†ržhjn†rŸjXupperr †r¡jj½†r¢jRX}}r£†r¤hj!†r¥jRX{{r¦†r§jj½†r¨hjv†r©jj†rªhjn†r«jXupperr¬†r­jj½†r®jRX}}r¯†r°hj!†r±jRX{{r²†r³jj½†r´hxXmacrosrµ†r¶hxX.foor·†r¸hjr†r¹hjv†rºjj½†r»jRX}}r¼†r½hj!†r¾jRX{{r¿†rÀjj½†rÁhjr†rÂhxXmacrosrÃ†rÄhjv†rÅhxX.foorÆ†rÇhjr†rÈhjv†rÉjj½†rÊjRX}}rË†rÌhXq
--DATA--
return array();
--EXPECT--
a
A
A
-1
foo
foo
--TEST--
Twig supports the "same as" operator
--TEMPLATE--
rÍ†rÎjRX{{rÏ†rÐjj½†rÑjj†rÒjj½†rÓjÃXisrÔ†rÕjj½†rÖjXsamer×†rØjj½†rÙhxXasrÚ†rÛhjr†rÜjj†rÝhjv†rÞjj½†rßhjʆràjj½†rájŒX'OK'râ†rãjj½†räjRX}}rå†ræhj!†rçjRX{{rè†réjj½†rêjj†rëjj½†rìjÃXisrí†rîjj½†rïjÃXnotrð†rñjj½†ròjXsameró†rôjj½†rõhxXasrö†r÷hjr†røjûXtruerù†rúhjv†rûjj½†rühjʆrýjj½†rþjŒX'OK'rÿ†r
jj½†r
jRX}}r
†r
hj!†r
jRX{{r
†r
jj½†r
jj†r
jj½†r	
jÃXisr

†r
jj½†r
jXsamer

†r
jj½†r
hxXasr
†r
hjr†r
jj†r
hjv†r
jj½†r
hjʆr
jj½†r
jŒX'OK'r
†r
jj½†r
jRX}}r
†r
hj!†r
jRX{{r
†r
jj½†r 
jj†r!
jj½†r"
jÃXisr#
†r$
jj½†r%
jÃXnotr&
†r'
jj½†r(
jXsamer)
†r*
jj½†r+
hxXasr,
†r-
hjr†r.
jûXtruer/
†r0
hjv†r1
jj½†r2
hjʆr3
jj½†r4
jŒX'OK'r5
†r6
jj½†r7
jRX}}r8
†r9
hj!†r:
jRX{{r;
†r<
jj½†r=
jj†r>
jj½†r?
jÃXisr@
†rA
jX   rB
†rC
jXsamerD
†rE
jX    rF
†rG
hxXasrH
†rI
jX   rJ
†rK
hjr†rL
jj†rM
hjv†rN
jj½†rO
hjʆrP
jj½†rQ
jŒX'OK'rR
†rS
jj½†rT
jRX}}rU
†rV
hj!†rW
jRX{{rX
†rY
jj½†rZ
jj†r[
jj½†r\
jÃXisr]
†r^
jj½†r_
jÃXnotr`
†ra
jX
    rb
†rc
jXsamerd
†re
jX
    rf
†rg
hxXasrh
†ri
jX
    rj
†rk
hjr†rl
jûXtruerm
†rn
hjv†ro
jj½†rp
hjʆrq
jj½†rr
jŒX'OK'rs
†rt
jj½†ru
jRX}}rv
†rw
hXu
--DATA--
return array()
--EXPECT--
OK
OK
OK
OK
OK
OK
--TEST--
Twig supports the "starts with" operator
--TEMPLATE--
rx
†ry
jRX{{rz
†r{
jj½†r|
jŒX'foo'r}
†r~
jj½†r
jÃXstarts withr€
†r
jj½†r‚
jŒX'f'rƒ
†r„
jj½†r…
hjʆr†
jj½†r‡
jŒX'OK'rˆ
†r‰
jj½†rŠ
hj±†r‹
jj½†rŒ
jŒX'KO'r
†rŽ
jj½†r
jRX}}r
†r‘
hj!†r’
jRX{{r“
†r”
jj½†r•
jÃXnotr–
†r—
jj½†r˜
hjr†r™
jŒX'foo'rš
†r›
jj½†rœ
jÃXstarts withr
†rž
jj½†rŸ
jŒX'oo'r 
†r¡
hjv†r¢
jj½†r£
hjʆr¤
jj½†r¥
jŒX'OK'r¦
†r§
jj½†r¨
hj±†r©
jj½†rª
jŒX'KO'r«
†r¬
jj½†r­
jRX}}r®
†r¯
hj!†r°
jRX{{r±
†r²
jj½†r³
jÃXnotr´
†rµ
jj½†r¶
hjr†r·
jŒX'foo'r¸
†r¹
jj½†rº
jÃXstarts withr»
†r¼
jj½†r½
jŒX'foowaytoolong'r¾
†r¿
hjv†rÀ
jj½†rÁ
hjʆrÂ
jj½†rÃ
jŒX'OK'rÄ
†rÅ
jj½†rÆ
hj±†rÇ
jj½†rÈ
jŒX'KO'rÉ
†rÊ
jj½†rË
jRX}}rÌ
†rÍ
hj!†rÎ
jRX{{rÏ
†rÐ
jj½†rÑ
jŒX'foo'rÒ
†rÓ
jj½†rÔ
jÃXstarts      withrÕ
†rÖ
jj½†r×
jŒX'f'rØ
†rÙ
jj½†rÚ
hjʆrÛ
jj½†rÜ
jŒX'OK'rÝ
†rÞ
jj½†rß
hj±†rà
jj½†rá
jŒX'KO'râ
†rã
jj½†rä
jRX}}rå
†ræ
hj!†rç
jRX{{rè
†ré
jj½†rê
jŒX'foo'rë
†rì
jj½†rí
jÃXstarts
withrî
†rï
jj½†rð
jŒX'f'rñ
†rò
jj½†ró
hjʆrô
jj½†rõ
jŒX'OK'rö
†r÷
jj½†rø
hj±†rù
jj½†rú
jŒX'KO'rû
†rü
jj½†rý
jRX}}rþ
†rÿ
hj!†rjRX{{r†rjj½†rjŒX'foo'r†rjj½†rjÃXstarts withr†rjj½†r	jŒX''r
†rjj½†rhjʆr
jj½†rjŒX'OK'r†rjj½†rhj±†rjj½†rjŒX'KO'r†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rjŒX'1'r†rjj½†rjÃXstarts withr †r!jj½†r"jûXtruer#†r$jj½†r%hjʆr&jj½†r'jŒX'OK'r(†r)jj½†r*hj±†r+jj½†r,jŒX'KO'r-†r.jj½†r/jRX}}r0†r1hj!†r2jRX{{r3†r4jj½†r5jŒX''r6†r7jj½†r8jÃXstarts withr9†r:jj½†r;jûXfalser<†r=jj½†r>hjʆr?jj½†r@jŒX'OK'rA†rBjj½†rChj±†rDjj½†rEjŒX'KO'rF†rGjj½†rHjRX}}rI†rJhj!†rKjRX{{rL†rMjj½†rNjŒX'a'rO†rPjj½†rQjÃXstarts withrR†rSjj½†rTjûXfalserU†rVjj½†rWhjʆrXjj½†rYjŒX'OK'rZ†r[jj½†r\hj±†r]jj½†r^jŒX'KO'r_†r`jj½†rajRX}}rb†rchj!†rdjRX{{re†rfjj½†rgjûXfalserh†rijj½†rjjÃXstarts withrk†rljj½†rmjŒX''rn†rojj½†rphjʆrqjj½†rrjŒX'OK'rs†rtjj½†ruhj±†rvjj½†rwjŒX'KO'rx†ryjj½†rzjRX}}r{†r|hX{
--DATA--
return array()
--EXPECT--
OK
OK
OK
OK
OK
OK
KO
KO
KO
KO
--TEST--
Twig supports string interpolation
--TEMPLATE--
r}†r~jLX#{# "foo #{"foo #{bar} baz"} baz" #}r†r€hj!†rjLX{# "foo #{bar}#{bar} baz" #}r‚†rƒhX
--DATA--
return array('bar' => 'BAR');
--EXPECT--
foo foo BAR baz baz
foo BARBAR baz
--TEST--
Twig supports the ternary operator
--TEMPLATE--
r„†r…jRX{{r††r‡jj½†rˆjj†r‰jj½†rŠhjʆr‹jj½†rŒjŒX'YES'r†rŽjj½†rjRX}}r†r‘hj!†r’jRX{{r“†r”jj½†r•jj¯†r–jj½†r—hjʆr˜jj½†r™jŒX'YES'rš†r›jj½†rœjRX}}r†ržhXb
--DATA--
return array()
--EXPECT--
YES

--TEST--
Twig supports the ternary operator
--TEMPLATE--
rŸ†r jRX{{r¡†r¢jj½†r£jŒX'YES'r¤†r¥jj½†r¦hjʆr§hj±†r¨jj½†r©jŒX'NO'rª†r«jj½†r¬jRX}}r­†r®hj!†r¯jRX{{r°†r±jj½†r²jj¯†r³jj½†r´hjʆrµhj±†r¶jj½†r·jŒX'NO'r¸†r¹e(jj½†rºjRX}}r»†r¼hXd
--DATA--
return array()
--EXPECT--
YES
NO
--TEST--
Twig supports the ternary operator
--TEMPLATE--
r½†r¾jRX{{r¿†rÀjj½†rÁjj†rÂjj½†rÃhjʆrÄjj½†rÅjŒX'YES'rƆrÇjj½†rÈhj±†rÉjj½†rÊjŒX'NO'rˆrÌjj½†rÍjRX}}rΆrÏhj!†rÐjRX{{rцrÒjj½†rÓjj¯†rÔjj½†rÕhjʆrÖjj½†r×jŒX'YES'r؆rÙjj½†rÚhj±†rÛjj½†rÜjŒX'NO'r݆rÞjj½†rßjRX}}rà†ráhj!†râjRX{{rã†räjj½†råjj¯†ræjj½†rçhjʆrèjj½†réjŒX'YES'rê†rëjj½†rìhj±†ríjj½†rîhjr†rïjj†rðjj½†rñhjʆròjj½†rójŒX'YES1'rô†rõjj½†röhj±†r÷jj½†røjŒX'NO1'rù†rúhjv†rûjj½†rüjRX}}rý†rþhj!†rÿjRX{{r†rjj½†rjj¯†rjj½†rhjʆrjj½†rjŒX'YES'r†rjj½†r	hj±†r
jj½†rhjr†rjj¯†r
jj½†rhjʆrjj½†rjŒX'YES1'r†rjj½†rhj±†rjj½†rjŒX'NO1'r†rhjv†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rjj†r jj½†r!hX==r"†r#jj½†r$jj†r%jj½†r&hjʆr'jj½†r(jŒX'foo<br />'r)†r*jŒX:''r+†r,jj½†r-jRX}}r.†r/hj!†r0jRX{{r1†r2jj½†r3hxXfoor4†r5jj½†r6hj1†r7jj½†r8hjr†r9hxXbarr:†r;jj½†r<hjʆr=jj½†r>hjr†r?jŒX'-'r@†rAjj½†rBhj1†rCjj½†rDhxXbarrE†rFhjv†rGjj½†rHhj±†rIjj½†rJjŒX''rK†rLhjv†rMjj½†rNjRX}}rO†rPhXÀ
--DATA--
return array('foo' => 'foo', 'bar' => 'bar')
--EXPECT--
YES
NO
YES1
NO1
foo<br />
foo-bar
--TEST--
Twig does not allow to use two-word named operators as variable names
--TEMPLATE--
rQ†rRjRX{{rS†rTjj½†rUjÃXstarts withrV†rWjj½†rXjRX}}rY†rZhX½
--DATA--
return array()
--EXCEPTION--
Twig_Error_Syntax: Unexpected token "operator" of value "starts with" in "index.twig" at line 2
--TEST--
Twig unary operators precedence
--TEMPLATE--
r[†r\jRX{{r]†r^jj½†r_hjv†r`jj†rajj½†rbhjv†rcjj½†rdjj†rejj½†rfjRX}}rg†rhhj!†rijRX{{rj†rkjj½†rlhjv†rmjj†rnjj½†rohjv†rpjj½†rqhjv†rrjj†rsjj½†rtjRX}}ru†rvhj!†rwjRX{{rx†ryjj½†rzhjv†r{jj†r|jj½†r}hjƒ†r~jj½†rhjv†r€jj†rjj½†r‚jRX}}rƒ†r„hj!†r…jRX{{r††r‡jj½†rˆjj̆r‰jj½†rŠhj†r‹jj½†rŒhjv†rjj†rŽjj½†rhjƒ†rjj½†r‘jj†r’jj½†r“jRX}}r”†r•hXo
--DATA--
return array()
--EXPECT--
-2
0
1
-20
--TEST--
Twig supports unary operators (not, -, +)
--TEMPLATE--
r–†r—jRX{{r˜†r™jj½†ršjÃXnotr›†rœjj½†rjj†ržjj½†rŸjRX}}r †r¡hj†r¢jRX{{r£†r¤jj½†r¥jÃXnotr¦†r§jj½†r¨jj¯†r©jj½†rªjRX}}r«†r¬hj!†r­jRX{{r®†r¯jj½†r°hji†r±jj†r²jj½†r³hji†r´jj½†rµjj†r¶jj½†r·jRX}}r¸†r¹hj†rºjRX{{r»†r¼jj½†r½hjv†r¾jj†r¿jj½†rÀhjv†rÁjj½†rÂjj†rÃjj½†rÄjRX}}rņrÆhj!†rÇjRX{{rȆrÉjj½†rÊjÃXnotrˆrÌjj½†rÍhjr†rÎjûXfalserφrÐjj½†rÑjÃXorrÒ†rÓjj½†rÔjûXtruerÕ†rÖhjv†r×jj½†rØjRX}}rÙ†rÚhXP
--DATA--
return array()
--EXPECT--
/1
2/-2

--TEST--
"abs" filter
--TEMPLATE--
rÛ†rÜjRX{{r݆rÞjj½†rßhjr†ràhjv†rájX5.5râ†rãhjv†rähjn†råjXabsræ†rçjj½†rèjRX}}ré†rêhj!†rëjRX{{rì†ríjj½†rîhjr†rïhjv†rðjj†rñhjv†ròhjn†rójXabsrô†rõjj½†röjRX}}r÷†røhj!†rùjRX{{rú†rûjj½†rühjr†rýhjv†rþjj¯†rÿhjv†rhjn†rjXabsr†rjj½†rjRX}}r†rhj!†rjRX{{r†r	jj½†r
jj¯†rhjn†rjXabsr
†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rjj†rhjn†rjXabsr†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†r jX5.5r!†r"hjn†r#jXabsr$†r%jj½†r&jRX}}r'†r(hj!†r)jRX{{r*†r+jj½†r,hxXnumber1r-†r.hjn†r/jXabsr0†r1jj½†r2jRX}}r3†r4hj!†r5jRX{{r6†r7jj½†r8hxXnumber2r9†r:hjn†r;jXabsr<†r=jj½†r>jRX}}r?†r@hj!†rAjRX{{rB†rCjj½†rDhxXnumber3rE†rFhjn†rGjXabsrH†rIjj½†rJjRX}}rK†rLhj!†rMjRX{{rN†rOjj½†rPhxXnumber4rQ†rRhjn†rSjXabsrT†rUjj½†rVjRX}}rW†rXhj!†rYjRX{{rZ†r[jj½†r\hxXnumber5r]†r^hjn†r_jXabsr`†rajj½†rbjRX}}rc†rdhj!†rejRX{{rf†rgjj½†rhhxXnumber6ri†rjhjn†rkjXabsrl†rmjj½†rnjRX}}ro†rphXÎ
--DATA--
return array('number1' => -5.5, 'number2' => -5, 'number3' => -0, 'number4' => 0, 'number5' => 5, 'number6' => 5.5)
--EXPECT--
5.5
5
0
0
5
5.5
5.5
5
0
0
5
5.5
--TEST--
"batch" filter
--TEMPLATE--
rq†rrjRX{%rs†rtjj½†rujÃXforrv†rwjj½†rxhxXrowry†rzjj½†r{jÃXinr|†r}jj½†r~hxXitemsr†r€hjn†rjXbatchr‚†rƒhjr†r„jX3.1r…†r†hjv†r‡jj½†rˆjRX%}r‰†rŠhX
  <div class=row>
  r‹†rŒjRX{%r†rŽjj½†rjÃXforr†r‘jj½†r’hxXcolumnr“†r”jj½†r•jÃXinr–†r—jj½†r˜hxXrowr™†ršjj½†r›jRX%}rœ†rhX
    <div class=item>rž†rŸjRX{{r †r¡jj½†r¢hxXcolumnr£†r¤jj½†r¥jRX}}r¦†r§hX	</div>
  r¨†r©jRX{%rª†r«jj½†r¬jÃXendforr­†r®jj½†r¯jRX%}r°†r±hX

  </div>
r²†r³jRX{%r´†rµjj½†r¶jÃXendforr·†r¸jj½†r¹jRX%}rº†r»hX
--DATA--
return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
--EXPECT--
<div class=row>
      <div class=item>a</div>
      <div class=item>b</div>
      <div class=item>c</div>
      <div class=item>d</div>
    </div>
  <div class=row>
      <div class=item>e</div>
      <div class=item>f</div>
      <div class=item>g</div>
      <div class=item>h</div>
    </div>
  <div class=row>
      <div class=item>i</div>
      <div class=item>j</div>
    </div>
--TEST--
"batch" filter
--TEMPLATE--
r¼†r½jRX{%r¾†r¿jj½†rÀjÃXforrÁ†rÂjj½†rÃhxXrowrĆrÅjj½†rÆjÃXinrdžrÈjj½†rÉhxXitemsrʆrËhjn†rÌjXbatchr͆rÎhjr†rÏjjn†rÐhjv†rÑjj½†rÒjRX%}rÓ†rÔhX
  <div class=row>
  rÕ†rÖjRX{%r׆rØjj½†rÙjÃXforrÚ†rÛjj½†rÜhxXcolumnr݆rÞjj½†rßjÃXinrà†rájj½†râhxXrowrã†räjj½†råjRX%}ræ†rçhX
    <div class=item>rè†réjRX{{rê†rëjj½†rìhxXcolumnrí†rîjj½†rïjRX}}rð†rñhX	</div>
  rò†rójRX{%rô†rõjj½†röjÃXendforr÷†røjj½†rùjRX%}rú†rûhX

  </div>
rü†rýjRX{%rþ†rÿjj½†rjÃXendforr†rjj½†rjRX%}r†rhX1
--DATA--
return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
--EXPECT--
<div class=row>
      <div class=item>a</div>
      <div class=item>b</div>
      <div class=item>c</div>
    </div>
  <div class=row>
      <div class=item>d</div>
      <div class=item>e</div>
      <div class=item>f</div>
    </div>
  <div class=row>
      <div class=item>g</div>
      <div class=item>h</div>
      <div class=item>i</div>
    </div>
  <div class=row>
      <div class=item>j</div>
    </div>
--TEST--
"batch" filter
--TEMPLATE--
<table>
r†rjRX{%r†r	jj½†r
jÃXforr†rjj½†r
hxXrowr†rjj½†rjÃXinr†rjj½†rhxXitemsr†rhjn†rjXbatchr†rhjr†rjjn†rhjƒ†rjj½†rjŒX''r†rhjv†rjj½†r jRX%}r!†r"hX

  <tr>
  r#†r$jRX{%r%†r&jj½†r'jÃXforr(†r)jj½†r*hxXcolumnr+†r,jj½†r-jÃXinr.†r/jj½†r0hxXrowr1†r2jj½†r3jRX%}r4†r5hX	
    <td>r6†r7jRX{{r8†r9jj½†r:hxXcolumnr;†r<jj½†r=jRX}}r>†r?hX</td>
  r@†rAjRX{%rB†rCjj½†rDjÃXendforrE†rFjj½†rGjRX%}rH†rIhX	
  </tr>
rJ†rKjRX{%rL†rMjj½†rNjÃXendforrO†rPjj½†rQjRX%}rR†rShX³
</table>
--DATA--
return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
--EXPECT--
<table>
  <tr>
      <td>a</td>
      <td>b</td>
      <td>c</td>
    </tr>
  <tr>
      <td>d</td>
      <td>e</td>
      <td>f</td>
    </tr>
  <tr>
      <td>g</td>
      <td>h</td>
      <td>i</td>
    </tr>
  <tr>
      <td>j</td>
      <td></td>
      <td></td>
    </tr>
</table>
--TEST--
"batch" filter
--TEMPLATE--
rT†rUjRX{%rV†rWjj½†rXjÃXforrY†rZjj½†r[hxXrowr\†r]jj½†r^jÃXinr_†r`jj½†rahxXitemsrb†rchjn†rdjXbatchre†rfhjr†rgjjn†rhhjƒ†rijj½†rjjŒX'fill'rk†rlhjv†rmjj½†rnjRX%}ro†rphX
  <div class=row>
  rq†rrjRX{%rs†rtjj½†rujÃXforrv†rwjj½†rxhxXcolumnry†rzjj½†r{jÃXinr|†r}jj½†r~hxXrowr†r€jj½†rjRX%}r‚†rƒhX
    <div class=item>r„†r…jRX{{r††r‡jj½†rˆhxXcolumnr‰†rŠjj½†r‹jRX}}rŒ†rhX	</div>
  rކrjRX{%r†r‘jj½†r’jÃXendforr“†r”jj½†r•jRX%}r–†r—hX

  </div>
r˜†r™jRX{%rš†r›jj½†rœjÃXendforr†ržjj½†rŸjRX%}r †r¡hXw
--DATA--
return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'))
--EXPECT--
<div class=row>
      <div class=item>a</div>
      <div class=item>b</div>
      <div class=item>c</div>
    </div>
  <div class=row>
      <div class=item>d</div>
      <div class=item>e</div>
      <div class=item>f</div>
    </div>
  <div class=row>
      <div class=item>g</div>
      <div class=item>h</div>
      <div class=item>i</div>
    </div>
  <div class=row>
      <div class=item>j</div>
      <div class=item>k</div>
      <div class=item>l</div>
    </div>
--TEST--
"batch" filter
--TEMPLATE--
<table>
r¢†r£jRX{%r¤†r¥jj½†r¦jÃXforr§†r¨jj½†r©hxXrowrª†r«jj½†r¬jÃXinr­†r®jj½†r¯hxXitemsr°†r±hjn†r²jXbatchr³†r´hjr†rµjjn†r¶hjƒ†r·jj½†r¸jŒX'fill'r¹†rºhjv†r»jj½†r¼jRX%}r½†r¾hX

  <tr>
  r¿†rÀjRX{%rÁ†rÂjj½†rÃjÃXforrĆrÅjj½†rÆhxXcolumnrdžrÈjj½†rÉjÃXinrʆrËjj½†rÌhxXrowr͆rÎjj½†rÏjRX%}rІrÑhX	
    <td>rÒ†rÓjRX{{rÔ†rÕjj½†rÖhxXcolumnr׆rØjj½†rÙjRX}}rÚ†rÛhX</td>
  r܆rÝjRX{%rÞ†rßjj½†ràjÃXendforrá†râjj½†rãjRX%}rä†råhX	
  </tr>
ræ†rçjRX{%rè†réjj½†rêjÃXendforrë†rìjj½†ríjRX%}rî†rïhX
</table>
--DATA--
return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
--EXPECT--
<table>
  <tr>
      <td>a</td>
      <td>b</td>
      <td>c</td>
    </tr>
  <tr>
      <td>d</td>
      <td>e</td>
      <td>f</td>
    </tr>
  <tr>
      <td>g</td>
      <td>h</td>
      <td>i</td>
    </tr>
  <tr>
      <td>j</td>
      <td>fill</td>
      <td>fill</td>
    </tr>
</table>
--TEST--
"convert_encoding" filter
--CONDITION--
function_exists('iconv') || function_exists('mb_convert_encoding')
--TEMPLATE--
rð†rñjRX{{rò†rójj½†rôjñX"愛していますか?"rõ†röhjn†r÷jXconvert_encodingrø†rùhjr†rújŒX
'ISO-2022-JP'rû†rühjƒ†rýjj½†rþjŒX'UTF-8'rÿ†rhjv†rhjn†rjXconvert_encodingr†rhjr†rjŒX'UTF-8'r†rhjƒ†rjj½†r	jŒX
'ISO-2022-JP'r
†rhjv†rjj½†r
jRX}}r†rhX½
--DATA--
return array()
--EXPECT--
愛していますか?
--TEST--
"date" filter (interval support as of PHP 5.3)
--CONDITION--
version_compare(phpversion(), '5.3.0', '>=')
--TEMPLATE--
r†rjRX{{r†rjj½†rhxXdate2r†rhjn†rjXdater†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†r hxXdate2r!†r"hjn†r#jXdater$†r%hjr†r&jŒX	'%d days'r'†r(hjv†r)jj½†r*jRX}}r+†r,hXò
--DATA--
date_default_timezone_set('UTC');
$twig->getExtension('core')->setDateFormat('Y-m-d', '%d days %h hours');
return array(
    'date2' => new DateInterval('P2D'),
)
--EXPECT--
2 days 0 hours
2 days
--TEST--
"date" filter
--TEMPLATE--
r-†r.jRX{{r/†r0jj½†r1hxXdate1r2†r3hjn†r4jXdater5†r6jj½†r7jRX}}r8†r9hj!†r:jRX{{r;†r<jj½†r=hxXdate1r>†r?hjn†r@jXdaterA†rBhjr†rCjŒX'd/m/Y'rD†rEhjv†rFjj½†rGjRX}}rH†rIhX4
--DATA--
date_default_timezone_set('UTC');
$twig->getExtension('core')->setDateFormat('Y-m-d', '%d days %h hours');
return array(
    'date1' => mktime(13, 45, 0, 10, 4, 2010),
)
--EXPECT--
2010-10-04
04/10/2010
--TEST--
"date" filter
--CONDITION--
version_compare(phpversion(), '5.5.0', '>=')
--TEMPLATE--
rJ†rKjRX{{rL†rMjj½†rNhxXdate1rO†rPhjn†rQjXdaterR†rSjj½†rTjRX}}rU†rVhj!†rWjRX{{rX†rYjj½†rZhxXdate1r[†r\hjn†r]jXdater^†r_hjr†r`jŒX'd/m/Y'ra†rbhjv†rcjj½†rdjRX}}re†rfhj!†rgjRX{{rh†rijj½†rjhxXdate1rk†rlhjn†rmjXdatern†rohjr†rpjŒX
'd/m/Y H:i:s'rq†rrhjƒ†rsjj½†rtjŒX'Asia/Hong_Kong'ru†rvhjv†rwjj½†rxjRX}}ry†rzhj!†r{jRX{{r|†r}jj½†r~hxXdate1r†r€hjn†rjXdater‚†rƒhjr†r„jŒX
'd/m/Y H:i:s'r…†r†hjƒ†r‡jj½†rˆhxX	timezone1r‰†rŠhjv†r‹jj½†rŒjRX}}r†rŽhj!†rjRX{{r†r‘jj½†r’hxXdate1r“†r”hjn†r•jXdater–†r—hjr†r˜jŒX
'd/m/Y H:i:s'r™†ršhjv†r›jj½†rœjRX}}r†ržhX

rŸ†r jRX{{r¡†r¢jj½†r£hxXdate2r¤†r¥hjn†r¦jXdater§†r¨hjr†r©jŒX'd/m/Y H:i:s P'rª†r«hjƒ†r¬jj½†r­jŒX'Europe/Paris'r®†r¯hjv†r°jj½†r±jRX}}r²†r³hj!†r´jRX{{rµ†r¶jj½†r·hxXdate2r¸†r¹hjn†rºjXdater»†r¼hjr†r½jŒX'd/m/Y H:i:s P'r¾†r¿hjƒ†rÀjj½†rÁjŒX'Asia/Hong_Kong'r†rÃhjv†rÄjj½†rÅjRX}}rƆrÇhj!†rÈjRX{{rɆrÊjj½†rËhxXdate2r̆rÍhjn†rÎjXdaterφrÐhjr†rÑjŒX'd/m/Y H:i:s P'rÒ†rÓhjƒ†rÔjj½†rÕjûXfalserÖ†r×hjv†rØjj½†rÙjRX}}rÚ†rÛhj!†rÜjRX{{r݆rÞjj½†rßhxXdate2rà†ráhjn†râjXdaterã†rähjr†råjŒX'e'ræ†rçhjƒ†rèjj½†réjŒX'Europe/Paris'rê†rëhjv†rìjj½†ríjRX}}rî†rïhj!†rðjRX{{rñ†ròjj½†róhxXdate2rô†rõhjn†röjXdater÷†røhjr†rùjŒX'e'rú†rûhjƒ†rüjj½†rýjûXfalserþ†rÿhjv†rjj½†rjRX}}r†rhXp
--DATA--
date_default_timezone_set('Europe/Paris');
return array(
    'date1' => new DateTimeImmutable('2010-10-04 13:45'),
    'date2' => new DateTimeImmutable('2010-10-04 13:45', new DateTimeZone('America/New_York')),
    'timezone1' => new DateTimeZone('America/New_York'),
)
--EXPECT--
October 4, 2010 13:45
04/10/2010
04/10/2010 19:45:00
04/10/2010 07:45:00
04/10/2010 13:45:00

04/10/2010 19:45:00 +02:00
05/10/2010 01:45:00 +08:00
04/10/2010 13:45:00 -04:00
Europe/Paris
America/New_York
--TEST--
"date" filter (interval support as of PHP 5.3)
--CONDITION--
version_compare(phpversion(), '5.3.0', '>=')
--TEMPLATE--
r†rjRX{{r†rjj½†rhxXdate1r	†r
hjn†rjXdater†r
jj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rhxXdate1r†rhjn†rjXdater†rhjr†rjŒX'%d days %h hours'r†rhjv†rjj½†rjRX}}r†r hj!†r!jRX{{r"†r#jj½†r$hxXdate1r%†r&hjn†r'jXdater(†r)hjr†r*jŒX'%d days %h hours'r+†r,hjƒ†r-jj½†r.hxX	timezone1r/†r0hjv†r1jj½†r2jRX}}r3†r4hX5
--DATA--
date_default_timezone_set('UTC');
return array(
    'date1' => new DateInterval('P2D'),
    // This should have no effect on DateInterval formatting
    'timezone1' => new DateTimeZone('America/New_York'),
)
--EXPECT--
2 days
2 days 0 hours
2 days 0 hours
--TEST--
"date_modify" filter
--TEMPLATE--
r5†r6jRX{{r7†r8jj½†r9hxXdate1r:†r;hjn†r<jXdate_modifyr=†r>hjr†r?jŒX'-1day'r@†rAhjv†rBhjn†rCjXdaterD†rEhjr†rFjŒX
'Y-m-d H:i:s'rG†rHhjv†rIjj½†rJjRX}}rK†rLhj!†rMjRX{{rN†rOjj½†rPhxXdate2rQ†rRhjn†rSjXdate_modifyrT†rUhjr†rVjŒX'-1day'rW†rXhjv†rYhjn†rZjXdater[†r\hjr†r]jŒX
'Y-m-d H:i:s'r^†r_hjv†r`jj½†rajRX}}rb†rchXç
--DATA--
date_default_timezone_set('UTC');
return array(
    'date1' => '2010-10-04 13:45',
    'date2' => new DateTime('2010-10-04 13:45'),
)
--EXPECT--
2010-10-03 13:45:00
2010-10-03 13:45:00
--TEST--
"date" filter
--TEMPLATE--
rd†rejRX{{rf†rgjj½†rhhxXdateri†rjhjn†rkjXdaterl†rmhjr†rnhxXformatro†rphj2†rqjŒX'd/m/Y H:i:s P'rr†rshjƒ†rtjj½†ruhxXtimezonerv†rwhj2†rxjŒX'America/Chicago'ry†rzhjv†r{jj½†r|jRX}}r}†r~hj!†rjRX{{r€†rjj½†r‚hxXdaterƒ†r„hjn†r…jXdater††r‡hjr†rˆhxXtimezoner‰†rŠhj2†r‹jŒX'America/Chicago'rŒ†rhjƒ†rŽjj½†rhxXformatr†r‘hj2†r’jŒX'd/m/Y H:i:s P'r“†r”hjv†r•jj½†r–jRX}}r—†r˜hj!†r™jRX{{rš†r›jj½†rœhxXdater†ržhjn†rŸjXdater †r¡hjr†r¢jŒX'd/m/Y H:i:s P'r£†r¤hjƒ†r¥jj½†r¦hxXtimezoner§†r¨hj2†r©jŒX'America/Chicago'rª†r«hjv†r¬jj½†r­jRX}}r®†r¯hXã
--DATA--
date_default_timezone_set('UTC');
return array('date' => mktime(13, 45, 0, 10, 4, 2010))
--EXPECT--
04/10/2010 08:45:00 -05:00
04/10/2010 08:45:00 -05:00
04/10/2010 08:45:00 -05:00
--TEST--
"date" filter
--TEMPLATE--
r°†r±jRX{{r²†r³jj½†r´hxXdate1rµ†r¶hjn†r·jXdater¸†r¹jj½†rºjRX}}r»†r¼hj!†r½jRX{{r¾†r¿jj½†rÀhxXdate1rÁ†rÂhjn†rÃjXdaterĆrÅhjr†rÆjŒX'd/m/Y'rdžrÈhjv†rÉjj½†rÊjRX}}rˆrÌhj!†rÍjRX{{rΆrÏjj½†rÐhxXdate1rцrÒhjn†rÓjXdaterÔ†rÕhjr†rÖjŒX
'd/m/Y H:i:s'r׆rØhjƒ†rÙjj½†rÚjŒX'Asia/Hong_Kong'rÛ†rÜhjv†rÝjj½†rÞjRX}}r߆ràhj!†rájRX{{râ†rãjj½†rähxXdate1rå†ræhjn†rçjXdaterè†réhjr†rêjŒX'd/m/Y H:i:s P'rë†rìhjƒ†ríjj½†rîjŒX'Asia/Hong_Kong'rï†rðhjv†rñjj½†ròjRX}}ró†rôhj!†rõjRX{{rö†r÷jj½†røhxXdate1rù†rúhjn†rûjXdaterü†rýhjr†rþjŒX'd/m/Y H:i:s P'rÿ†rhjƒ†rjj½†rjŒX'America/Chicago'r†rhjv†rjj½†rjRX}}r†rhj!†r	jRX{{r
†rjj½†rhxXdate1r
†rhjn†rjXdater†rhjr†rjŒX'e'r†rhjv†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rhxXdate1r†rhjn†rjXdater †r!hjr†r"jŒX
'd/m/Y H:i:s'r#†r$hjv†r%jj½†r&jRX}}r'†r(hX

r)†r*jRX{{r+†r,jj½†r-hxXdate2r.†r/hjn†r0jXdater1†r2jj½†r3jRX}}r4†r5hj!†r6jRX{{r7†r8jj½†r9hxXdate2r:†r;hjn†r<jXdater=†r>hjr†r?jŒX'd/m/Y'r@†rAhjv†rBjj½†rCjRX}}rD†rEhj!†rFjRX{{rG†rHjj½†rIhxXdate2rJ†rKhjn†rLjXdaterM†rNhjr†rOjŒX
'd/m/Y H:i:s'rP†rQhjƒ†rRjj½†rSjŒX'Asia/Hong_Kong'rT†rUhjv†rVjj½†rWjRX}}rX†rYhj!†rZjRX{{r[†r\jj½†r]e(hxXdate2r^†r_hjn†r`jXdatera†rbhjr†rcjŒX
'd/m/Y H:i:s'rd†rehjƒ†rfjj½†rghxX	timezone1rh†rihjv†rjjj½†rkjRX}}rl†rmhj!†rnjRX{{ro†rpjj½†rqhxXdate2rr†rshjn†rtjXdateru†rvhjr†rwjŒX
'd/m/Y H:i:s'rx†ryhjv†rzjj½†r{jRX}}r|†r}hX

r~†rjRX{{r€†rjj½†r‚hxXdate3rƒ†r„hjn†r…jXdater††r‡jj½†rˆjRX}}r‰†rŠhj!†r‹jRX{{rŒ†rjj½†rŽhxXdate3r†rhjn†r‘jXdater’†r“hjr†r”jŒX'd/m/Y'r•†r–hjv†r—jj½†r˜jRX}}r™†ršhX

r›†rœjRX{{r†ržjj½†rŸhxXdate4r †r¡hjn†r¢jXdater£†r¤jj½†r¥jRX}}r¦†r§hj!†r¨jRX{{r©†rªjj½†r«hxXdate4r¬†r­hjn†r®jXdater¯†r°hjr†r±jŒX'd/m/Y'r²†r³hjv†r´jj½†rµjRX}}r¶†r·hX

r¸†r¹jRX{{rº†r»jj½†r¼hxXdate5r½†r¾hjn†r¿jXdaterÀ†rÁjj½†rÂjRX}}rÆrÄhj!†rÅjRX{{rƆrÇjj½†rÈhxXdate5rɆrÊhjn†rËjXdater̆rÍhjr†rÎjŒX'd/m/Y'rφrÐhjv†rÑjj½†rÒjRX}}rÓ†rÔhX

rÕ†rÖjRX{{r׆rØjj½†rÙhxXdate6rÚ†rÛhjn†rÜjXdater݆rÞhjr†rßjŒX'd/m/Y H:i:s P'rà†ráhjƒ†râjj½†rãjŒX'Europe/Paris'rä†råhjv†ræjj½†rçjRX}}rè†réhj!†rêjRX{{rë†rìjj½†ríhxXdate6rî†rïhjn†rðjXdaterñ†ròhjr†rójŒX'd/m/Y H:i:s P'rô†rõhjƒ†röjj½†r÷jŒX'Asia/Hong_Kong'rø†rùhjv†rújj½†rûjRX}}rü†rýhj!†rþjRX{{rÿ†rjj½†rhxXdate6r†rhjn†rjXdater†rhjr†rjŒX'd/m/Y H:i:s P'r†r	hjƒ†r
jj½†rjûXfalser†r
hjv†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rhxXdate6r†rhjn†rjXdater†rhjr†rjŒX'e'r†rhjƒ†rjj½†rjŒX'Europe/Paris'r †r!hjv†r"jj½†r#jRX}}r$†r%hj!†r&jRX{{r'†r(jj½†r)hxXdate6r*†r+hjn†r,jXdater-†r.hjr†r/jŒX'e'r0†r1hjƒ†r2jj½†r3jûXfalser4†r5hjv†r6jj½†r7jRX}}r8†r9hX

r:†r;jRX{{r<†r=jj½†r>hxXdate7r?†r@hjn†rAjXdaterB†rCjj½†rDjRX}}rE†rFhXÀ
--DATA--
date_default_timezone_set('Europe/Paris');
return array(
    'date1' => mktime(13, 45, 0, 10, 4, 2010),
    'date2' => new DateTime('2010-10-04 13:45'),
    'date3' => '2010-10-04 13:45',
    'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
    'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(),
    'date6' => new DateTime('2010-10-04 13:45', new DateTimeZone('America/New_York')),
    'date7' => '2010-01-28T15:00:00+05:00',
    'timezone1' => new DateTimeZone('America/New_York'),
)
--EXPECT--
October 4, 2010 13:45
04/10/2010
04/10/2010 19:45:00
04/10/2010 19:45:00 +08:00
04/10/2010 06:45:00 -05:00
Europe/Paris
04/10/2010 13:45:00

October 4, 2010 13:45
04/10/2010
04/10/2010 19:45:00
04/10/2010 07:45:00
04/10/2010 13:45:00

October 4, 2010 13:45
04/10/2010

October 4, 2010 15:45
04/10/2010

January 2, 1964 04:04
02/01/1964

04/10/2010 19:45:00 +02:00
05/10/2010 01:45:00 +08:00
04/10/2010 13:45:00 -04:00
Europe/Paris
America/New_York

January 28, 2010 11:00
--TEST--
"default" filter
--TEMPLATE--
Variable:
rG†rHjRX{{rI†rJjj½†rKhxX
definedVarrL†rMjX                  rN†rOhjn†rPjXdefaultrQ†rRhjr†rSjŒX	'default'rT†rUhjv†rVjj½†rWjÃXisrX†rYjj½†rZjXsamer[†r\jj½†r]hxXasr^†r_hjr†r`jŒX	'default'ra†rbhjv†rcjj½†rdhjʆrejj½†rfjŒX'ko'rg†rhjj½†rihj±†rjjj½†rkjŒX'ok'rl†rmjj½†rnjRX}}ro†rphj!†rqjRX{{rr†rsjj½†rthxXzeroVarru†rvjX                     rw†rxhjn†ryjXdefaultrz†r{hjr†r|jŒX	'default'r}†r~hjv†rjj½†r€jÃXisr†r‚jj½†rƒjXsamer„†r…jj½†r†hxXasr‡†rˆhjr†r‰jŒX	'default'rІr‹hjv†rŒjj½†rhjʆrŽjj½†rjŒX'ko'r†r‘jj½†r’hj±†r“jj½†r”jŒX'ok'r•†r–jj½†r—jRX}}r˜†r™hj!†ršjRX{{r›†rœjj½†rhxXemptyVarrž†rŸjX                    r †r¡hjn†r¢jXdefaultr£†r¤hjr†r¥jŒX	'default'r¦†r§hjv†r¨jj½†r©jÃXisrª†r«jj½†r¬jXsamer­†r®jj½†r¯hxXasr°†r±hjr†r²jŒX	'default'r³†r´hjv†rµjj½†r¶hjʆr·jj½†r¸jŒX'ok'r¹†rºjj½†r»hj±†r¼jj½†r½jŒX'ko'r¾†r¿jj½†rÀjRX}}rÁ†rÂhj!†rÃjRX{{rĆrÅjj½†rÆhxXnullVarrdžrÈjX                     rɆrÊhjn†rËjXdefaultr̆rÍhjr†rÎjŒX	'default'rφrÐhjv†rÑjj½†rÒjÃXisrÓ†rÔjj½†rÕjXsamerÖ†r×jj½†rØhxXasrÙ†rÚhjr†rÛjŒX	'default'r܆rÝhjv†rÞjj½†rßhjʆràjj½†rájŒX'ok'râ†rãjj½†rähj±†råjj½†ræjŒX'ko'rç†rèjj½†réjRX}}rê†rëhj!†rìjRX{{rí†rîjj½†rïhxXundefinedVarrð†rñjX                rò†róhjn†rôjXdefaultrõ†röhjr†r÷jŒX	'default'rø†rùhjv†rújj½†rûjÃXisrü†rýjj½†rþjXsamerÿ†rjj½†rhxXasr†rhjr†rjŒX	'default'r†rhjv†rjj½†rhjʆr	jj½†r
jŒX'ok'r†rjj½†r
hj±†rjj½†rjŒX'ko'r†rjj½†rjRX}}r†rhX
Array access:
r†rjRX{{r†rjj½†rhxXnestedr†rhxX.definedVarr†rjX           r†rhjn†r jXdefaultr!†r"hjr†r#jŒX	'default'r$†r%hjv†r&jj½†r'jÃXisr(†r)jj½†r*jXsamer+†r,jj½†r-hxXasr.†r/hjr†r0jŒX	'default'r1†r2hjv†r3jj½†r4hjʆr5jj½†r6jŒX'ko'r7†r8jj½†r9hj±†r:jj½†r;jŒX'ok'r<†r=jj½†r>jRX}}r?†r@hj!†rAjRX{{rB†rCjj½†rDhxXnestedrE†rFhj=†rGjŒX'definedVar'rH†rIhjA†rJjX        rK†rLhjn†rMjXdefaultrN†rOhjr†rPjŒX	'default'rQ†rRhjv†rSjj½†rTjÃXisrU†rVjj½†rWjXsamerX†rYjj½†rZhxXasr[†r\hjr†r]jŒX	'default'r^†r_hjv†r`jj½†rahjʆrbjj½†rcjŒX'ko'rd†rejj½†rfhj±†rgjj½†rhjŒX'ok'ri†rjjj½†rkjRX}}rl†rmhj!†rnjRX{{ro†rpjj½†rqhxXnestedrr†rshxX.zeroVarrt†rujX              rv†rwhjn†rxjXdefaultry†rzhjr†r{jŒX	'default'r|†r}hjv†r~jj½†rjÃXisr€†rjj½†r‚jXsamerƒ†r„jj½†r…hxXasr††r‡hjr†rˆjŒX	'default'r‰†rŠhjv†r‹jj½†rŒhjʆrjj½†rŽjŒX'ko'r†rjj½†r‘hj±†r’jj½†r“jŒX'ok'r”†r•jj½†r–jRX}}r—†r˜hj!†r™jRX{{rš†r›jj½†rœhxXnestedr†ržhxX	.emptyVarrŸ†r jX
             r¡†r¢hjn†r£jXdefaultr¤†r¥hjr†r¦jŒX	'default'r§†r¨hjv†r©jj½†rªjÃXisr«†r¬jj½†r­jXsamer®†r¯jj½†r°hxXasr±†r²hjr†r³jŒX	'default'r´†rµhjv†r¶jj½†r·hjʆr¸jj½†r¹jŒX'ok'rº†r»jj½†r¼hj±†r½jj½†r¾jŒX'ko'r¿†rÀjj½†rÁjRX}}r†rÃhj!†rÄjRX{{rņrÆjj½†rÇhxXnestedrȆrÉhxX.nullVarrʆrËjX              r̆rÍhjn†rÎjXdefaultrφrÐhjr†rÑjŒX	'default'rÒ†rÓhjv†rÔjj½†rÕjÃXisrÖ†r×jj½†rØjXsamerÙ†rÚjj½†rÛhxXasr܆rÝhjr†rÞjŒX	'default'r߆ràhjv†rájj½†râhjʆrãjj½†räjŒX'ok'rå†ræjj½†rçhj±†rèjj½†réjŒX'ko'rê†rëjj½†rìjRX}}rí†rîhj!†rïjRX{{rð†rñjj½†ròhxXnestedró†rôhxX
.undefinedVarrõ†röjX	         r÷†røhjn†rùjXdefaultrú†rûhjr†rüjŒX	'default'rý†rþhjv†rÿjj½†rjÃXisr†rjj½†rjXsamer†rjj½†rhxXasr†rhjr†r	jŒX	'default'r
†rhjv†rjj½†r
hjʆrjj½†rjŒX'ok'r†rjj½†rhj±†rjj½†rjŒX'ko'r†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rhxXnestedr†rhj=†r jŒX'undefinedVar'r!†r"hjA†r#jX      r$†r%hjn†r&jXdefaultr'†r(hjr†r)jŒX	'default'r*†r+hjv†r,jj½†r-jÃXisr.†r/jj½†r0jXsamer1†r2jj½†r3hxXasr4†r5hjr†r6jŒX	'default'r7†r8hjv†r9jj½†r:hjʆr;jj½†r<jŒX'ok'r=†r>jj½†r?hj±†r@jj½†rAjŒX'ko'rB†rCjj½†rDjRX}}rE†rFhj!†rGjRX{{rH†rIjj½†rJhxXundefinedVarrK†rLhxX.foorM†rNjX            rO†rPhjn†rQjXdefaultrR†rShjr†rTjŒX	'default'rU†rVhjv†rWjj½†rXjÃXisrY†rZjj½†r[jXsamer\†r]jj½†r^hxXasr_†r`hjr†rajŒX	'default'rb†rchjv†rdjj½†rehjʆrfjj½†rgjŒX'ok'rh†rijj½†rjhj±†rkjj½†rljŒX'ko'rm†rnjj½†rojRX}}rp†rqhX
Plain values:
rr†rsjRX{{rt†rujj½†rvjŒX	'defined'rw†rxjX                   ry†rzhjn†r{jXdefaultr|†r}hjr†r~jŒX	'default'r†r€hjv†rjj½†r‚jÃXisrƒ†r„jj½†r…jXsamer††r‡jj½†rˆhxXasr‰†rŠhjr†r‹jŒX	'default'rŒ†rhjv†rŽjj½†rhjʆrjj½†r‘jŒX'ko'r’†r“jj½†r”hj±†r•jj½†r–jŒX'ok'r—†r˜jj½†r™jRX}}rš†r›hj!†rœjRX{{r†ržjj½†rŸjj¯†r jX                           r¡†r¢hjn†r£jXdefaultr¤†r¥hjr†r¦jŒX	'default'r§†r¨hjv†r©jj½†rªjÃXisr«†r¬jj½†r­jXsamer®†r¯jj½†r°hxXasr±†r²hjr†r³jŒX	'default'r´†rµhjv†r¶jj½†r·hjʆr¸jj½†r¹jŒX'ko'rº†r»jj½†r¼hj±†r½jj½†r¾jŒX'ok'r¿†rÀjj½†rÁjRX}}r†rÃhj!†rÄjRX{{rņrÆjj½†rÇjŒX''rȆrÉjX                          rʆrËhjn†rÌjXdefaultr͆rÎhjr†rÏjŒX	'default'rІrÑhjv†rÒjj½†rÓjÃXisrÔ†rÕjj½†rÖjXsamer׆rØjj½†rÙhxXasrÚ†rÛhjr†rÜjŒX	'default'r݆rÞhjv†rßjj½†ràhjʆrájj½†râjŒX'ok'rã†räjj½†råhj±†ræjj½†rçjŒX'ko'rè†réjj½†rêjRX}}rë†rìhj!†ríjRX{{rî†rïjj½†rðjûXnullrñ†ròjX                        ró†rôhjn†rõjXdefaultrö†r÷hjr†røjŒX	'default'rù†rúhjv†rûjj½†rüjÃXisrý†rþjj½†rÿjXsamer†rjj½†rhxXasr†rhjr†rjŒX	'default'r†rhjv†rjj½†r	hjʆr
jj½†rjŒX'ok'r†r
jj½†rhj±†rjj½†rjŒX'ko'r†rjj½†rjRX}}r†rhX

Precedence:
r†rjRX{{r†rjj½†rjŒX'o'r†rjj½†rhj1†rjj½†rhxXnullVarr †r!jX               r"†r#hjn†r$jXdefaultr%†r&hjr†r'jŒX'k'r(†r)hjv†r*jj½†r+jRX}}r,†r-hj!†r.jRX{{r/†r0jj½†r1jŒX'o'r2†r3jj½†r4hj1†r5jj½†r6hxXnestedr7†r8hxX.nullVarr9†r:jX        r;†r<hjn†r=jXdefaultr>†r?hjr†r@jŒX'k'rA†rBhjv†rCjj½†rDjRX}}rE†rFhX
Object methods:
rG†rHjRX{{rI†rJjj½†rKhxXobjectrL†rMhxX.foorN†rOjX                  rP†rQhjn†rRjXdefaultrS†rThjr†rUjŒX	'default'rV†rWhjv†rXjj½†rYjÃXisrZ†r[jj½†r\jXsamer]†r^jj½†r_hxXasr`†rahjr†rbjŒX	'default'rc†rdhjv†rejj½†rfhjʆrgjj½†rhjŒX'ko'ri†rjjj½†rkhj±†rljj½†rmjŒX'ok'rn†rojj½†rpjRX}}rq†rrhj!†rsjRX{{rt†rujj½†rvhxXobjectrw†rxhxX.undefinedMethodry†rzjX      r{†r|hjn†r}jXdefaultr~†rhjr†r€jŒX	'default'r†r‚hjv†rƒjj½†r„jÃXisr…†r†jj½†r‡jXsamerˆ†r‰jj½†rŠhxXasr‹†rŒhjr†rjŒX	'default'rކrhjv†rjj½†r‘hjʆr’jj½†r“jŒX'ok'r”†r•jj½†r–hj±†r—jj½†r˜jŒX'ko'r™†ršjj½†r›jRX}}rœ†rhj!†ržjRX{{rŸ†r jj½†r¡hxXobjectr¢†r£hxX.getFoor¤†r¥hjr†r¦hjv†r§jX
             r¨†r©hjn†rªjXdefaultr«†r¬hjr†r­jŒX	'default'r®†r¯hjv†r°jj½†r±jÃXisr²†r³jj½†r´jXsamerµ†r¶jj½†r·hxXasr¸†r¹hjr†rºjŒX	'default'r»†r¼hjv†r½jj½†r¾hjʆr¿jj½†rÀjŒX'ko'rÁ†rÂjj½†rÃhj±†rÄjj½†rÅjŒX'ok'rƆrÇjj½†rÈjRX}}rɆrÊhj!†rËjRX{{r̆rÍjj½†rÎhxXobjectrφrÐhxX.getFoorцrÒhjr†rÓjŒX'a'rÔ†rÕhjv†rÖjX
          r׆rØhjn†rÙjXdefaultrÚ†rÛhjr†rÜjŒX	'default'r݆rÞhjv†rßjj½†ràjÃXisrá†râjj½†rãjXsamerä†råjj½†ræhxXasrç†rèhjr†réjŒX	'default'rê†rëhjv†rìjj½†ríhjʆrîjj½†rïjŒX'ko'rð†rñjj½†ròhj±†rójj½†rôjŒX'ok'rõ†röjj½†r÷jRX}}rø†rùhj!†rújRX{{rû†rüjj½†rýhxXobjectrþ†rÿhxX.undefinedMethodr†rhjr†rhjv†rjX    r†rhjn†rjXdefaultr†rhjr†r	jŒX	'default'r
†rhjv†rjj½†r
jÃXisr†rjj½†rjXsamer†rjj½†rhxXasr†rhjr†rjŒX	'default'r†rhjv†rjj½†rhjʆrjj½†rjŒX'ok'r†rjj½†rhj±†r jj½†r!jŒX'ko'r"†r#jj½†r$jRX}}r%†r&hj!†r'jRX{{r(†r)jj½†r*hxXobjectr+†r,hxX.undefinedMethodr-†r.hjr†r/jŒX'a'r0†r1hjv†r2jj½†r3hjn†r4jXdefaultr5†r6hjr†r7jŒX	'default'r8†r9hjv†r:jj½†r;jÃXisr<†r=jj½†r>jXsamer?†r@jj½†rAhxXasrB†rChjr†rDjŒX	'default'rE†rFhjv†rGjj½†rHhjʆrIjj½†rJjŒX'ok'rK†rLjj½†rMhj±†rNjj½†rOjŒX'ko'rP†rQjj½†rRjRX}}rS†rThX
Deep nested:
rU†rVjRX{{rW†rXjj½†rYhxXnestedrZ†r[hxX
.undefinedVarr\†r]hxX.foor^†r_hxX.barr`†rajj½†rbhjn†rcjXdefaultrd†rehjr†rfjŒX	'default'rg†rhhjv†rijj½†rjjÃXisrk†rljj½†rmjXsamern†rojj½†rphxXasrq†rrhjr†rsjŒX	'default'rt†ruhjv†rvjj½†rwhjʆrxjj½†ryjŒX'ok'rz†r{jj½†r|hj±†r}jj½†r~jŒX'ko'r†r€jj½†rjRX}}r‚†rƒhj!†r„jRX{{r…†r†jj½†r‡hxXnestedrˆ†r‰hxX
.definedArrayrІr‹jX.0rŒ†rjX       rކrhjn†rjXdefaultr‘†r’hjr†r“jŒX	'default'r”†r•hjv†r–jj½†r—jÃXisr˜†r™jj½†ršjXsamer›†rœjj½†rhxXasrž†rŸhjr†r jŒX	'default'r¡†r¢hjv†r£jj½†r¤hjʆr¥jj½†r¦jŒX'ko'r§†r¨jj½†r©hj±†rªjj½†r«jŒX'ok'r¬†r­jj½†r®jRX}}r¯†r°hj!†r±jRX{{r²†r³jj½†r´hxXnestedrµ†r¶hj=†r·jŒX'definedArray'r¸†r¹hjA†rºhj=†r»jj¯†r¼hjA†r½jX   r¾†r¿hjn†rÀjXdefaultrÁ†rÂhjr†rÃjŒX	'default'rĆrÅhjv†rÆjj½†rÇjÃXisrȆrÉjj½†rÊjXsamerˆrÌjj½†rÍhxXasrΆrÏhjr†rÐjŒX	'default'rцrÒhjv†rÓjj½†rÔhjʆrÕjj½†rÖjŒX'ko'r׆rØjj½†rÙhj±†rÚjj½†rÛjŒX'ok'r܆rÝjj½†rÞjRX}}r߆ràhj!†rájRX{{râ†rãjj½†rähxXobjectrå†ræhxX.selfrç†rèhxX.fooré†rêjX
             rë†rìhjn†ríjXdefaultrî†rïhjr†rðjŒX	'default'rñ†ròhjv†rójj½†rôjÃXisrõ†röjj½†r÷jXsamerø†rùjj½†rúe(hxXasrû†rühjr†rýjŒX	'default'rþ†rÿhjv†rjj½†rhjʆrjj½†rjŒX'ko'r†rjj½†rhj±†rjj½†rjŒX'ok'r	†r
jj½†rjRX}}r†r
hj!†rjRX{{r†rjj½†rhxXobjectr†rhxX.selfr†rhxX.undefinedMethodr†rjj½†rhjn†rjXdefaultr†rhjr†rjŒX	'default'r†rhjv†rjj½†r jÃXisr!†r"jj½†r#jXsamer$†r%jj½†r&hxXasr'†r(hjr†r)jŒX	'default'r*†r+hjv†r,jj½†r-hjʆr.jj½†r/jŒX'ok'r0†r1jj½†r2hj±†r3jj½†r4jŒX'ko'r5†r6jj½†r7jRX}}r8†r9hj!†r:jRX{{r;†r<jj½†r=hxXobjectr>†r?hxX.undefinedMethodr@†rAhxX.selfrB†rCjj½†rDhjn†rEjXdefaultrF†rGhjr†rHjŒX	'default'rI†rJhjv†rKjj½†rLjÃXisrM†rNjj½†rOjXsamerP†rQjj½†rRhxXasrS†rThjr†rUjŒX	'default'rV†rWhjv†rXjj½†rYhjʆrZjj½†r[jŒX'ok'r\†r]jj½†r^hj±†r_jj½†r`jŒX'ko'ra†rbjj½†rcjRX}}rd†rehXÑ
--DATA--
return array(
    'definedVar' => 'defined',
    'zeroVar'    => 0,
    'emptyVar'   => '',
    'nullVar'    => null,
    'nested'     => array(
        'definedVar'   => 'defined',
        'zeroVar'      => 0,
        'emptyVar'     => '',
        'nullVar'      => null,
        'definedArray' => array(0),
    ),
    'object' => new TwigTestFoo(),
)
--CONFIG--
return array('strict_variables' => false)
--EXPECT--
Variable:
ok
ok
ok
ok
ok
Array access:
ok
ok
ok
ok
ok
ok
ok
ok
Plain values:
ok
ok
ok
ok
Precedence:
ok
ok
Object methods:
ok
ok
ok
ok
ok
ok
Deep nested:
ok
ok
ok
ok
ok
ok
--DATA--
return array(
    'definedVar' => 'defined',
    'zeroVar'    => 0,
    'emptyVar'   => '',
    'nullVar'    => null,
    'nested'     => array(
        'definedVar'   => 'defined',
        'zeroVar'      => 0,
        'emptyVar'     => '',
        'nullVar'      => null,
        'definedArray' => array(0),
    ),
    'object' => new TwigTestFoo(),
)
--CONFIG--
return array('strict_variables' => true)
--EXPECT--
Variable:
ok
ok
ok
ok
ok
Array access:
ok
ok
ok
ok
ok
ok
ok
ok
Plain values:
ok
ok
ok
ok
Precedence:
ok
ok
Object methods:
ok
ok
ok
ok
ok
ok
Deep nested:
ok
ok
ok
ok
ok
ok
--TEST--
dynamic filter
--TEMPLATE--
rf†rgjRX{{rh†rijj½†rjjŒX'bar'rk†rlhjn†rmjXfoo_pathrn†rojj½†rpjRX}}rq†rrhj!†rsjRX{{rt†rujj½†rvjŒX'bar'rw†rxhjn†ryjXa_foo_b_barrz†r{jj½†r|jRX}}r}†r~hX£
--DATA--
return array()
--EXPECT--
foo/bar
a/b/bar
--TEST--
"escape" filter does not escape with the html strategy when using the html_attr strategy
--TEMPLATE--
r†r€jRX{{r†r‚jj½†rƒjŒX'<br />'r„†r…hjn†r†jXescaper‡†rˆhjr†r‰jŒX'html_attr'rІr‹hjv†rŒjj½†rjRX}}rކrhXa
--DATA--
return array()
--EXPECT--
&lt;br&#x20;&#x2F;&gt;
--TEST--
"escape" filter
--TEMPLATE--
r†r‘jRX{{r’†r“jj½†r”jñX!"愛していますか? <br />"r•†r–hjn†r—jXer˜†r™jj½†ršjRX}}r›†rœhXp
--DATA--
return array()
--EXPECT--
愛していますか? &lt;br /&gt;
--TEST--
"escape" filter
--TEMPLATE--
r†ržjRX{{rŸ†r jj½†r¡jñX"foo <br />"r¢†r£hjn†r¤jj˜†r¥jj½†r¦jRX}}r§†r¨hXZ
--DATA--
return array()
--EXPECT--
foo &lt;br /&gt;
--TEST--
"first" filter
--TEMPLATE--
r©†rªjRX{{r«†r¬jj½†r­hj=†r®jj†r¯hjƒ†r°jj½†r±jj††r²hjƒ†r³jj½†r´jjn†rµhjƒ†r¶jj½†r·jj̆r¸hjA†r¹hjn†rºjXfirstr»†r¼jj½†r½jRX}}r¾†r¿hj!†rÀjRX{{rÁ†rÂjj½†rÃhj­†rÄhxj/†rÅhj±†rÆjj½†rÇjj†rÈhjƒ†rÉjj½†rÊhxjü†rËhj±†rÌjj½†rÍjj††rÎhjƒ†rÏjj½†rÐhxXcrцrÒhj±†rÓjj½†rÔjjn†rÕhjƒ†rÖjj½†r×hxXdr؆rÙhj±†rÚjj½†rÛjj̆rÜhj½†rÝhjn†rÞjXfirstr߆ràjj½†rájRX}}râ†rãhj!†räjRX{{rå†ræjj½†rçjŒX'1234'rè†réhjn†rêjXfirstrë†rìjj½†ríjRX}}rî†rïhj!†rðjRX{{rñ†ròjj½†róhxXarrrô†rõhjn†röjXfirstr÷†røjj½†rùjRX}}rú†rûhj!†rüjRX{{rý†rþjj½†rÿjŒX	'Ä€é'r†rhjn†rjXfirstr†rjj½†rjRX}}r†rhj!†rjRX{{r	†r
jj½†rjŒX''r†r
hjn†rjXfirstr†rjj½†rjRX}}r†rhX€
--DATA--
return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
--EXPECT--
1
1
1
1
Ä
--TEST--
"escape" filter
--TEMPLATE--
r†rjRX{%r†rjj½†rjÃXsetr†rjj½†rhxXfoor†rjj½†rjRX%}r†r hX
    foo<br />
r!†r"jRX{%r#†r$jj½†r%jÃXendsetr&†r'jj½†r(jRX%}r)†r*hX

r+†r,jRX{{r-†r.jj½†r/hxXfoor0†r1hjn†r2jj˜†r3hjr†r4jŒX'html'r5†r6hjv†r7jj½†r8jjv†r9jRX}}r:†r;hj!†r<jRX{{r=†r>jj½†r?hxXfoor@†rAhjn†rBjj˜†rChjr†rDjŒX'js'rE†rFhjv†rGjj½†rHjRX}}rI†rJhj!†rKjRX{%rL†rMjj½†rNjÃX
autoescaperO†rPjj½†rQjûXtruerR†rSjj½†rTjRX%}rU†rVhX
    rW†rXjRX{{rY†rZjj½†r[hxXfoor\†r]jj½†r^jRX}}r_†r`hj!†rajRX{%rb†rcjj½†rdjÃX
endautoescapere†rfjj½†rgjRX%}rh†rihXš
--DATA--
return array()
--EXPECT--
    foo&lt;br /&gt;
\x20\x20\x20\x20foo\x3Cbr\x20\x2F\x3E\x0A
        foo<br />
--TEST--
"format" filter
--TEMPLATE--
rj†rkjRX{{rl†rmjj½†rnhxXstringro†rphjn†rqjXformatrr†rshjr†rthxXfooru†rvhjƒ†rwjj½†rxjjn†ryhjv†rzjj½†r{jRX}}r|†r}hXq
--DATA--
return array('string' => '%s/%d', 'foo' => 'bar')
--EXPECT--
bar/3
--TEST--
"join" filter
--TEMPLATE--
r~†rjRX{{r€†rjj½†r‚hj=†rƒjñX"foo"r„†r…hjƒ†r†jj½†r‡jñX"bar"rˆ†r‰hjA†rŠhjn†r‹jXjoinrŒ†rhjr†rŽjŒX', 'r†rhjv†r‘jj½†r’jRX}}r“†r”hj!†r•jRX{{r–†r—jj½†r˜hxXfoor™†ršhjn†r›jXjoinrœ†rhjr†ržjŒX', 'rŸ†r hjv†r¡jj½†r¢jRX}}r£†r¤hj!†r¥jRX{{r¦†r§jj½†r¨hxXbarr©†rªhjn†r«jXjoinr¬†r­hjr†r®jŒX', 'r¯†r°hjv†r±jj½†r²jRX}}r³†r´hX£
--DATA--
return array('foo' => new TwigTestFoo(), 'bar' => new ArrayObject(array(3, 4)))
--EXPECT--
foo, bar
1, 2
3, 4
--TEST--
"json_encode" filter
--TEMPLATE--
rµ†r¶jRX{{r·†r¸jj½†r¹jñX"foo"rº†r»hjn†r¼jXjson_encoder½†r¾hjn†r¿jXrawrÀ†rÁjj½†rÂjRX}}rÆrÄhj!†rÅjRX{{rƆrÇjj½†rÈhxXfoorɆrÊhjn†rËjXjson_encoder̆rÍhjn†rÎjXrawrφrÐjj½†rÑjRX}}rÒ†rÓhj!†rÔjRX{{rÕ†rÖjj½†r×hj=†rØhxXfoorÙ†rÚhjƒ†rÛjj½†rÜjñX"foo"r݆rÞhjA†rßhjn†ràjXjson_encoderá†râhjn†rãjXrawrä†råjj½†ræjRX}}rç†rèhXŠ
--DATA--
return array('foo' => new Twig_Markup('foo', 'UTF-8'))
--EXPECT--
"foo"
"foo"
["foo","foo"]
--TEST--
"last" filter
--TEMPLATE--
ré†rêjRX{{rë†rìjj½†ríhj=†rîjj†rïhjƒ†rðjj½†rñjj††ròhjƒ†rójj½†rôjjn†rõhjƒ†röjj½†r÷jj̆røhjA†rùhjn†rújXlastrû†rüjj½†rýjRX}}rþ†rÿhj!†rjRX{{r†rjj½†rhj­†rhxj/†rhj±†rjj½†rjj†rhjƒ†r	jj½†r
hxjü†rhj±†rjj½†r
jj††rhjƒ†rjj½†rhxjцrhj±†rjj½†rjjn†rhjƒ†rjj½†rhxj؆rhj±†rjj½†rjj̆rhj½†rhjn†rjXlastr†rjj½†rjRX}}r †r!hj!†r"jRX{{r#†r$jj½†r%jŒX'1234'r&†r'hjn†r(jXlastr)†r*jj½†r+jRX}}r,†r-hj!†r.jRX{{r/†r0jj½†r1hxXarrr2†r3hjn†r4jXlastr5†r6jj½†r7jRX}}r8†r9hj!†r:jRX{{r;†r<jj½†r=jŒX	'Ä€é'r>†r?hjn†r@jXlastrA†rBjj½†rCjRX}}rD†rEhj!†rFjRX{{rG†rHjj½†rIjŒX''rJ†rKhjn†rLjXlastrM†rNjj½†rOjRX}}rP†rQhX€
--DATA--
return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
--EXPECT--
4
4
4
4
é
--TEST--
"length" filter
--TEMPLATE--
rR†rSjRX{{rT†rUjj½†rVhxXarrayrW†rXhjn†rYjXlengthrZ†r[jj½†r\jRX}}r]†r^hj!†r_jRX{{r`†rajj½†rbhxXstringrc†rdhjn†rejXlengthrf†rgjj½†rhjRX}}ri†rjhj!†rkjRX{{rl†rmjj½†rnhxXnumberro†rphjn†rqjXlengthrr†rsjj½†rtjRX}}ru†rvhj!†rwjRX{{rx†ryjj½†rzhxXmarkupr{†r|hjn†r}jXlengthr~†rjj½†r€jRX}}r†r‚hXç
--DATA--
return array('array' => array(1, 4), 'string' => 'foo', 'number' => 1000, 'markup' => new Twig_Markup('foo', 'UTF-8'))
--EXPECT--
2
3
4
3
--TEST--
"length" filter
--CONDITION--
function_exists('mb_get_info')
--TEMPLATE--
rƒ†r„jRX{{r…†r†jj½†r‡hxXstringrˆ†r‰hjn†rŠjXlengthr‹†rŒjj½†rjRX}}rކrhj!†rjRX{{r‘†r’jj½†r“hxXmarkupr”†r•hjn†r–jXlengthr—†r˜jj½†r™jRX}}rš†r›hX
--DATA--
return array('string' => 'été', 'markup' => new Twig_Markup('foo', 'UTF-8'))
--EXPECT--
3
3
--TEST--
"merge" filter
--TEMPLATE--
rœ†rjRX{{rž†rŸjj½†r hxXitemsr¡†r¢hjn†r£jXmerger¤†r¥hjr†r¦hj­†r§jŒX'bar'r¨†r©hj±†rªjj½†r«jŒX'foo'r¬†r­hj½†r®hjv†r¯hjn†r°jXjoinr±†r²jj½†r³jRX}}r´†rµhj!†r¶jRX{{r·†r¸jj½†r¹hxXitemsrº†r»hjn†r¼jXmerger½†r¾hjr†r¿hj­†rÀjŒX'bar'rÁ†rÂhj±†rÃjj½†rÄjŒX'foo'rņrÆhj½†rÇhjv†rÈhjn†rÉjXkeysrʆrËhjn†rÌjXjoinr͆rÎjj½†rÏjRX}}rІrÑhj!†rÒjRX{{rÓ†rÔjj½†rÕhj­†rÖjŒX'bar'r׆rØhj±†rÙjj½†rÚjŒX'foo'rÛ†rÜhj½†rÝhjn†rÞjXmerger߆ràhjr†ráhxXitemsrâ†rãhjv†rähjn†råjXjoinræ†rçjj½†rèjRX}}ré†rêhj!†rëjRX{{rì†ríjj½†rîhj­†rïjŒX'bar'rð†rñhj±†ròjj½†rójŒX'foo'rô†rõhj½†röhjn†r÷jXmergerø†rùhjr†rúhxXitemsrû†rühjv†rýhjn†rþjXkeysrÿ†rhjn†rjXjoinr†rjj½†rjRX}}r†rhj!†rjRX{{r†r	jj½†r
hxXnumericsr†rhjn†r
jXmerger†rhjr†rhj=†rjj̆rhjƒ†rjj½†rjj†rhjƒ†rjj½†rjX6r†rhjA†rhjv†rhjn†rjXjoinr†rjj½†rjRX}}r †r!hXª
--DATA--
return array('items' => array('foo' => 'bar'), 'numerics' => array(1, 2, 3))
--EXPECT--
barfoo
foobar
foobar
barfoo
123456
--TEST--
"nl2br" filter
--TEMPLATE--
r"†r#jRX{{r$†r%jj½†r&jñX;"I like Twig.\nYou will like it too.\n\nEverybody like it!"r'†r(hjn†r)jXnl2brr*†r+jj½†r,jRX}}r-†r.hj!†r/jRX{{r0†r1jj½†r2hxXtextr3†r4hjn†r5jXnl2brr6†r7jj½†r8jRX}}r9†r:hX=
--DATA--
return array('text' => "If you have some <strong>HTML</strong>\nit will be escaped.")
--EXPECT--
I like Twig.<br />
You will like it too.<br />
<br />
Everybody like it!
If you have some &lt;strong&gt;HTML&lt;/strong&gt;<br />
it will be escaped.
--TEST--
"number_format" filter with defaults.
--TEMPLATE--
r;†r<jRX{{r=†r>jj½†r?jj††r@jj¯†rAhjn†rBjX
number_formatrC†rDjj½†rEjRX}}rF†rGhj!†rHjRX{{rI†rJjj½†rKjj††rLjX0.25rM†rNhjn†rOjX
number_formatrP†rQjj½†rRjRX}}rS†rThj!†rUjRX{{rV†rWjj½†rXjj††rYjX0.25rZ†r[hjn†r\jX
number_formatr]†r^hjr†r_jj†r`hjv†rajj½†rbjRX}}rc†rdhj!†rejRX{{rf†rgjj½†rhjj††rijX0.25rj†rkhjn†rljX
number_formatrm†rnhjr†rojj††rphjƒ†rqjj½†rrjŒX','rs†rthjv†rujj½†rvjRX}}rw†rxhj!†ryjRX{{rz†r{jj½†r|jj†r}jj¯†r~jj††rjX0.25r€†rhjn†r‚jX
number_formatrƒ†r„jj½†r…jRX}}r††r‡hj!†rˆjRX{{r‰†rŠjj½†r‹jj†rŒjj¯†rjj††rŽjX0.25r†rhjn†r‘jX
number_formatr’†r“hjr†r”jj††r•hjƒ†r–jj½†r—jŒX','r˜†r™hjv†ršjj½†r›jRX}}rœ†rhj!†ržjRX{{rŸ†r jj½†r¡jj†r¢jj¯†r£jj††r¤jX0.25r¥†r¦hjn†r§jX
number_formatr¨†r©hjr†rªjj††r«hjƒ†r¬jj½†r­jŒX','r®†r¯hjƒ†r°jj½†r±jŒX'.'r²†r³hjv†r´jj½†rµjRX}}r¶†r·hX¿
--DATA--
$twig->getExtension('core')->setNumberFormat(2, '!', '=');
return array();
--EXPECT--
20!00
20!25
20!3
20,25
1=020!25
1=020,25
1.020,25
--TEST--
"number_format" filter
--TEMPLATE--
r¸†r¹jRX{{rº†r»jj½†r¼jj††r½jj¯†r¾hjn†r¿jX
number_formatrÀ†rÁjj½†rÂjRX}}rÆrÄhj!†rÅjRX{{rƆrÇjj½†rÈjj††rÉjX0.25rʆrËhjn†rÌjX
number_formatr͆rÎjj½†rÏjRX}}rІrÑhj!†rÒjRX{{rÓ†rÔjj½†rÕjj††rÖjX0.25r׆rØhjn†rÙjX
number_formatrÚ†rÛhjr†rÜjj††rÝhjv†rÞjj½†rßjRX}}rà†ráhj!†râjRX{{rã†räjj½†råjj††ræjX0.25rç†rèhjn†réjX
number_formatrê†rëhjr†rìjj††ríhjƒ†rîjj½†rïjŒX','rð†rñhjv†ròjj½†rójRX}}rô†rõhj!†röjRX{{r÷†røjj½†rùjj†rújj¯†rûjj††rüjX0.25rý†rþhjn†rÿjX
number_formatr†rhjr†rjj††rhjƒ†rjj½†rjŒX','r†rhjv†rjj½†r	jRX}}r
†rhj!†rjRX{{r
†rjj½†rjj†rjj¯†rjj††rjX0.25r†rhjn†rjX
number_formatr†rhjr†rjj††rhjƒ†rjj½†rjŒX','r†rhjƒ†rjj½†rjŒX'.'r †r!hjv†r"jj½†r#jRX}}r$†r%hXp
--DATA--
return array();
--EXPECT--
20
20
20.25
20,25
1,020,25
1.020,25
--TEST--
"replace" filter
--TEMPLATE--
r&†r'jRX{{r(†r)jj½†r*jñX"I like %this% and %that%."r+†r,hjn†r-jXreplacer.†r/hjr†r0hj­†r1jŒX'%this%'r2†r3hj±†r4jj½†r5jñX"foo"r6†r7hjƒ†r8jj½†r9jŒX'%that%'r:†r;hj±†r<jj½†r=jñX"bar"r>†r?hj½†r@hjv†rAjj½†rBjRX}}rC†rDhX_
--DATA--
return array()
--EXPECT--
I like foo and bar.
--TEST--
"reverse" filter
--TEMPLATE--
rE†rFjRX{{rG†rHjj½†rIhj=†rJjj†rKhjƒ†rLjj½†rMjj††rNhjƒ†rOjj½†rPjjn†rQhjƒ†rRjj½†rSjj̆rThjA†rUhjn†rVjXreverserW†rXhjn†rYjXjoinrZ†r[hjr†r\jŒX''r]†r^hjv†r_jj½†r`jRX}}ra†rbhj!†rcjRX{{rd†rejj½†rfjŒX'1234évènement'rg†rhhjn†rijXreverserj†rkjj½†rljRX}}rm†rnhj!†rojRX{{rp†rqjj½†rrhxXarrrs†rthjn†rujXreverserv†rwhjn†rxjXjoinry†rzhjr†r{jŒX''r|†r}hjv†r~jj½†rjRX}}r€†rhj!†r‚jRX{{rƒ†r„jj½†r…hj­†r†jŒX'a'r‡†rˆhj±†r‰jj½†rŠjŒX'c'r‹†rŒhjƒ†rjj½†rŽjŒX'b'r†rhj±†r‘jj½†r’jŒX'a'r“†r”hj½†r•hjn†r–jXreverser—†r˜hjr†r™hjv†ršhjn†r›jXjoinrœ†rhjr†ržjŒX','rŸ†r hjv†r¡jj½†r¢jRX}}r£†r¤hj!†r¥jRX{{r¦†r§jj½†r¨hj­†r©jŒX'a'rª†r«hj±†r¬jj½†r­jŒX'c'r®†r¯hjƒ†r°jj½†r±jŒX'b'r²†r³hj±†r´jj½†rµjŒX'a'r¶†r·hj½†r¸hjn†r¹jXreverserº†r»hjr†r¼hxXpreserveKeysr½†r¾hj2†r¿jûXtruerÀ†rÁhjv†rÂhjn†rÃjXjoinrĆrÅhjr†rÆhxXgluerdžrÈhj2†rÉjŒX','rʆrËhjv†rÌjj½†rÍjRX}}rΆrÏhj!†rÐjRX{{rцrÒjj½†rÓhj­†rÔjŒX'a'rÕ†rÖhj±†r×jj½†rØjŒX'c'rÙ†rÚhjƒ†rÛjj½†rÜjŒX'b'r݆rÞhj±†rßjj½†ràjŒX'a'rá†râhj½†rãhjn†räjXreverserå†ræhjr†rçhxX
preserve_keysrè†réhj2†rêjûXtruerë†rìhjv†ríhjn†rîjXjoinrï†rðhjr†rñhxXgluerò†róhj2†rôjŒX','rõ†röhjv†r÷jj½†røjRX}}rù†rúhXš
--DATA--
return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
--EXPECT--
4321
tnemenèvé4321
4321
a,c
a,c
a,c
--TEST--
"round" filter
--TEMPLATE--
rû†rüjRX{{rý†rþjj½†rÿjX2.7r†rhjn†rjXroundr†rjj½†rjRX}}r†rhj!†rjRX{{r	†r
jj½†rjX2.1r†r
hjn†rjXroundr†rjj½†rjRX}}r†rhj!†rjRX{{r†rjj½†rjX2.1234r†rhjn†rjXroundr†rhjr†rjjn†rhjƒ†rjj½†r jŒX'floor'r!†r"hjv†r#jj½†r$jRX}}r%†r&hj!†r'jRX{{r(†r)jj½†r*jX2.1r+†r,hjn†r-jXroundr.†r/hjr†r0jj¯†r1hjƒ†r2jj½†r3jŒX'ceil'r4†r5hjv†r6jj½†r7jRX}}r8†r9hX

r:†r;jRX{{r<†r=jj½†r>jj††r?jX1.3r@†rAhjn†rBjXroundrC†rDhjr†rEhjv†rFjj†rGhjv†rHjRX}}rI†rJhj!†rKjRX{{rL†rMjj½†rNjj††rOjX1.3rP†rQhjn†rRjXroundrS†rThjr†rUhjv†rVjj†rWhjƒ†rXjj½†rYjŒX'ceil'rZ†r[hjv†r\jRX}}r]†r^hj!†r_jRX{{r`†rajj½†rbjj††rcjX1.3rd†rehjn†rfjXroundrg†rhhjr†rihjv†rjjj†rkhjƒ†rle(jj½†rmjŒX'floor'rn†rohjv†rpjRX}}rq†rrhX_
--DATA--
return array()
--EXPECT--
3
2
2.123
3

20
30
20
--TEST--
"slice" filter
--TEMPLATE--
rs†rtjRX{{ru†rvjj½†rwhj=†rxjj†ryhjƒ†rzjj½†r{jj††r|hjƒ†r}jj½†r~jjn†rhjƒ†r€jj½†rjj̆r‚hjA†rƒhj=†r„jj†r…hj±†r†jj††r‡hjA†rˆhjn†r‰jXjoinrІr‹hjr†rŒjŒX''r†rŽhjv†rjj½†rjRX}}r‘†r’hj!†r“jRX{{r”†r•jj½†r–hj­†r—hxj/†r˜hj±†r™jj½†ršjj†r›hjƒ†rœjj½†rhxjü†ržhj±†rŸjj½†r jj††r¡hjƒ†r¢jj½†r£hxjцr¤hj±†r¥jj½†r¦jjn†r§hjƒ†r¨jj½†r©hxj؆rªhj±†r«jj½†r¬jj̆r­hj½†r®hj=†r¯jj†r°hj±†r±jj††r²hjA†r³hjn†r´jXjoinrµ†r¶hjr†r·jŒX''r¸†r¹hjv†rºjj½†r»jRX}}r¼†r½hj!†r¾jRX{{r¿†rÀjj½†rÁhj=†rÂjj†rÃhjƒ†rÄjj½†rÅjj††rÆhjƒ†rÇjj½†rÈjjn†rÉhjƒ†rÊjj½†rËjj̆rÌhjA†rÍhj=†rÎhxXstartrφrÐhj±†rÑhxXlengthrÒ†rÓhjA†rÔhjn†rÕjXjoinrÖ†r×hjr†rØjŒX''rÙ†rÚhjv†rÛjj½†rÜjRX}}r݆rÞhj!†rßjRX{{rà†rájj½†râhj=†rãjj†rähjƒ†råjj½†ræjj††rçhjƒ†rèjj½†réjjn†rêhjƒ†rëjj½†rìjj̆ríhjA†rîhjn†rïjXslicerð†rñhjr†ròjj†róhjƒ†rôjj½†rõjj††röhjv†r÷hjn†røjXjoinrù†rúhjr†rûjŒX''rü†rýhjv†rþjj½†rÿjRX}}r †r hj!†r jRX{{r †r jj½†r hj=†r jj†r hjƒ†r jj½†r	 jj††r
 hjƒ†r jj½†r jjn†r
 hjƒ†r jj½†r jj̆r hjA†r hjn†r jXslicer †r hjr†r jj†r hjƒ†r jj½†r jj††r hjv†r hjn†r jXkeysr †r hjn†r jXjoinr †r  hjr†r! jŒX''r" †r# hjv†r$ jj½†r% jRX}}r& †r' hj!†r( jRX{{r) †r* jj½†r+ hj=†r, jj†r- hjƒ†r. jj½†r/ jj††r0 hjƒ†r1 jj½†r2 jjn†r3 hjƒ†r4 jj½†r5 jj̆r6 hjA†r7 hjn†r8 jXslicer9 †r: hjr†r; jj†r< hjƒ†r= jj½†r> jj††r? hjƒ†r@ jj½†rA jûXtruerB †rC hjv†rD hjn†rE jXkeysrF †rG hjn†rH jXjoinrI †rJ hjr†rK jŒX''rL †rM hjv†rN jj½†rO jRX}}rP †rQ hj!†rR jRX{{rS †rT jj½†rU hj­†rV hxj/†rW hj±†rX jj½†rY jj†rZ hjƒ†r[ jj½†r\ hxjü†r] hj±†r^ jj½†r_ jj††r` hjƒ†ra jj½†rb hxjцrc hj±†rd jj½†re jjn†rf hjƒ†rg jj½†rh hxj؆ri hj±†rj jj½†rk jj̆rl hj½†rm hjn†rn jXslicero †rp hjr†rq jj†rr hjƒ†rs jj½†rt jj††ru hjv†rv hjn†rw jXjoinrx †ry hjr†rz jŒX''r{ †r| hjv†r} jj½†r~ jRX}}r †r€ hj!†r jRX{{r‚ †rƒ jj½†r„ hj­†r… hxj/†r† hj±†r‡ jj½†rˆ jj†r‰ hjƒ†rŠ jj½†r‹ hxjü†rŒ hj±†r jj½†rŽ jj††r hjƒ†r jj½†r‘ hxjцr’ hj±†r“ jj½†r” jjn†r• hjƒ†r– jj½†r— hxj؆r˜ hj±†r™ jj½†rš jj̆r› hj½†rœ hjn†r jXslicerž †rŸ hjr†r  jj†r¡ hjƒ†r¢ jj½†r£ jj††r¤ hjv†r¥ hjn†r¦ jXkeysr§ †r¨ hjn†r© jXjoinrª †r« hjr†r¬ jŒX''r­ †r® hjv†r¯ jj½†r° jRX}}r± †r² hj!†r³ jRX{{r´ †rµ jj½†r¶ jŒX'1234'r· †r¸ hjn†r¹ jXslicerº †r» hjr†r¼ jj†r½ hjƒ†r¾ jj½†r¿ jj††rÀ hjv†rÁ jj½†r jRX}}rà †rÄ hj!†rÅ jRX{{rÆ †rÇ jj½†rÈ jŒX'1234'rÉ †rÊ hj=†rË jj†rÌ hj±†rÍ jj††rÎ hjA†rÏ jj½†rÐ jRX}}rÑ †rÒ hj!†rÓ jRX{{rÔ †rÕ jj½†rÖ hxXarrr× †rØ hjn†rÙ jXslicerÚ †rÛ hjr†rÜ jj†rÝ hjƒ†rÞ jj½†rß jj††rà hjv†rá hjn†râ jXjoinr㠆rä hjr†rå jŒX''ræ †rç hjv†rè jj½†ré jRX}}rê †rë hj!†rì jRX{{rí †rî jj½†rï hxXarrrð †rñ hj=†rò jj†ró hj±†rô jj††rõ hjA†rö hjn†r÷ jXjoinrø †rù hjr†rú jŒX''rû †rü hjv†rý jj½†rþ jRX}}rÿ †r!hX

r!†r!jRX{{r!†r!jj½†r!hj=†r!jj†r!hjƒ†r!jj½†r	!jj††r
!hjƒ†r!jj½†r!jjn†r
!hjƒ†r!jj½†r!jj̆r!hjA†r!hjn†r!jXslicer!†r!hjr†r!jj†r!hjv†r!hjn†r!jXjoinr!†r!hjr†r!jŒX''r!†r!hjv†r!jj½†r!jRX}}r !†r!!hj!†r"!jRX{{r#!†r$!jj½†r%!hj=†r&!jj†r'!hjƒ†r(!jj½†r)!jj††r*!hjƒ†r+!jj½†r,!jjn†r-!hjƒ†r.!jj½†r/!jj̆r0!hjA†r1!hj=†r2!jj†r3!hj±†r4!hjA†r5!hjn†r6!jXjoinr7!†r8!hjr†r9!jŒX''r:!†r;!hjv†r<!jj½†r=!jRX}}r>!†r?!hj!†r@!jRX{{rA!†rB!jj½†rC!jŒX'1234'rD!†rE!hjn†rF!jXslicerG!†rH!hjr†rI!jj†rJ!hjv†rK!jj½†rL!jRX}}rM!†rN!hj!†rO!jRX{{rP!†rQ!jj½†rR!jŒX'1234'rS!†rT!hj=†rU!jj†rV!hj±†rW!hjA†rX!jj½†rY!jRX}}rZ!†r[!hj!†r\!jRX{{r]!†r^!jj½†r_!jŒX'1234'r`!†ra!hj=†rb!hj±†rc!jj†rd!hjA†re!jj½†rf!jRX}}rg!†rh!hXÇ
--DATA--
return array('start' => 1, 'length' => 2, 'arr' => new ArrayObject(array(1, 2, 3, 4)))
--EXPECT--
23
23
23
23
01
12
23
bc
23
23
23
23

234
234
234
234
1
--TEST--
"sort" filter
--TEMPLATE--
ri!†rj!jRX{{rk!†rl!jj½†rm!hxXarray1rn!†ro!hjn†rp!jXsortrq!†rr!hjn†rs!jXjoinrt!†ru!jj½†rv!jRX}}rw!†rx!hj!†ry!jRX{{rz!†r{!jj½†r|!hxXarray2r}!†r~!hjn†r!jXsortr€!†r!hjn†r‚!jXjoinrƒ!†r„!jj½†r…!jRX}}r†!†r‡!hX‹
--DATA--
return array('array1' => array(4, 1), 'array2' => array('foo', 'bar'))
--EXPECT--
14
barfoo
--TEST--
"split" filter
--TEMPLATE--
rˆ!†r‰!jRX{{rŠ!†r‹!jj½†rŒ!jñX"one,two,three,four,five"r!†rŽ!hjn†r!jXsplitr!†r‘!hjr†r’!jŒX','r“!†r”!hjv†r•!hjn†r–!jXjoinr—!†r˜!hjr†r™!jŒX'-'rš!†r›!hjv†rœ!jj½†r!jRX}}rž!†rŸ!hj!†r !jRX{{r¡!†r¢!jj½†r£!hxXfoor¤!†r¥!hjn†r¦!jXsplitr§!†r¨!hjr†r©!jŒX','rª!†r«!hjv†r¬!hjn†r­!jXjoinr®!†r¯!hjr†r°!jŒX'-'r±!†r²!hjv†r³!jj½†r´!jRX}}rµ!†r¶!hj!†r·!jRX{{r¸!†r¹!jj½†rº!hxXfoor»!†r¼!hjn†r½!jXsplitr¾!†r¿!hjr†rÀ!jŒX','rÁ!†rÂ!hjƒ†rÃ!jj½†rÄ!jjn†rÅ!hjv†rÆ!hjn†rÇ!jXjoinrÈ!†rÉ!hjr†rÊ!jŒX'-'rË!†rÌ!hjv†rÍ!jj½†rÎ!jRX}}rÏ!†rÐ!hj!†rÑ!jRX{{rÒ!†rÓ!jj½†rÔ!hxXbazrÕ!†rÖ!hjn†r×!jXsplitrØ!†rÙ!hjr†rÚ!jŒX''rÛ!†rÜ!hjv†rÝ!hjn†rÞ!jXjoinrß!†rà!hjr†rá!jŒX'-'râ!†rã!hjv†rä!jj½†rå!jRX}}ræ!†rç!hj!†rè!jRX{{ré!†rê!jj½†rë!hxXbazrì!†rí!hjn†rî!jXsplitrï!†rð!hjr†rñ!jŒX''rò!†ró!hjƒ†rô!jj½†rõ!jj††rö!hjv†r÷!hjn†rø!jXjoinrù!†rú!hjr†rû!jŒX'-'rü!†rý!hjv†rþ!jj½†rÿ!jRX}}r"†r"hj!†r"jRX{{r"†r"jj½†r"hxXfoor"†r"hjn†r"jXsplitr	"†r
"hjr†r"jŒX','r"†r
"hjƒ†r"jj½†r"hjv†r"jj††r"hjv†r"hjn†r"jXjoinr"†r"hjr†r"jŒX'-'r"†r"hjv†r"jj½†r"jRX}}r"†r"hXä
--DATA--
return array('foo' => "one,two,three,four,five", 'baz' => '12345',)
--EXPECT--
one-two-three-four-five
one-two-three-four-five
one-two-three,four,five
1-2-3-4-5
12-34-5
one-two-three--TEST--
"trim" filter
--TEMPLATE--
r"†r"jRX{{r"†r "jj½†r!"jñX"  I like Twig.  "r""†r#"hjn†r$"jXtrimr%"†r&"jj½†r'"jRX}}r("†r)"hj!†r*"jRX{{r+"†r,"jj½†r-"hxXtextr."†r/"hjn†r0"jXtrimr1"†r2"jj½†r3"jRX}}r4"†r5"hj!†r6"jRX{{r7"†r8"jj½†r9"jñX"  foo/"r:"†r;"hjn†r<"jXtrimr="†r>"hjr†r?"jñX"/"r@"†rA"hjv†rB"jj½†rC"jRX}}rD"†rE"hX4
--DATA--
return array('text' => "  If you have some <strong>HTML</strong> it will be escaped.  ")
--EXPECT--
I like Twig.
If you have some &lt;strong&gt;HTML&lt;/strong&gt; it will be escaped.
  foo
--TEST--
"url_encode" filter for PHP < 5.4 and HHVM
--CONDITION--
defined('PHP_QUERY_RFC3986')
--TEMPLATE--
rF"†rG"jRX{{rH"†rI"jj½†rJ"hj­†rK"hxXfoorL"†rM"hj±†rN"jj½†rO"jñX"bar"rP"†rQ"hjƒ†rR"jj½†rS"hxXnumberrT"†rU"hj±†rV"jj½†rW"jjn†rX"hjƒ†rY"jj½†rZ"jñX"spéßi%l"r["†r\"hj±†r]"jj½†r^"jñX	"e%c0d@d"r_"†r`"hjƒ†ra"jj½†rb"jñX"spa ce"rc"†rd"hj±†re"jj½†rf"jñX""rg"†rh"hj½†ri"hjn†rj"jX
url_encoderk"†rl"jj½†rm"jRX}}rn"†ro"hj!†rp"jRX{{rq"†rr"jj½†rs"hj­†rt"hxXfooru"†rv"hj±†rw"jj½†rx"jñX"bar"ry"†rz"hjƒ†r{"jj½†r|"hxXnumberr}"†r~"hj±†r"jj½†r€"jjn†r"hjƒ†r‚"jj½†rƒ"jñX"spéßi%l"r„"†r…"hj±†r†"jj½†r‡"jñX	"e%c0d@d"rˆ"†r‰"hjƒ†rŠ"jj½†r‹"jñX"spa ce"rŒ"†r"hj±†rŽ"jj½†r"jñX""r"†r‘"hj½†r’"hjn†r“"jX
url_encoder”"†r•"hjn†r–"jXrawr—"†r˜"jj½†r™"jRX}}rš"†r›"hj!†rœ"jRX{{r"†rž"jj½†rŸ"hj­†r "hj½†r¡"hjn†r¢"jX
url_encoder£"†r¤"hjn†r¥"jXdefaultr¦"†r§"hjr†r¨"jñX	"default"r©"†rª"hjv†r«"jj½†r¬"jRX}}r­"†r®"hj!†r¯"jRX{{r°"†r±"jj½†r²"jŒX'spéßi%le%c0d@dspa ce'r³"†r´"hjn†rµ"jX
url_encoder¶"†r·"jj½†r¸"jRX}}r¹"†rº"hX*
--DATA--
return array()
--EXPECT--
foo=bar&amp;number=3&amp;sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&amp;spa%20ce=
foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce=
default
sp%C3%A9%C3%9Fi%25le%25c0d%40dspa%20ce
--TEST--
"url_encode" filter
--CONDITION--
defined('PHP_QUERY_RFC3986')
--TEMPLATE--
r»"†r¼"jRX{{r½"†r¾"jj½†r¿"hj­†rÀ"hxXfoorÁ"†rÂ"hj±†rÃ"jj½†rÄ"jñX"bar"rÅ"†rÆ"hjƒ†rÇ"jj½†rÈ"hxXnumberrÉ"†rÊ"hj±†rË"jj½†rÌ"jjn†rÍ"hjƒ†rÎ"jj½†rÏ"jñX"spéßi%l"rÐ"†rÑ"hj±†rÒ"jj½†rÓ"jñX	"e%c0d@d"rÔ"†rÕ"hjƒ†rÖ"jj½†r×"jñX"spa ce"rØ"†rÙ"hj±†rÚ"jj½†rÛ"jñX""rÜ"†rÝ"hj½†rÞ"hjn†rß"jX
url_encoderà"†rá"jj½†râ"jRX}}rã"†rä"hj!†rå"jRX{{ræ"†rç"jj½†rè"hj­†ré"hxXfoorê"†rë"hj±†rì"jj½†rí"jñX"bar"rî"†rï"hjƒ†rð"jj½†rñ"hxXnumberrò"†ró"hj±†rô"jj½†rõ"jjn†rö"hjƒ†r÷"jj½†rø"jñX"spéßi%l"rù"†rú"hj±†rû"jj½†rü"jñX	"e%c0d@d"rý"†rþ"hjƒ†rÿ"jj½†r#jñX"spa ce"r#†r#hj±†r#jj½†r#jñX""r#†r#hj½†r#hjn†r#jX
url_encoder	#†r
#hjn†r#jXrawr#†r
#jj½†r#jRX}}r#†r#hj!†r#jRX{{r#†r#jj½†r#hj­†r#hj½†r#hjn†r#jX
url_encoder#†r#hjn†r#jXdefaultr#†r#hjr†r#jñX	"default"r#†r#hjv†r #jj½†r!#jRX}}r"#†r##hj!†r$#jRX{{r%#†r&#jj½†r'#jŒX'spéßi%le%c0d@dspa ce'r(#†r)#hjn†r*#jX
url_encoder+#†r,#jj½†r-#jRX}}r.#†r/#hX
--DATA--
return array()
--EXPECT--
foo=bar&amp;number=3&amp;sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&amp;spa%20ce=
foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce=
default
sp%C3%A9%C3%9Fi%25le%25c0d%40dspa%20ce
--TEST--
"attribute" function
--TEMPLATE--
r0#†r1#jRX{{r2#†r3#jj½†r4#hxX	attributer5#†r6#hjr†r7#hxXobjr8#†r9#hjƒ†r:#jj½†r;#hxXmethodr<#†r=#hjv†r>#jj½†r?#jRX}}r@#†rA#hj!†rB#jRX{{rC#†rD#jj½†rE#hxX	attributerF#†rG#hjr†rH#hxXarrayrI#†rJ#hjƒ†rK#jj½†rL#hxXitemrM#†rN#hjv†rO#jj½†rP#jRX}}rQ#†rR#hj!†rS#jRX{{rT#†rU#jj½†rV#hxX	attributerW#†rX#hjr†rY#hxXobjrZ#†r[#hjƒ†r\#jj½†r]#jñX"bar"r^#†r_#hjƒ†r`#jj½†ra#hj=†rb#jñX"a"rc#†rd#hjƒ†re#jj½†rf#jñX"b"rg#†rh#hjA†ri#hjv†rj#jj½†rk#jRX}}rl#†rm#hj!†rn#jRX{{ro#†rp#jj½†rq#hxX	attributerr#†rs#hjr†rt#hxXobjru#†rv#hjƒ†rw#jj½†rx#jñX"bar"ry#†rz#hjƒ†r{#jj½†r|#hxX	argumentsr}#†r~#hjv†r#jj½†r€#jRX}}r#†r‚#hj!†rƒ#jRX{{r„#†r…#jj½†r†#hxX	attributer‡#†rˆ#hjr†r‰#hxXobjrŠ#†r‹#hjƒ†rŒ#jj½†r#hxXmethodrŽ#†r#hjv†r#jj½†r‘#jÃXisr’#†r“#jj½†r”#jXdefinedr•#†r–#jj½†r—#hjʆr˜#jj½†r™#jŒX'ok'rš#†r›#jj½†rœ#hj±†r#jj½†rž#jŒX'ko'rŸ#†r #jj½†r¡#jRX}}r¢#†r£#hj!†r¤#jRX{{r¥#†r¦#jj½†r§#hxX	attributer¨#†r©#hjr†rª#hxXobjr«#†r¬#hjƒ†r­#jj½†r®#hxX	nonmethodr¯#†r°#hjv†r±#jj½†r²#jÃXisr³#†r´#jj½†rµ#jXdefinedr¶#†r·#jj½†r¸#hjʆr¹#jj½†rº#jŒX'ok'r»#†r¼#jj½†r½#hj±†r¾#jj½†r¿#jŒX'ko'rÀ#†rÁ#jj½†rÂ#jRX}}rÃ#†rÄ#hXÿ
--DATA--
return array('obj' => new TwigTestFoo(), 'method' => 'foo', 'array' => array('foo' => 'bar'), 'item' => 'foo', 'nonmethod' => 'xxx', 'arguments' => array('a', 'b'))
--EXPECT--
foo
bar
bar_a-b
bar_a-b
ok
ko
--TEST--
"block" function
--TEMPLATE--
rÅ#†rÆ#jRX{%rÇ#†rÈ#jj½†rÉ#jÃXextendsrÊ#†rË#jj½†rÌ#jŒX'base.twig'rÍ#†rÎ#jj½†rÏ#jRX%}rÐ#†rÑ#hj!†rÒ#jRX{%rÓ#†rÔ#jj½†rÕ#jÃXblockrÖ#†r×#jj½†rØ#hxXbarrÙ#†rÚ#jj½†rÛ#jRX%}rÜ#†rÝ#hXBARrÞ#†rß#jRX{%rà#†rá#jj½†râ#jÃXendblockrã#†rä#jj½†rå#jRX%}ræ#†rç#hX
--TEMPLATE(base.twig)--
rè#†ré#jRX{%rê#†rë#jj½†rì#jÃXblockrí#†rî#jj½†rï#hxXfoorð#†rñ#jj½†rò#jRX%}ró#†rô#jRX{{rõ#†rö#jj½†r÷#híXblockrø#†rù#hjr†rú#jŒX'bar'rû#†rü#hjv†rý#jj½†rþ#jRX}}rÿ#†r$jRX{%r$†r$jj½†r$jÃXendblockr$†r$jj½†r$jRX%}r$†r$hj!†r	$jRX{%r
$†r$jj½†r$jÃXblockr
$†r$jj½†r$hxXbarr$†r$jj½†r$jRX%}r$†r$hXBAR_BASEr$†r$jRX{%r$†r$jj½†r$jÃXendblockr$†r$jj½†r$jRX%}r$†r$hXU
--DATA--
return array()
--EXPECT--
BARBAR
--TEST--
"constant" function
--TEMPLATE--
r$†r $jRX{{r!$†r"$jj½†r#$hxXconstantr$$†r%$hjr†r&$jŒX
'DATE_W3C'r'$†r($hjv†r)$jj½†r*$hX==r+$†r,$jj½†r-$hxXexpectr.$†r/$jj½†r0$hjʆr1$jj½†r2$jŒX'true'r3$†r4$jj½†r5$hj±†r6$jj½†r7$jŒX'false'r8$†r9$jj½†r:$jRX}}r;$†r<$hj!†r=$jRX{{r>$†r?$jj½†r@$hxXconstantrA$†rB$hjr†rC$jŒX'ARRAY_AS_PROPS'rD$†rE$hjƒ†rF$jj½†rG$hxXobjectrH$†rI$hjv†rJ$jj½†rK$jRX}}rL$†rM$hX‘
--DATA--
return array('expect' => DATE_W3C, 'object' => new ArrayObject(array('hi')));
--EXPECT--
true
2
--TEST--
"cycle" function
--TEMPLATE--
rN$†rO$jRX{%rP$†rQ$jj½†rR$jÃXforrS$†rT$jj½†rU$hxj܆rV$jj½†rW$jÃXinrX$†rY$jj½†rZ$jX0.r[$†r\$jX.6r]$†r^$jj½†r_$jRX%}r`$†ra$hj!†rb$jRX{{rc$†rd$jj½†re$hxXcyclerf$†rg$hjr†rh$hxXarray1ri$†rj$hjƒ†rk$jj½†rl$hxj܆rm$hjv†rn$jj½†ro$jRX}}rp$†rq$hjv†rr$jRX{{rs$†rt$jj½†ru$hxXcyclerv$†rw$hjr†rx$hxXarray2ry$†rz$hjƒ†r{$jj½†r|$hxj܆r}$hjv†r~$jj½†r$jRX}}r€$†r$hj!†r‚$jRX{%rƒ$†r„$jj½†r…$jÃXendforr†$†r‡$jj½†rˆ$jRX%}r‰$†rŠ$hXç
--DATA--
return array('array1' => array('odd', 'even'), 'array2' => array('apple', 'orange', 'citrus'))
--EXPECT--
odd-apple
even-orange
odd-citrus
even-apple
odd-orange
even-citrus
odd-apple
--TEST--
"date" function
--TEMPLATE--
r‹$†rŒ$jRX{{r$†rŽ$jj½†r$hxXdater$†r‘$hjr†r’$hxXdater“$†r”$hjƒ†r•$jj½†r–$jñX"America/New_York"r—$†r˜$hjv†r™$hjn†rš$e(jXdater›$†rœ$hjr†r$jŒX'd/m/Y H:i:s P'rž$†rŸ$hjƒ†r $jj½†r¡$jûXfalser¢$†r£$hjv†r¤$jj½†r¥$jRX}}r¦$†r§$hj!†r¨$jRX{{r©$†rª$jj½†r«$hxXdater¬$†r­$hjr†r®$hxXtimezoner¯$†r°$hj2†r±$jñX"America/New_York"r²$†r³$hjƒ†r´$jj½†rµ$hxXdater¶$†r·$hj2†r¸$hxXdater¹$†rº$hjv†r»$hjn†r¼$jXdater½$†r¾$hjr†r¿$jŒX'd/m/Y H:i:s P'rÀ$†rÁ$hjƒ†rÂ$jj½†rÃ$jûXfalserÄ$†rÅ$hjv†rÆ$jj½†rÇ$jRX}}rÈ$†rÉ$hXÊ
--DATA--
date_default_timezone_set('UTC');
return array('date' => mktime(13, 45, 0, 10, 4, 2010))
--EXPECT--
04/10/2010 09:45:00 -04:00
04/10/2010 09:45:00 -04:00
--TEST--
"date" function
--TEMPLATE--
rÊ$†rË$jRX{{rÌ$†rÍ$jj½†rÎ$hxXdaterÏ$†rÐ$hjr†rÑ$hjv†rÒ$jj½†rÓ$hX==rÔ$†rÕ$jj½†rÖ$hxXdater×$†rØ$hjr†rÙ$jŒX'now'rÚ$†rÛ$hjv†rÜ$jj½†rÝ$hjʆrÞ$jj½†rß$jŒX'OK'rà$†rá$jj½†râ$hj±†rã$jj½†rä$jŒX'KO'rå$†ræ$jj½†rç$jRX}}rè$†ré$hj!†rê$jRX{{rë$†rì$jj½†rí$hxXdaterî$†rï$hjr†rð$hxXdate1rñ$†rò$hjv†ró$jj½†rô$hX==rõ$†rö$jj½†r÷$hxXdaterø$†rù$hjr†rú$jŒX'2010-10-04 13:45'rû$†rü$hjv†rý$jj½†rþ$hjʆrÿ$jj½†r%jŒX'OK'r%†r%jj½†r%hj±†r%jj½†r%jŒX'KO'r%†r%jj½†r%jRX}}r	%†r
%hj!†r%jRX{{r%†r
%jj½†r%hxXdater%†r%hjr†r%hxXdate2r%†r%hjv†r%jj½†r%hX==r%†r%jj½†r%hxXdater%†r%hjr†r%jŒX'2010-10-04 13:45'r%†r%hjv†r%jj½†r%hjʆr %jj½†r!%jŒX'OK'r"%†r#%jj½†r$%hj±†r%%jj½†r&%jŒX'KO'r'%†r(%jj½†r)%jRX}}r*%†r+%hj!†r,%jRX{{r-%†r.%jj½†r/%hxXdater0%†r1%hjr†r2%hxXdate3r3%†r4%hjv†r5%jj½†r6%hX==r7%†r8%jj½†r9%hxXdater:%†r;%hjr†r<%jŒX'2010-10-04 13:45'r=%†r>%hjv†r?%jj½†r@%hjʆrA%jj½†rB%jŒX'OK'rC%†rD%jj½†rE%hj±†rF%jj½†rG%jŒX'KO'rH%†rI%jj½†rJ%jRX}}rK%†rL%hj!†rM%jRX{{rN%†rO%jj½†rP%hxXdaterQ%†rR%hjr†rS%hxXdate4rT%†rU%hjv†rV%jj½†rW%hX==rX%†rY%jj½†rZ%hxXdater[%†r\%hjr†r]%jŒX'2010-10-04 13:45'r^%†r_%hjv†r`%jj½†ra%hjʆrb%jj½†rc%jŒX'OK'rd%†re%jj½†rf%hj±†rg%jj½†rh%jŒX'KO'ri%†rj%jj½†rk%jRX}}rl%†rm%hj!†rn%jRX{{ro%†rp%jj½†rq%hxXdaterr%†rs%hjr†rt%hxXdate5ru%†rv%hjv†rw%jj½†rx%hX==ry%†rz%jj½†r{%hxXdater|%†r}%hjr†r~%jŒX'1964-01-02 03:04'r%†r€%hjv†r%jj½†r‚%hjʆrƒ%jj½†r„%jŒX'OK'r…%†r†%jj½†r‡%hj±†rˆ%jj½†r‰%jŒX'KO'rŠ%†r‹%jj½†rŒ%jRX}}r%†rŽ%hXê
--DATA--
date_default_timezone_set('UTC');
return array(
    'date1' => mktime(13, 45, 0, 10, 4, 2010),
    'date2' => new DateTime('2010-10-04 13:45'),
    'date3' => '2010-10-04 13:45',
    'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
    'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(),
)
--EXPECT--
OK
OK
OK
OK
OK
OK
--TEST--
"dump" function, xdebug is not loaded or xdebug <2.2-dev is loaded
--CONDITION--
!extension_loaded('xdebug') || (($r = new ReflectionExtension('xdebug')) && version_compare($r->getVersion(), '2.2-dev', '<'))
--TEMPLATE--
r%†r%jRX{{r‘%†r’%jj½†r“%hxXdumpr”%†r•%hjr†r–%hjv†r—%jj½†r˜%jRX}}r™%†rš%hXÈ
--DATA--
return array('foo' => 'foo', 'bar' => 'bar')
--CONFIG--
return array('debug' => true, 'autoescape' => false);
--TEST--
"dump" function
--CONDITION--
!extension_loaded('xdebug')
--TEMPLATE--
r›%†rœ%jRX{{r%†rž%jj½†rŸ%hxXdumpr %†r¡%hjr†r¢%jŒX'foo'r£%†r¤%hjv†r¥%jj½†r¦%jRX}}r§%†r¨%hj!†r©%jRX{{rª%†r«%jj½†r¬%hxXdumpr­%†r®%hjr†r¯%jŒX'foo'r°%†r±%hjƒ†r²%jj½†r³%jŒX'bar'r´%†rµ%hjv†r¶%jj½†r·%jRX}}r¸%†r¹%hXÛ
--DATA--
return array('foo' => 'foo', 'bar' => 'bar')
--CONFIG--
return array('debug' => true, 'autoescape' => false);
--EXPECT--
string(3) "foo"

string(3) "foo"
string(3) "bar"
--TEST--
dynamic function
--TEMPLATE--
rº%†r»%jRX{{r¼%†r½%jj½†r¾%hxXfoo_pathr¿%†rÀ%hjr†rÁ%jŒX'bar'rÂ%†rÃ%hjv†rÄ%jj½†rÅ%jRX}}rÆ%†rÇ%hj!†rÈ%jRX{{rÉ%†rÊ%jj½†rË%hxXa_foo_b_barrÌ%†rÍ%hjr†rÎ%jŒX'bar'rÏ%†rÐ%hjv†rÑ%jj½†rÒ%jRX}}rÓ%†rÔ%hX]
--DATA--
return array()
--EXPECT--
foo/bar
a/b/bar
--TEST--
"include" function
--TEMPLATE--
rÕ%†rÖ%jRX{%r×%†rØ%jj½†rÙ%jÃXsetrÚ%†rÛ%jj½†rÜ%hxXtmprÝ%†rÞ%jj½†rß%hj2†rà%jj½†rá%hxXincluderâ%†rã%hjr†rä%jñX
"foo.twig"rå%†ræ%hjv†rç%jj½†rè%jRX%}ré%†rê%hX

FOOrë%†rì%jRX{{rí%†rî%jj½†rï%hxXtmprð%†rñ%jj½†rò%jRX}}ró%†rô%hX–BAR
--TEMPLATE(foo.twig)--
FOOBAR
--DATA--
return array()
--EXPECT--
FOO
FOOBARBAR
--TEST--
"include" function is safe for auto-escaping
--TEMPLATE--
rõ%†rö%jRX{{r÷%†rø%jj½†rù%hxXincluderú%†rû%hjr†rü%jñX
"foo.twig"rý%†rþ%hjv†rÿ%jj½†r&jRX}}r&†r&hX€
--TEMPLATE(foo.twig)--
<p>Test</p>
--DATA--
return array()
--EXPECT--
<p>Test</p>
--TEST--
"include" function
--TEMPLATE--
FOO
r&†r&jRX{{r&†r&jj½†r&hxXincluder&†r	&hjr†r
&jñX
"foo.twig"r&†r&hjv†r
&jj½†r&jRX}}r&†r&hX´

BAR
--TEMPLATE(foo.twig)--
FOOBAR
--DATA--
return array()
--EXPECT--
FOO

FOOBAR

BAR
--TEST--
"include" function allows expressions for the template to include
--TEMPLATE--
FOO
r&†r&jRX{{r&†r&jj½†r&hxXincluder&†r&hjr†r&hxXfoor&†r&hjv†r&jj½†r&jRX}}r&†r&hX”

BAR
--TEMPLATE(foo.twig)--
FOOBAR
--DATA--
return array('foo' => 'foo.twig')
--EXPECT--
FOO

FOOBAR

BAR
--TEST--
"include" function
--TEMPLATE--
r&†r &jRX{{r!&†r"&jj½†r#&hxXincluder$&†r%&hjr†r&&hj=†r'&jñX
"foo.twig"r(&†r)&hjƒ†r*&jj½†r+&jñX
"bar.twig"r,&†r-&hjA†r.&hjƒ†r/&jj½†r0&hxXignore_missingr1&†r2&jj½†r3&hj2†r4&jj½†r5&jûXtruer6&†r7&hjv†r8&jj½†r9&jRX}}r:&†r;&hj!†r<&jRX{{r=&†r>&jj½†r?&hxXincluder@&†rA&hjr†rB&jñX
"foo.twig"rC&†rD&hjƒ†rE&jj½†rF&hxXignore_missingrG&†rH&jj½†rI&hj2†rJ&jj½†rK&jûXtruerL&†rM&hjv†rN&jj½†rO&jRX}}rP&†rQ&hj!†rR&jRX{{rS&†rT&jj½†rU&hxXincluderV&†rW&hjr†rX&jñX
"foo.twig"rY&†rZ&hjƒ†r[&jj½†r\&hxXignore_missingr]&†r^&jj½†r_&hj2†r`&jj½†ra&jûXtruerb&†rc&hjƒ†rd&jj½†re&hxX	variablesrf&†rg&jj½†rh&hj2†ri&jj½†rj&hj­†rk&hj½†rl&hjv†rm&jj½†rn&jRX}}ro&†rp&hj!†rq&jRX{{rr&†rs&jj½†rt&hxXincluderu&†rv&hjr†rw&jñX
"foo.twig"rx&†ry&hjƒ†rz&jj½†r{&hxXignore_missingr|&†r}&jj½†r~&hj2†r&jj½†r€&jûXtruer&†r‚&hjƒ†rƒ&jj½†r„&hxX	variablesr…&†r†&jj½†r‡&hj2†rˆ&jj½†r‰&hj­†rŠ&hj½†r‹&hjƒ†rŒ&jj½†r&hxXwith_contextrŽ&†r&jj½†r&hj2†r‘&jj½†r’&jûXtruer“&†r”&hjv†r•&jj½†r–&jRX}}r—&†r˜&hXM
--DATA--
return array()
--EXPECT--
--TEST--
"include" function
--TEMPLATE--
r™&†rš&jRX{%r›&†rœ&jj½†r&jÃXextendsrž&†rŸ&jj½†r &jñX"base.twig"r¡&†r¢&jj½†r£&jRX%}r¤&†r¥&hX

r¦&†r§&jRX{%r¨&†r©&jj½†rª&jÃXblockr«&†r¬&jj½†r­&hxXcontentr®&†r¯&jj½†r°&jRX%}r±&†r²&hX
    r³&†r´&jRX{{rµ&†r¶&jj½†r·&híXparentr¸&†r¹&hjr†rº&hjv†r»&jj½†r¼&jRX}}r½&†r¾&hj!†r¿&jRX{%rÀ&†rÁ&jj½†rÂ&jÃXendblockrÃ&†rÄ&jj½†rÅ&jRX%}rÆ&†rÇ&hX
--TEMPLATE(base.twig)--
rÈ&†rÉ&jRX{%rÊ&†rË&jj½†rÌ&jÃXblockrÍ&†rÎ&jj½†rÏ&hxXcontentrÐ&†rÑ&jj½†rÒ&jRX%}rÓ&†rÔ&hX
    rÕ&†rÖ&jRX{{r×&†rØ&jj½†rÙ&hxXincluderÚ&†rÛ&hjr†rÜ&jñX
"foo.twig"rÝ&†rÞ&hjv†rß&jj½†rà&jRX}}rá&†râ&hj!†rã&jRX{%rä&†rå&jj½†ræ&jÃXendblockrç&†rè&jj½†ré&jRX%}rê&†rë&hX¡
--DATA--
return array();
--EXCEPTION--
Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3.
--TEST--
"include" function
--TEMPLATE--
rì&†rí&jRX{{rî&†rï&jj½†rð&hxXincluderñ&†rò&hjr†ró&jñX
"foo.twig"rô&†rõ&hjv†rö&jj½†r÷&jRX}}rø&†rù&hX§
--DATA--
return array();
--EXCEPTION--
Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2.
--TEST--
"include" tag sandboxed
--TEMPLATE--
rú&†rû&jRX{{rü&†rý&jj½†rþ&hxXincluderÿ&†r'hjr†r'jñX
"foo.twig"r'†r'hjƒ†r'jj½†r'hxX	sandboxedr'†r'jj½†r'hj2†r	'jj½†r
'jûXtruer'†r'hjv†r
'jj½†r'jRX}}r'†r'hX
--TEMPLATE(foo.twig)--
r'†r'jRX{{r'†r'jj½†r'hxXfoor'†r'hjn†r'jj˜†r'jj½†r'jRX}}r'†r'hXÀ
--DATA--
return array()
--EXCEPTION--
Twig_Sandbox_SecurityError: Filter "e" is not allowed in "index.twig" at line 2.
--TEST--
"include" function accepts Twig_Template instance
--TEMPLATE--
r'†r'jRX{{r'†r 'jj½†r!'hxXincluder"'†r#'hjr†r$'hxXfoor%'†r&'hjv†r''jj½†r('jRX}}r)'†r*'hXœ FOO
--TEMPLATE(foo.twig)--
BAR
--DATA--
return array('foo' => $twig->loadTemplate('foo.twig'))
--EXPECT--
BAR FOO
--TEST--
"include" function
--TEMPLATE--
r+'†r,'jRX{{r-'†r.'jj½†r/'hxXincluder0'†r1'hjr†r2'hj=†r3'jñX
"foo.twig"r4'†r5'hjƒ†r6'jj½†r7'jñX
"bar.twig"r8'†r9'hjA†r:'hjv†r;'jj½†r<'jRX}}r='†r>'hj!†r?'jRX{{r@'†rA'hjv†rB'jj½†rC'hxXincluderD'†rE'hjr†rF'hj=†rG'jñX
"bar.twig"rH'†rI'hjƒ†rJ'jj½†rK'jñX
"foo.twig"rL'†rM'hjA†rN'hjv†rO'jj½†rP'jRX}}rQ'†rR'hX’
--TEMPLATE(foo.twig)--
foo
--DATA--
return array()
--EXPECT--
foo
foo
--TEST--
"include" function accept variables and with_context
--TEMPLATE--
rS'†rT'jRX{{rU'†rV'jj½†rW'hxXincluderX'†rY'hjr†rZ'jñX
"foo.twig"r['†r\'hjv†r]'jj½†r^'jRX}}r_'†r`'hj!†ra'jRX{{rb'†rc'hjv†rd'jj½†re'hxXincluderf'†rg'hjr†rh'jñX
"foo.twig"ri'†rj'hjƒ†rk'jj½†rl'hxXwith_contextrm'†rn'jj½†ro'hj2†rp'jj½†rq'jûXfalserr'†rs'hjv†rt'jj½†ru'jRX}}rv'†rw'hj!†rx'jRX{{ry'†rz'hjv†r{'jj½†r|'hxXincluder}'†r~'hjr†r'jñX
"foo.twig"r€'†r'hjƒ†r‚'jj½†rƒ'hj­†r„'jŒX'foo1'r…'†r†'hj±†r‡'jj½†rˆ'jŒX'bar'r‰'†rŠ'hj½†r‹'hjv†rŒ'jj½†r'jRX}}rŽ'†r'hj!†r'jRX{{r‘'†r’'hjv†r“'jj½†r”'hxXincluder•'†r–'hjr†r—'jñX
"foo.twig"r˜'†r™'hjƒ†rš'jj½†r›'hj­†rœ'jŒX'foo1'r'†rž'hj±†rŸ'jj½†r 'jŒX'bar'r¡'†r¢'hj½†r£'hjƒ†r¤'jj½†r¥'hxXwith_contextr¦'†r§'jj½†r¨'hj2†r©'jj½†rª'jûXfalser«'†r¬'hjv†r­'jj½†r®'jRX}}r¯'†r°'hX
--TEMPLATE(foo.twig)--
r±'†r²'jRX{%r³'†r´'jj½†rµ'jÃXforr¶'†r·'jj½†r¸'hxXkr¹'†rº'hjƒ†r»'jj½†r¼'hxXvr½'†r¾'jj½†r¿'jÃXinrÀ'†rÁ'jj½†rÂ'hxX_contextrÃ'†rÄ'jj½†rÅ'jRX%}rÆ'†rÇ'jRX{{rÈ'†rÉ'jj½†rÊ'hxj¹'†rË'jj½†rÌ'jRX}}rÍ'†rÎ'hjƒ†rÏ'jRX{%rÐ'†rÑ'jj½†rÒ'jÃXendforrÓ'†rÔ'jj½†rÕ'jRX%}rÖ'†r×'hX¾
--DATA--
return array('foo' => 'bar')
--EXPECT--
foo,global,_parent,
global,_parent,
foo,global,foo1,_parent,
foo1,global,_parent,
--TEST--
"include" function accept variables
--TEMPLATE--
rØ'†rÙ'jRX{{rÚ'†rÛ'jj½†rÜ'hxXincluderÝ'†rÞ'hjr†rß'jñX
"foo.twig"rà'†rá'hjƒ†râ'jj½†rã'hj­†rä'jŒX'foo'rå'†ræ'hj±†rç'jj½†rè'jŒX'bar'ré'†rê'hj½†rë'hjv†rì'jj½†rí'jRX}}rî'†rï'hj!†rð'jRX{{rñ'†rò'hjv†ró'jj½†rô'hxXincluderõ'†rö'hjr†r÷'jñX
"foo.twig"rø'†rù'hjƒ†rú'jj½†rû'hxXvarsrü'†rý'hjv†rþ'jj½†rÿ'jRX}}r(†r(hX
--TEMPLATE(foo.twig)--
r(†r(jRX{{r(†r(jj½†r(hxXfoor(†r(jj½†r	(jRX}}r
(†r(hXp
--DATA--
return array('vars' => array('foo' => 'bar'))
--EXPECT--
bar
bar
--TEST--
"max" function
--TEMPLATE--
r(†r
(jRX{{r(†r(jj½†r(hxXmaxr(†r(hjr†r(hj=†r(jj††r(hjƒ†r(jj½†r(jj†r(hjƒ†r(jj½†r(jjn†r(hjƒ†r(jj½†r(jj†r(hjƒ†r(jj½†r (jj̆r!(hjA†r"(hjv†r#(jj½†r$(jRX}}r%(†r&(hj!†r'(jRX{{r((†r)(jj½†r*(hxXmaxr+(†r,(hjr†r-(jj††r.(hjƒ†r/(jj½†r0(jj†r1(hjƒ†r2(jj½†r3(jjn†r4(hjƒ†r5(jj½†r6(jj†r7(hjƒ†r8(jj½†r9(jj̆r:(hjv†r;(jj½†r<(jRX}}r=(†r>(hj!†r?(jRX{{r@(†rA(jj½†rB(hxXmaxrC(†rD(hjr†rE(hj­†rF(jj††rG(jñX:"two"rH(†rI(hjƒ†rJ(jj½†rK(jj†rL(jñX:"one"rM(†rN(hjƒ†rO(jj½†rP(jjn†rQ(jñX:"three"rR(†rS(hjƒ†rT(jj½†rU(jj†rV(jñX:"five"rW(†rX(hjƒ†rY(jj½†rZ(jj̆r[(jñX:"for"r\(†r](hj½†r^(hjv†r_(jj½†r`(jRX}}ra(†rb(hXQ
--DATA--
return array()
--EXPECT--
5
5
two
--TEST--
"min" function
--TEMPLATE--
rc(†rd(jRX{{re(†rf(jj½†rg(hxXminrh(†ri(hjr†rj(jj††rk(hjƒ†rl(jj½†rm(jj†rn(hjƒ†ro(jj½†rp(jjn†rq(hjƒ†rr(jj½†rs(jj†rt(hjƒ†ru(jj½†rv(jj̆rw(hjv†rx(jj½†ry(jRX}}rz(†r{(hj!†r|(jRX{{r}(†r~(jj½†r(hxXminr€(†r(hjr†r‚(hj=†rƒ(jj††r„(hjƒ†r…(jj½†r†(jj†r‡(hjƒ†rˆ(jj½†r‰(jjn†rŠ(hjƒ†r‹(jj½†rŒ(jj†r(hjƒ†rŽ(jj½†r(jj̆r(hjA†r‘(hjv†r’(jj½†r“(jRX}}r”(†r•(hj!†r–(jRX{{r—(†r˜(jj½†r™(hxXminrš(†r›(hjr†rœ(hj­†r(jj††rž(jñX:"two"rŸ(†r (hjƒ†r¡(jj½†r¢(jj†r£(jñX:"one"r¤(†r¥(hjƒ†r¦(jj½†r§(jjn†r¨(jñX:"three"r©(†rª(hjƒ†r«(jj½†r¬(jj†r­(jñX:"five"r®(†r¯(hjƒ†r°(jj½†r±(jj̆r²(jñX:"for"r³(†r´(hj½†rµ(hjv†r¶(jj½†r·(jRX}}r¸(†r¹(hXT
--DATA--
return array()
--EXPECT--
1
1
five
--TEST--
"range" function
--TEMPLATE--
rº(†r»(jRX{{r¼(†r½(jj½†r¾(hxXranger¿(†rÀ(hjr†rÁ(hxXlowrÂ(†rÃ(hj2†rÄ(jj¯†rÅ(hji†rÆ(jj†rÇ(hjƒ†rÈ(jj½†rÉ(hxXhighrÊ(†rË(hj2†rÌ(jj†rÍ(jj¯†rÎ(hji†rÏ(jj¯†rÐ(hjƒ†rÑ(jj½†rÒ(hxXsteprÓ(†rÔ(hj2†rÕ(jj††rÖ(hjv†r×(hjn†rØ(jXjoinrÙ(†rÚ(hjr†rÛ(jŒX','rÜ(†rÝ(hjv†rÞ(jj½†rß(jRX}}rà(†rá(hX}
--DATA--
return array()
--EXPECT--
1,3,5,7,9
--TEST--
"block" function recursively called in a parent template
--TEMPLATE--
râ(†rã(jRX{%rä(†rå(jj½†ræ(jÃXextendsrç(†rè(jj½†ré(jñX"ordered_menu.twig"rê(†rë(jj½†rì(jRX%}rí(†rî(hj!†rï(jRX{%rð(†rñ(jj½†rò(jÃXblockró(†rô(jj½†rõ(hxXlabelrö(†r÷(jj½†rø(jRX%}rù(†rú(hX"rû(†rü(jRX{{rý(†rþ(jj½†rÿ(híXparentr)†r)hjr†r)hjv†r)jj½†r)jRX}}r)†r)hjû(†r)jRX{%r)†r	)jj½†r
)jÃXendblockr)†r)jj½†r
)jRX%}r)†r)hj!†r)jRX{%r)†r)jj½†r)jÃXblockr)†r)jj½†r)hxXlistr)†r)jj½†r)jRX%}r)†r)jRX{%r)†r)jj½†r)jÃXsetr)†r )jj½†r!)hxXclassr")†r#)jj½†r$)hj2†r%)jj½†r&)jŒX'b'r')†r()jj½†r))jRX%}r*)†r+)jRX{{r,)†r-)jj½†r.)híXparentr/)†r0)hjr†r1)hjv†r2)jj½†r3)jRX}}r4)†r5)jRX{%r6)†r7)jj½†r8)jÃXendblockr9)†r:)jj½†r;)jRX%}r<)†r=)hX!
--TEMPLATE(ordered_menu.twig)--
r>)†r?)jRX{%r@)†rA)jj½†rB)jÃXextendsrC)†rD)jj½†rE)jñX"menu.twig"rF)†rG)jj½†rH)jRX%}rI)†rJ)hj!†rK)jRX{%rL)†rM)jj½†rN)jÃXblockrO)†rP)jj½†rQ)hxXlistrR)†rS)jj½†rT)jRX%}rU)†rV)jRX{%rW)†rX)jj½†rY)jÃXsetrZ)†r[)jj½†r\)hxXclassr])†r^)jj½†r_)hj2†r`)jj½†ra)hxXclassrb)†rc)hjn†rd)jXdefaultre)†rf)hjr†rg)jŒX'a'rh)†ri)hjv†rj)jj½†rk)jRX%}rl)†rm)hX<ol class="rn)†ro)jRX{{rp)†rq)jj½†rr)hxXclassrs)†rt)jj½†ru)jRX}}rv)†rw)hX">rx)†ry)jRX{{rz)†r{)jj½†r|)híXblockr})†r~)hjr†r)jŒX
'children'r€)†r)hjv†r‚)jj½†rƒ)jRX}}r„)†r…)hX</ol>r†)†r‡)jRX{%rˆ)†r‰)jj½†rŠ)jÃXendblockr‹)†rŒ)jj½†r)jRX%}rŽ)†r)hX
--TEMPLATE(menu.twig)--
r)†r‘)jRX{%r’)†r“)jj½†r”)jÃXextendsr•)†r–)jj½†r—)jñX"base.twig"r˜)†r™)jj½†rš)jRX%}r›)†rœ)hj!†r)jRX{%rž)†rŸ)jj½†r )jÃXblockr¡)†r¢)jj½†r£)hxXlistr¤)†r¥)jj½†r¦)jRX%}r§)†r¨)hX<ul>r©)†rª)jRX{{r«)†r¬)jj½†r­)híXblockr®)†r¯)hjr†r°)jŒX
'children'r±)†r²)hjv†r³)jj½†r´)jRX}}rµ)†r¶)hX</ul>r·)†r¸)jRX{%r¹)†rº)jj½†r»)jÃXendblockr¼)†r½)jj½†r¾)jRX%}r¿)†rÀ)hj!†rÁ)jRX{%rÂ)†rÃ)jj½†rÄ)jÃXblockrÅ)†rÆ)jj½†rÇ)hxXchildrenrÈ)†rÉ)jj½†rÊ)jRX%}rË)†rÌ)jRX{%rÍ)†rÎ)jj½†rÏ)jÃXsetrÐ)†rÑ)jj½†rÒ)hxXcurrentItemrÓ)†rÔ)jj½†rÕ)hj2†rÖ)jj½†r×)hxXitemrØ)†rÙ)jj½†rÚ)jRX%}rÛ)†rÜ)jRX{%rÝ)†rÞ)jj½†rß)jÃXforrà)†rá)jj½†râ)hxXitemrã)†rä)jj½†rå)jÃXinræ)†rç)jj½†rè)hxXcurrentItemré)†rê)jj½†rë)jRX%}rì)†rí)jRX{{rî)†rï)jj½†rð)híXblockrñ)†rò)hjr†ró)jŒX'item'rô)†rõ)hjv†rö)jj½†r÷)jRX}}rø)†rù)jRX{%rú)†rû)jj½†rü)jÃXendforrý)†rþ)jj½†rÿ)jRX%}r*†r*jRX{%r*†r*jj½†r*jÃXsetr*†r*jj½†r*hxXitemr*†r	*jj½†r
*hj2†r*jj½†r*hxXcurrentItemr
*†r*jj½†r*jRX%}r*†r*jRX{%r*†r*jj½†r*jÃXendblockr*†r*jj½†r*jRX%}r*†r*hj!†r*jRX{%r*†r*jj½†r*e(jÃXblockr*†r*jj½†r *hxXitemr!*†r"*jj½†r#*jRX%}r$*†r%*hX<li>r&*†r'*jRX{%r(*†r)*jj½†r**jÃXifr+*†r,*jj½†r-*hxXitemr.*†r/*jj½†r0*jÃXisr1*†r2*jj½†r3*jÃXnotr4*†r5*jj½†r6*jXiterabler7*†r8*jj½†r9*jRX%}r:*†r;*jRX{{r<*†r=*jj½†r>*híXblockr?*†r@*hjr†rA*jŒX'label'rB*†rC*hjv†rD*jj½†rE*jRX}}rF*†rG*jRX{%rH*†rI*jj½†rJ*jÃXelserK*†rL*jj½†rM*jRX%}rN*†rO*jRX{{rP*†rQ*jj½†rR*híXblockrS*†rT*hjr†rU*jŒX'list'rV*†rW*hjv†rX*jj½†rY*jRX}}rZ*†r[*jRX{%r\*†r]*jj½†r^*jÃXendifr_*†r`*jj½†ra*jRX%}rb*†rc*hX</li>rd*†re*jRX{%rf*†rg*jj½†rh*jÃXendblockri*†rj*jj½†rk*jRX%}rl*†rm*hj!†rn*jRX{%ro*†rp*jj½†rq*jÃXblockrr*†rs*jj½†rt*hxXlabelru*†rv*jj½†rw*jRX%}rx*†ry*jRX{{rz*†r{*jj½†r|*hxXitemr}*†r~*jj½†r*jRX}}r€*†r*jRX{{r‚*†rƒ*jj½†r„*híXblockr…*†r†*hjr†r‡*jŒX	'unknown'rˆ*†r‰*hjv†rŠ*jj½†r‹*jRX}}rŒ*†r*jRX{%rŽ*†r*jj½†r*jÃXendblockr‘*†r’*jj½†r“*jRX%}r”*†r•*hX
--TEMPLATE(base.twig)--
r–*†r—*jRX{{r˜*†r™*jj½†rš*híXblockr›*†rœ*hjr†r*jŒX'list'rž*†rŸ*hjv†r *jj½†r¡*jRX}}r¢*†r£*hX7
--DATA--
return array('item' => array('1', '2', array('3.1', array('3.2.1', '3.2.2'), '3.4')))
--EXPECT--
<ol class="b"><li>"1"</li><li>"2"</li><li><ol class="b"><li>"3.1"</li><li><ol class="b"><li>"3.2.1"</li><li>"3.2.2"</li></ol></li><li>"3.4"</li></ol></li></ol>
--TEST--
"source" function
--TEMPLATE--
FOO
r¤*†r¥*jRX{{r¦*†r§*jj½†r¨*hxXsourcer©*†rª*hjr†r«*jñX
"foo.twig"r¬*†r­*hjv†r®*jj½†r¯*jRX}}r°*†r±*hX

BAR
--TEMPLATE(foo.twig)--
r²*†r³*jRX{{r´*†rµ*jj½†r¶*hxXfoor·*†r¸*jj½†r¹*jRX}}rº*†r»*hX/<br />
--DATA--
return array()
--EXPECT--
FOO

r¼*†r½*jRX{{r¾*†r¿*jj½†rÀ*hxXfoorÁ*†rÂ*jj½†rÃ*jRX}}rÄ*†rÅ*hXB<br />

BAR
--TEST--
"template_from_string" function
--TEMPLATE--
rÆ*†rÇ*jRX{%rÈ*†rÉ*jj½†rÊ*jÃXincluderË*†rÌ*jj½†rÍ*hxXtemplate_from_stringrÎ*†rÏ*hjr†rÐ*hxXtemplaterÑ*†rÒ*hjv†rÓ*jj½†rÔ*jRX%}rÕ*†rÖ*hX

r×*†rØ*jRX{%rÙ*†rÚ*jj½†rÛ*jÃXincluderÜ*†rÝ*jj½†rÞ*hxXtemplate_from_stringrß*†rà*hjr†rá*jñX"Hello {{ name }}"râ*†rã*hjv†rä*jj½†rå*jRX%}ræ*†rç*hj!†rè*jRX{%ré*†rê*jj½†rë*jÃXincluderì*†rí*jj½†rî*hxXtemplate_from_stringrï*†rð*hjr†rñ*jŒXN'{% extends "parent.twig" %}{% block content %}Hello {{ name }}{% endblock %}'rò*†ró*hjv†rô*jj½†rõ*jRX%}rö*†r÷*hX
--TEMPLATE(parent.twig)--
rø*†rù*jRX{%rú*†rû*jj½†rü*jÃXblockrý*†rþ*jj½†rÿ*hxXcontentr+†r+jj½†r+jRX%}r+†r+jRX{%r+†r+jj½†r+jÃXendblockr+†r	+jj½†r
+jRX%}r+†r+hX@
--DATA--
return array('name' => 'Fabien', 'template' => "Hello r
+†r+jRX{{r+†r+jj½†r+hxXnamer+†r+jj½†r+jRX}}r+†r+hXQ")
--EXPECT--
Hello Fabien
Hello Fabien
Hello Fabien
--TEST--
macro
--TEMPLATE--
r+†r+jRX{%r+†r+jj½†r+jÃXfromr+†r+jj½†r+hxX_selfr+†r +jj½†r!+hxXimportr"+†r#+jj½†r$+hxXtestr%+†r&+jj½†r'+jRX%}r(+†r)+hX

r*+†r++jRX{%r,+†r-+jj½†r.+jÃXmacror/+†r0+jj½†r1+hxXtestr2+†r3+hjr†r4+hxj/†r5+hjƒ†r6+jj½†r7+hxjü†r8+jj½†r9+hj2†r:+jj½†r;+jŒX'bar'r<+†r=+hjv†r>+jj½†r?+jjv†r@+jRX%}rA+†rB+hj!†rC+jRX{{rD+†rE+jj½†rF+hxj/†rG+jj½†rH+jRX}}rI+†rJ+jRX{{rK+†rL+jj½†rM+hxjü†rN+jj½†rO+jRX}}rP+†rQ+hj!†rR+jRX{%rS+†rT+jX- rU+†rV+jÃXendmacrorW+†rX+jj½†rY+jRX%}rZ+†r[+hX

r\+†r]+jRX{{r^+†r_+jj½†r`+hxXtestra+†rb+hjr†rc+jŒX'foo'rd+†re+hjv†rf+jj½†rg+jRX}}rh+†ri+hj!†rj+jRX{{rk+†rl+jj½†rm+hxXtestrn+†ro+hjr†rp+jŒX'bar'rq+†rr+hjƒ†rs+jj½†rt+jŒX'foo'ru+†rv+hjv†rw+jj½†rx+jRX}}ry+†rz+hXO
--DATA--
return array();
--EXPECT--
foobar
barfoo
--TEST--
macro
--TEMPLATE--
r{+†r|+jRX{%r}+†r~+jj½†r+jÃXimportr€+†r+jj½†r‚+hxX_selfrƒ+†r„+jj½†r…+hxXasr†+†r‡+jj½†rˆ+hxXmacrosr‰+†rŠ+jj½†r‹+jRX%}rŒ+†r+hX

rŽ+†r+jRX{%r+†r‘+jj½†r’+jÃXmacror“+†r”+jj½†r•+hxXfoor–+†r—+hjr†r˜+hxXdatar™+†rš+hjv†r›+jj½†rœ+jRX%}r+†rž+hX
    rŸ+†r +jRX{{r¡+†r¢+jj½†r£+hxXdatar¤+†r¥+jj½†r¦+jRX}}r§+†r¨+hj!†r©+jRX{%rª+†r«+jj½†r¬+jÃXendmacror­+†r®+jj½†r¯+jRX%}r°+†r±+hX

r²+†r³+jRX{%r´+†rµ+jj½†r¶+jÃXmacror·+†r¸+jj½†r¹+hxXbarrº+†r»+hjr†r¼+hjv†r½+jj½†r¾+jRX%}r¿+†rÀ+hX
    <br />
rÁ+†rÂ+jRX{%rÃ+†rÄ+jj½†rÅ+jÃXendmacrorÆ+†rÇ+jj½†rÈ+jRX%}rÉ+†rÊ+hX

rË+†rÌ+jRX{{rÍ+†rÎ+jj½†rÏ+hxXmacrosrÐ+†rÑ+hxX.foorÒ+†rÓ+hjr†rÔ+hxXmacrosrÕ+†rÖ+hxX.barr×+†rØ+hjr†rÙ+hjv†rÚ+hjv†rÛ+jj½†rÜ+jRX}}rÝ+†rÞ+hXH
--DATA--
return array();
--EXPECT--
<br />
--TEST--
macro
--TEMPLATE--
rß+†rà+jRX{%rá+†râ+jj½†rã+jÃXfromrä+†rå+jj½†ræ+hxX_selfrç+†rè+jj½†ré+hxXimportrê+†rë+jj½†rì+hxXtestrí+†rî+jj½†rï+jRX%}rð+†rñ+hX

rò+†ró+jRX{%rô+†rõ+jj½†rö+jÃXmacror÷+†rø+jj½†rù+hxXtestrú+†rû+hjr†rü+hxXthisrý+†rþ+hjv†rÿ+jj½†r,jjv†r,jRX%}r,†r,hX
    r,†r,jRX{{r,†r,jj½†r,hxXthisr	,†r
,jj½†r,jRX}}r,†r
,hj!†r,jRX{%r,†r,jX- r,†r,jÃXendmacror,†r,jj½†r,jRX%}r,†r,hX

r,†r,jRX{{r,†r,jj½†r,hxXtestr,†r,hjr†r,hxXthisr ,†r!,hjv†r",jj½†r#,jRX}}r$,†r%,hXT
--DATA--
return array('this' => 'foo');
--EXPECT--
foo
--TEST--
macro
--TEMPLATE--
r&,†r',jRX{%r(,†r),jj½†r*,jÃXimportr+,†r,,jj½†r-,hxX_selfr.,†r/,jj½†r0,hxXasr1,†r2,jj½†r3,hxXtestr4,†r5,jj½†r6,jRX%}r7,†r8,hj!†r9,jRX{%r:,†r;,jj½†r<,jÃXfromr=,†r>,jj½†r?,hxX_selfr@,†rA,jj½†rB,hxXimportrC,†rD,jj½†rE,hxXtestrF,†rG,jj½†rH,jRX%}rI,†rJ,hX

rK,†rL,jRX{%rM,†rN,jj½†rO,jÃXmacrorP,†rQ,jj½†rR,hxXtestrS,†rT,hjr†rU,hxj/†rV,hjƒ†rW,jj½†rX,hxjü†rY,hjv†rZ,jj½†r[,jjv†r\,jRX%}r],†r^,hX
    r_,†r`,jRX{{ra,†rb,jj½†rc,hxj/†rd,hjn†re,jXdefaultrf,†rg,hjr†rh,jŒX'a'ri,†rj,hjv†rk,jj½†rl,jRX}}rm,†rn,hX<br />
    ro,†rp,jRX{{rq,†rr,hjv†rs,jj½†rt,hxjü†ru,hjn†rv,jXdefaultrw,†rx,hjr†ry,jŒX'b'rz,†r{,hjv†r|,jj½†r},jRX}}r~,†r,hX<br />
r€,†r,jRX{%r‚,†rƒ,jX- r„,†r…,jÃXendmacror†,†r‡,jj½†rˆ,jRX%}r‰,†rŠ,hX

r‹,†rŒ,jRX{{r,†rŽ,jj½†r,hxXtestr,†r‘,hxX.testr’,†r“,hjr†r”,hjv†r•,jj½†r–,jRX}}r—,†r˜,hj!†r™,jRX{{rš,†r›,jj½†rœ,hxXtestr,†rž,hjr†rŸ,hjv†r ,jj½†r¡,jRX}}r¢,†r£,hj!†r¤,jRX{{r¥,†r¦,jj½†r§,hxXtestr¨,†r©,hxX.testrª,†r«,hjr†r¬,jj†r­,hjƒ†r®,jj½†r¯,jñX"c"r°,†r±,hjv†r²,jj½†r³,jRX}}r´,†rµ,hj!†r¶,jRX{{r·,†r¸,jj½†r¹,hxXtestrº,†r»,hjr†r¼,jj†r½,hjƒ†r¾,jj½†r¿,jñX"c"rÀ,†rÁ,hjv†rÂ,jj½†rÃ,jRX}}rÄ,†rÅ,hX‹
--DATA--
return array();
--EXPECT--
a<br />b<br />
a<br />b<br />
1<br />c<br />
1<br />c<br />
--TEST--
macro with a filter
--TEMPLATE--
rÆ,†rÇ,jRX{%rÈ,†rÉ,jj½†rÊ,jÃXimportrË,†rÌ,jj½†rÍ,hxX_selfrÎ,†rÏ,jj½†rÐ,hxXasrÑ,†rÒ,jj½†rÓ,hxXtestrÔ,†rÕ,jj½†rÖ,jRX%}r×,†rØ,hX

rÙ,†rÚ,jRX{%rÛ,†rÜ,jj½†rÝ,jÃXmacrorÞ,†rß,jj½†rà,hxXtestrá,†râ,hjr†rã,hjv†rä,jj½†rå,jRX%}ræ,†rç,hX
    rè,†ré,jRX{%rê,†rë,jj½†rì,jÃXfilterrí,†rî,jj½†rï,jXescaperð,†rñ,jj½†rò,jRX%}ró,†rô,hX	foo<br />rõ,†rö,jRX{%r÷,†rø,jj½†rù,jÃX	endfilterrú,†rû,jj½†rü,jRX%}rý,†rþ,hj!†rÿ,jRX{%r-†r-jj½†r-jÃXendmacror-†r-jj½†r-jRX%}r-†r-hX

r-†r	-jRX{{r
-†r-jj½†r-hxXtestr
-†r-hxX.testr-†r-hjr†r-hjv†r-jj½†r-jRX}}r-†r-hXj
--DATA--
return array();
--EXPECT--
foo&lt;br /&gt;
--TEST--
Twig outputs 0 nodes correctly
--TEMPLATE--
r-†r-jRX{{r-†r-jj½†r-hxXfoor-†r-jj½†r-jRX}}r-†r-hj¯†r -jRX{{r!-†r"-jj½†r#-hxXfoor$-†r%-jj½†r&-jRX}}r'-†r(-hXh
--DATA--
return array('foo' => 'foo')
--EXPECT--
foo0foo
--TEST--
error in twig extension
--TEMPLATE--
r)-†r*-jRX{{r+-†r,-jj½†r--hxXobjectr.-†r/-hxX.regionr0-†r1-jj½†r2-jÃXisr3-†r4-jj½†r5-jÃXnotr6-†r7-jj½†r8-jXnullr9-†r:-jj½†r;-hjʆr<-jj½†r=-hxXobjectr>-†r?-hxX.regionChoicesr@-†rA-hj=†rB-hxXobjectrC-†rD-hxX.regionrE-†rF-hjA†rG-jj½†rH-jRX}}rI-†rJ-hXµ
--EXPECT--
house.region.s
--TEST--
Twig is able to deal with SimpleXMLElement instances as variables
--CONDITION--
version_compare(phpversion(), '5.3.0', '>=')
--TEMPLATE--
Hello 'rK-†rL-jRX{{rM-†rN-jj½†rO-hxXimagesrP-†rQ-hxX.imagerR-†rS-jX.0rT-†rU-hxX.grouprV-†rW-jj½†rX-jRX}}rY-†rZ-hX'!
r[-†r\-jRX{{r]-†r^-jj½†r_-hxXimagesr`-†ra-hxX.imagerb-†rc-jX.0rd-†re-hxX.grouprf-†rg-hxX.attributesrh-†ri-hxX.myattrrj-†rk-jj½†rl-jRX}}rm-†rn-hj!†ro-jRX{{rp-†rq-jj½†rr-hxXimagesrs-†rt-hxX	.childrenru-†rv-hjr†rw-hjv†rx-hxX.imagery-†rz-hxX.countr{-†r|-hjr†r}-hjv†r~-jj½†r-jRX}}r€-†r-hj!†r‚-jRX{%rƒ-†r„-jj½†r…-jÃXforr†-†r‡-jj½†rˆ-hxXimager‰-†rŠ-jj½†r‹-jÃXinrŒ-†r-jj½†rŽ-hxXimagesr-†r-jj½†r‘-jRX%}r’-†r“-hX
    - r”-†r•-jRX{{r–-†r—-jj½†r˜-hxXimager™-†rš-hxX.groupr›-†rœ-jj½†r-jRX}}rž-†rŸ-hj!†r -jRX{%r¡-†r¢-jj½†r£-jÃXendforr¤-†r¥-jj½†r¦-jRX%}r§-†r¨-hX+
--DATA--
return array('images' => new SimpleXMLElement('<images><image><group myattr="example">foo</group></image><image><group>bar</group></image></images>'))
--EXPECT--
Hello 'foo'!
example
2
    - foo
    - bar
--TEST--
Twig does not confuse strings with integers in getAttribute()
--TEMPLATE--
r©-†rª-jRX{{r«-†r¬-jj½†r­-hxXhashr®-†r¯-hj=†r°-jŒX'2e2'r±-†r²-hjA†r³-jj½†r´-jRX}}rµ-†r¶-hX“
--DATA--
return array('hash' => array('2e2' => 'works'))
--EXPECT--
works
--TEST--
"autoescape" tag applies escaping on its children
--TEMPLATE--
r·-†r¸-jRX{%r¹-†rº-jj½†r»-jÃX
autoescaper¼-†r½-jj½†r¾-jRX%}r¿-†rÀ-hj!†rÁ-jRX{{rÂ-†rÃ-jj½†rÄ-hxXvarrÅ-†rÆ-jj½†rÇ-jRX}}rÈ-†rÉ-hX<br />
rÊ-†rË-jRX{%rÌ-†rÍ-jj½†rÎ-jÃX
endautoescaperÏ-†rÐ-jj½†rÑ-jRX%}rÒ-†rÓ-hj!†rÔ-jRX{%rÕ-†rÖ-jj½†r×-jÃX
autoescaperØ-†rÙ-jj½†rÚ-jŒX'html'rÛ-†rÜ-jj½†rÝ-jRX%}rÞ-†rß-hj!†rà-jRX{{rá-†râ-jj½†rã-hxXvarrä-†rå-jj½†ræ-jRX}}rç-†rè-hX<br />
ré-†rê-jRX{%rë-†rì-jj½†rí-jÃX
endautoescaperî-†rï-jj½†rð-jRX%}rñ-†rò-hj!†ró-jRX{%rô-†rõ-jj½†rö-jÃX
autoescaper÷-†rø-jj½†rù-jûXfalserú-†rû-jj½†rü-jRX%}rý-†rþ-hj!†rÿ-jRX{{r.†r.jj½†r.hxXvarr.†r.jj½†r.jRX}}r.†r.hX<br />
r.†r	.jRX{%r
.†r.jj½†r.jÃX
endautoescaper
.†r.jj½†r.jRX%}r.†r.hj!†r.jRX{%r.†r.jj½†r.jÃX
autoescaper.†r.jj½†r.jûXtruer.†r.jj½†r.jRX%}r.†r.hj!†r.jRX{{r.†r .jj½†r!.hxXvarr".†r#.jj½†r$.jRX}}r%.†r&.hX<br />
r'.†r(.jRX{%r).†r*.jj½†r+.jÃX
endautoescaper,.†r-.jj½†r..jRX%}r/.†r0.hj!†r1.jRX{%r2.†r3.jj½†r4.jÃX
autoescaper5.†r6.jj½†r7.jûXfalser8.†r9.jj½†r:.jRX%}r;.†r<.hj!†r=.jRX{{r>.†r?.jj½†r@.hxXvarrA.†rB.jj½†rC.jRX}}rD.†rE.hX<br />
rF.†rG.jRX{%rH.†rI.jj½†rJ.jÃX
endautoescaperK.†rL.jj½†rM.jRX%}rN.†rO.hXÓ
--DATA--
return array('var' => '<br />')
--EXPECT--
&lt;br /&gt;<br />
&lt;br /&gt;<br />
<br /><br />
&lt;br /&gt;<br />
<br /><br />
--TEST--
"autoescape" tag applies escaping on embedded blocks
--TEMPLATE--
rP.†rQ.jRX{%rR.†rS.jj½†rT.jÃX
autoescaperU.†rV.jj½†rW.jŒX'html'rX.†rY.jj½†rZ.jRX%}r[.†r\.hX
  r].†r^.jRX{%r_.†r`.jj½†ra.jÃXblockrb.†rc.jj½†rd.hxXfoore.†rf.jj½†rg.jRX%}rh.†ri.hX
    rj.†rk.jRX{{rl.†rm.jj½†rn.hxXvarro.†rp.jj½†rq.jRX}}rr.†rs.hX
  rt.†ru.jRX{%rv.†rw.jj½†rx.jÃXendblockry.†rz.jj½†r{.jRX%}r|.†r}.hj!†r~.jRX{%r.†r€.jj½†r.jÃX
endautoescaper‚.†rƒ.jj½†r„.jRX%}r….†r†.hX€
--DATA--
return array('var' => '<br />')
--EXPECT--
&lt;br /&gt;
--TEST--
"autoescape" tag does not double-escape
--TEMPLATE--
r‡.†rˆ.jRX{%r‰.†rŠ.jj½†r‹.jÃX
autoescaperŒ.†r.jj½†rŽ.jŒX'html'r.†r.jj½†r‘.jRX%}r’.†r“.hj!†r”.jRX{{r•.†r–.jj½†r—.hxXvarr˜.†r™.hjn†rš.jXescaper›.†rœ.jj½†r.jRX}}rž.†rŸ.hj!†r .jRX{%r¡.†r¢.jj½†r£.jÃX
endautoescaper¤.†r¥.jj½†r¦.jRX%}r§.†r¨.hX¤
--DATA--
return array('var' => '<br />')
--EXPECT--
&lt;br /&gt;
--TEST--
"autoescape" tag applies escaping after calling functions
--TEMPLATE--

autoescape false
r©.†rª.jRX{%r«.†r¬.jj½†r­.jÃX
autoescaper®.†r¯.jj½†r°.jûXfalser±.†r².jj½†r³.jRX%}r´.†rµ.hX


safe_br
r¶.†r·.jRX{{r¸.†r¹.jj½†rº.hxXsafe_brr».†r¼.hjr†r½.hjv†r¾.jj½†r¿.jRX}}rÀ.†rÁ.hX

unsafe_br
rÂ.†rÃ.jRX{{rÄ.†rÅ.jj½†rÆ.hxX	unsafe_brrÇ.†rÈ.hjr†rÉ.hjv†rÊ.jj½†rË.jRX}}rÌ.†rÍ.hX

rÎ.†rÏ.jRX{%rÐ.†rÑ.jj½†rÒ.jÃX
endautoescaperÓ.†rÔ.jj½†rÕ.jRX%}rÖ.†r×.hX

autoescape 'html'
rØ.†rÙ.jRX{%rÚ.†rÛ.jj½†rÜ.jÃX
autoescaperÝ.†rÞ.jj½†rß.jŒX'html'rà.†rá.jj½†râ.jRX%}rã.†rä.hX


safe_br
rå.†ræ.jRX{{rç.†rè.jj½†ré.hxXsafe_brrê.†rë.hjr†rì.hjv†rí.jj½†rî.jRX}}rï.†rð.hX

unsafe_br
rñ.†rò.jRX{{ró.†rô.jj½†rõ.hxX	unsafe_brrö.†r÷.hjr†rø.hjv†rù.jj½†rú.jRX}}rû.†rü.hX

unsafe_br()|raw
rý.†rþ.jRX{{rÿ.†r/jj½†r/hjr†r/hxX	unsafe_brr/†r/hjr†r/hjv†r/hjv†r/hjn†r/jXrawr	/†r
/jj½†r/jRX}}r/†r
/hX

safe_br()|escape
r/†r/jRX{{r/†r/jj½†r/hjr†r/hxXsafe_brr/†r/hjr†r/hjv†r/hjv†r/hjn†r/jXescaper/†r/jj½†r/jRX}}r/†r/hX

safe_br()|raw
r/†r /jRX{{r!/†r"/jj½†r#/hjr†r$/hxXsafe_brr%/†r&/hjr†r'/hjv†r(/hjv†r)/hjn†r*/jXrawr+/†r,/jj½†r-/jRX}}r./†r//hX

unsafe_br()|escape
r0/†r1/jRX{{r2/†r3/jj½†r4/hjr†r5/hxX	unsafe_brr6/†r7/hjr†r8/hjv†r9/hjv†r:/hjn†r;/jXescaper</†r=/jj½†r>/jRX}}r?/†r@/hX

rA/†rB/jRX{%rC/†rD/jj½†rE/jÃX
endautoescaperF/†rG/jj½†rH/jRX%}rI/†rJ/hX

autoescape js
rK/†rL/jRX{%rM/†rN/jj½†rO/jÃX
autoescaperP/†rQ/jj½†rR/jŒX'js'rS/†rT/jj½†rU/jRX%}rV/†rW/hX


safe_br
rX/†rY/jRX{{rZ/†r[/jj½†r\/hxXsafe_brr]/†r^/hjr†r_/hjv†r`/jj½†ra/jRX}}rb/†rc/hX

rd/†re/jRX{%rf/†rg/jj½†rh/jÃX
endautoescaperi/†rj/jj½†rk/jRX%}rl/†rm/hXy
--DATA--
return array()
--EXPECT--

autoescape false

safe_br
<br />

unsafe_br
<br />


autoescape 'html'

safe_br
<br />

unsafe_br
&lt;br /&gt;

unsafe_br()|raw
<br />

safe_br()|escape
&lt;br /&gt;

safe_br()|raw
<br />

unsafe_br()|escape
&lt;br /&gt;


autoescape js

safe_br
\x3Cbr\x20\x2F\x3E
--TEST--
"autoescape" tag does not apply escaping on literals
--TEMPLATE--
rn/†ro/jRX{%rp/†rq/jj½†rr/jÃX
autoescapers/†rt/jj½†ru/jŒX'html'rv/†rw/jj½†rx/jRX%}ry/†rz/hX

1. Simple literal
r{/†r|/jRX{{r}/†r~/jj½†r/jñX"<br />"r€/†r/jj½†r‚/jRX}}rƒ/†r„/hX/

2. Conditional expression with only literals
r…/†r†/jRX{{r‡/†rˆ/jj½†r‰/jûXtruerŠ/†r‹/jj½†rŒ/hjʆr/jj½†rŽ/jñX"<br />"r/†r/jj½†r‘/hj±†r’/jj½†r“/jñX"<br>"r”/†r•/jj½†r–/jRX}}r—/†r˜/hX,

3. Conditional expression with a variable
r™/†rš/jRX{{r›/†rœ/jj½†r/jûXtruerž/†rŸ/jj½†r /hjʆr¡/jj½†r¢/jñX"<br />"r£/†r¤/jj½†r¥/hj±†r¦/jj½†r§/hxXsomeVarr¨/†r©/jj½†rª/jRX}}r«/†r¬/hX,

4. Nested conditionals with only literals
r­/†r®/jRX{{r¯/†r°/jj½†r±/jûXtruer²/†r³/jj½†r´/hjʆrµ/jj½†r¶/hjr†r·/jûXtruer¸/†r¹/jj½†rº/hjʆr»/jj½†r¼/jñX"<br />"r½/†r¾/jj½†r¿/hj±†rÀ/jj½†rÁ/jñX"<br>"rÂ/†rÃ/hjv†rÄ/jj½†rÅ/hj±†rÆ/jj½†rÇ/jñX"\n"rÈ/†rÉ/jj½†rÊ/jRX}}rË/†rÌ/hX)

5. Nested conditionals with a variable
rÍ/†rÎ/jRX{{rÏ/†rÐ/jj½†rÑ/jûXtruerÒ/†rÓ/jj½†rÔ/hjʆrÕ/jj½†rÖ/hjr†r×/jûXtruerØ/†rÙ/jj½†rÚ/hjʆrÛ/jj½†rÜ/jñX"<br />"rÝ/†rÞ/jj½†rß/hj±†rà/jj½†rá/hxXsomeVarrâ/†rã/hjv†rä/jj½†rå/hj±†ræ/jj½†rç/jñX"\n"rè/†ré/jj½†rê/jRX}}rë/†rì/hX5

6. Nested conditionals with a variable marked safe
rí/†rî/jRX{{rï/†rð/jj½†rñ/jûXtruerò/†ró/jj½†rô/hjʆrõ/jj½†rö/hjr†r÷/jûXtruerø/†rù/jj½†rú/hjʆrû/jj½†rü/jñX"<br />"rý/†rþ/jj½†rÿ/hj±†r0jj½†r0hxXsomeVarr0†r0hjn†r0jXrawr0†r0hjv†r0jj½†r0hj±†r	0jj½†r
0jñX"\n"r0†r0jj½†r
0jRX}}r0†r0hX

r0†r0e(jRX{%r0†r0jj½†r0jÃX
endautoescaper0†r0jj½†r0jRX%}r0†r0hX‹
--DATA--
return array()
--EXPECT--

1. Simple literal
<br />

2. Conditional expression with only literals
<br />

3. Conditional expression with a variable
&lt;br /&gt;

4. Nested conditionals with only literals
<br />

5. Nested conditionals with a variable
&lt;br /&gt;

6. Nested conditionals with a variable marked safe
<br />
--TEST--
"autoescape" tags can be nested at will
--TEMPLATE--
r0†r0jRX{{r0†r0jj½†r0hxXvarr0†r 0jj½†r!0jRX}}r"0†r#0hj!†r$0jRX{%r%0†r&0jj½†r'0jÃX
autoescaper(0†r)0jj½†r*0jŒX'html'r+0†r,0jj½†r-0jRX%}r.0†r/0hX
  r00†r10jRX{{r20†r30jj½†r40hxXvarr50†r60jj½†r70jRX}}r80†r90hX
  r:0†r;0jRX{%r<0†r=0jj½†r>0jÃX
autoescaper?0†r@0jj½†rA0jûXfalserB0†rC0jj½†rD0jRX%}rE0†rF0hX
    rG0†rH0jRX{{rI0†rJ0jj½†rK0hxXvarrL0†rM0jj½†rN0jRX}}rO0†rP0hX
    rQ0†rR0jRX{%rS0†rT0jj½†rU0jÃX
autoescaperV0†rW0jj½†rX0jŒX'html'rY0†rZ0jj½†r[0jRX%}r\0†r]0hX
      r^0†r_0jRX{{r`0†ra0jj½†rb0hxXvarrc0†rd0jj½†re0jRX}}rf0†rg0hX
    rh0†ri0jRX{%rj0†rk0jj½†rl0jÃX
endautoescaperm0†rn0jj½†ro0jRX%}rp0†rq0hX
    rr0†rs0jRX{{rt0†ru0jj½†rv0hxXvarrw0†rx0jj½†ry0jRX}}rz0†r{0hX
  r|0†r}0jRX{%r~0†r0jj½†r€0jÃX
endautoescaper0†r‚0jj½†rƒ0jRX%}r„0†r…0hX
  r†0†r‡0jRX{{rˆ0†r‰0jj½†rŠ0hxXvarr‹0†rŒ0jj½†r0jRX}}rŽ0†r0hj!†r0jRX{%r‘0†r’0jj½†r“0jÃX
endautoescaper”0†r•0jj½†r–0jRX%}r—0†r˜0hj!†r™0jRX{{rš0†r›0jj½†rœ0hxXvarr0†rž0jj½†rŸ0jRX}}r 0†r¡0hXñ
--DATA--
return array('var' => '<br />')
--EXPECT--
&lt;br /&gt;
  &lt;br /&gt;
      <br />
          &lt;br /&gt;
        <br />
    &lt;br /&gt;
&lt;br /&gt;
--TEST--
"autoescape" tag applies escaping to object method calls
--TEMPLATE--
r¢0†r£0jRX{%r¤0†r¥0jj½†r¦0jÃX
autoescaper§0†r¨0jj½†r©0jŒX'html'rª0†r«0jj½†r¬0jRX%}r­0†r®0hj!†r¯0jRX{{r°0†r±0jj½†r²0hxXuserr³0†r´0hxX.namerµ0†r¶0jj½†r·0jRX}}r¸0†r¹0hj!†rº0jRX{{r»0†r¼0jj½†r½0hxXuserr¾0†r¿0hxX.namerÀ0†rÁ0hjn†rÂ0jXlowerrÃ0†rÄ0jj½†rÅ0jRX}}rÆ0†rÇ0hj!†rÈ0jRX{{rÉ0†rÊ0jj½†rË0hxXuserrÌ0†rÍ0jj½†rÎ0jRX}}rÏ0†rÐ0hj!†rÑ0jRX{%rÒ0†rÓ0jj½†rÔ0jÃX
endautoescaperÕ0†rÖ0jj½†r×0jRX%}rØ0†rÙ0hX™
--EXPECT--
Fabien&lt;br /&gt;
fabien&lt;br /&gt;
Fabien&lt;br /&gt;
--TEST--
"autoescape" tag does not escape when raw is used as a filter
--TEMPLATE--
rÚ0†rÛ0jRX{%rÜ0†rÝ0jj½†rÞ0jÃX
autoescaperß0†rà0jj½†rá0jŒX'html'râ0†rã0jj½†rä0jRX%}rå0†ræ0hj!†rç0jRX{{rè0†ré0jj½†rê0hxXvarrë0†rì0hjn†rí0jXrawrî0†rï0jj½†rð0jRX}}rñ0†rò0hj!†ró0jRX{%rô0†rõ0jj½†rö0jÃX
endautoescaper÷0†rø0jj½†rù0jRX%}rú0†rû0hX€
--DATA--
return array('var' => '<br />')
--EXPECT--
<br />
--TEST--
"autoescape" tag accepts an escaping strategy
--TEMPLATE--
rü0†rý0jRX{%rþ0†rÿ0jj½†r1jÃX
autoescaper1†r1jj½†r1jûXtruer1†r1jj½†r1hxXjsr1†r1jj½†r	1jRX%}r
1†r1jRX{{r1†r
1jj½†r1hxXvarr1†r1jj½†r1jRX}}r1†r1jRX{%r1†r1jj½†r1jÃX
endautoescaper1†r1jj½†r1jRX%}r1†r1hX

r1†r1jRX{%r1†r1jj½†r 1jÃX
autoescaper!1†r"1jj½†r#1jûXtruer$1†r%1jj½†r&1hxXhtmlr'1†r(1jj½†r)1jRX%}r*1†r+1jRX{{r,1†r-1jj½†r.1hxXvarr/1†r01jj½†r11jRX}}r21†r31jRX{%r41†r51jj½†r61jÃX
endautoescaper71†r81jj½†r91jRX%}r:1†r;1hX

r<1†r=1jRX{%r>1†r?1jj½†r@1jÃX
autoescaperA1†rB1jj½†rC1jŒX'js'rD1†rE1jj½†rF1jRX%}rG1†rH1jRX{{rI1†rJ1jj½†rK1hxXvarrL1†rM1jj½†rN1jRX}}rO1†rP1jRX{%rQ1†rR1jj½†rS1jÃX
endautoescaperT1†rU1jj½†rV1jRX%}rW1†rX1hX

rY1†rZ1jRX{%r[1†r\1jj½†r]1jÃX
autoescaper^1†r_1jj½†r`1jŒX'html'ra1†rb1jj½†rc1jRX%}rd1†re1jRX{{rf1†rg1jj½†rh1hxXvarri1†rj1jj½†rk1jRX}}rl1†rm1jRX{%rn1†ro1jj½†rp1jÃX
endautoescaperq1†rr1jj½†rs1jRX%}rt1†ru1hXÒ
--DATA--
return array('var' => '<br />"')
--EXPECT--
\x3Cbr\x20\x2F\x3E\x22
&lt;br /&gt;&quot;
\x3Cbr\x20\x2F\x3E\x22
&lt;br /&gt;&quot;
--TEST--
escape types
--TEMPLATE--

1. autoescape 'html' |escape('js')

rv1†rw1jRX{%rx1†ry1jj½†rz1jÃX
autoescaper{1†r|1jj½†r}1jŒX'html'r~1†r1jj½†r€1jRX%}r1†r‚1hX
<a onclick="alert(&quot;rƒ1†r„1jRX{{r…1†r†1jj½†r‡1hxXmsgrˆ1†r‰1hjn†rŠ1jXescaper‹1†rŒ1hjr†r1jŒX'js'rŽ1†r1hjv†r1jj½†r‘1jRX}}r’1†r“1hX&quot;)"></a>
r”1†r•1jRX{%r–1†r—1jj½†r˜1jÃX
endautoescaper™1†rš1jj½†r›1jRX%}rœ1†r1hX&

2. autoescape 'html' |escape('js')

rž1†rŸ1jRX{%r 1†r¡1jj½†r¢1jÃX
autoescaper£1†r¤1jj½†r¥1jŒX'html'r¦1†r§1jj½†r¨1jRX%}r©1†rª1hX
<a onclick="alert(&quot;r«1†r¬1jRX{{r­1†r®1jj½†r¯1hxXmsgr°1†r±1hjn†r²1jXescaper³1†r´1hjr†rµ1jŒX'js'r¶1†r·1hjv†r¸1jj½†r¹1jRX}}rº1†r»1hX&quot;)"></a>
r¼1†r½1jRX{%r¾1†r¿1jj½†rÀ1jÃX
endautoescaperÁ1†rÂ1jj½†rÃ1jRX%}rÄ1†rÅ1hX$

3. autoescape 'js' |escape('js')

rÆ1†rÇ1jRX{%rÈ1†rÉ1jj½†rÊ1jÃX
autoescaperË1†rÌ1jj½†rÍ1jŒX'js'rÎ1†rÏ1jj½†rÐ1jRX%}rÑ1†rÒ1hX
<a onclick="alert(&quot;rÓ1†rÔ1jRX{{rÕ1†rÖ1jj½†r×1hxXmsgrØ1†rÙ1hjn†rÚ1jXescaperÛ1†rÜ1hjr†rÝ1jŒX'js'rÞ1†rß1hjv†rà1jj½†rá1jRX}}râ1†rã1hX&quot;)"></a>
rä1†rå1jRX{%ræ1†rç1jj½†rè1jÃX
endautoescaperé1†rê1jj½†rë1jRX%}rì1†rí1hX

4. no escape

rî1†rï1jRX{%rð1†rñ1jj½†rò1jÃX
autoescaperó1†rô1jj½†rõ1jûXfalserö1†r÷1jj½†rø1jRX%}rù1†rú1hX
<a onclick="alert(&quot;rû1†rü1jRX{{rý1†rþ1jj½†rÿ1hxXmsgr2†r2jj½†r2jRX}}r2†r2hX&quot;)"></a>
r2†r2jRX{%r2†r2jj½†r	2jÃX
endautoescaper
2†r2jj½†r2jRX%}r
2†r2hX#

5. |escape('js')|escape('html')

r2†r2jRX{%r2†r2jj½†r2jÃX
autoescaper2†r2jj½†r2jûXfalser2†r2jj½†r2jRX%}r2†r2hX
<a onclick="alert(&quot;r2†r2jRX{{r2†r2jj½†r 2hxXmsgr!2†r"2hjn†r#2jXescaper$2†r%2hjr†r&2jŒX'js'r'2†r(2hjv†r)2hjn†r*2jXescaper+2†r,2hjr†r-2jŒX'html'r.2†r/2hjv†r02jj½†r12jRX}}r22†r32hX&quot;)"></a>
r42†r52jRX{%r62†r72jj½†r82jÃX
endautoescaper92†r:2jj½†r;2jRX%}r<2†r=2hX5

6. autoescape 'html' |escape('js')|escape('html')

r>2†r?2jRX{%r@2†rA2jj½†rB2jÃX
autoescaperC2†rD2jj½†rE2jŒX'html'rF2†rG2jj½†rH2jRX%}rI2†rJ2hX
<a onclick="alert(&quot;rK2†rL2jRX{{rM2†rN2jj½†rO2hxXmsgrP2†rQ2hjn†rR2jXescaperS2†rT2hjr†rU2jŒX'js'rV2†rW2hjv†rX2hjn†rY2jXescaperZ2†r[2hjr†r\2jŒX'html'r]2†r^2hjv†r_2jj½†r`2jRX}}ra2†rb2hX&quot;)"></a>
rc2†rd2jRX{%re2†rf2jj½†rg2jÃX
endautoescaperh2†ri2jj½†rj2jRX%}rk2†rl2hXª

--DATA--
return array('msg' => "<>\n'\"")
--EXPECT--

1. autoescape 'html' |escape('js')

<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>

2. autoescape 'html' |escape('js')

<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>

3. autoescape 'js' |escape('js')

<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>

4. no escape

<a onclick="alert(&quot;<>
'"&quot;)"></a>

5. |escape('js')|escape('html')

<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>

6. autoescape 'html' |escape('js')|escape('html')

<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>

--TEST--
"autoescape" tag do not applies escaping on filter arguments
--TEMPLATE--
rm2†rn2jRX{%ro2†rp2jj½†rq2jÃX
autoescaperr2†rs2jj½†rt2jŒX'html'ru2†rv2jj½†rw2jRX%}rx2†ry2hj!†rz2jRX{{r{2†r|2jj½†r}2hxXvarr~2†r2hjn†r€2jXnl2brr2†r‚2hjr†rƒ2jñX"<br />"r„2†r…2hjv†r†2jj½†r‡2jRX}}rˆ2†r‰2hj!†rŠ2jRX{{r‹2†rŒ2jj½†r2hxXvarrŽ2†r2hjn†r2jXnl2brr‘2†r’2hjr†r“2jñX"<br />"r”2†r•2hjn†r–2jXescaper—2†r˜2hjv†r™2jj½†rš2jRX}}r›2†rœ2hj!†r2jRX{{rž2†rŸ2jj½†r 2hxXvarr¡2†r¢2hjn†r£2jXnl2brr¤2†r¥2hjr†r¦2hxXsepr§2†r¨2hjv†r©2jj½†rª2jRX}}r«2†r¬2hj!†r­2jRX{{r®2†r¯2jj½†r°2hxXvarr±2†r²2hjn†r³2jXnl2brr´2†rµ2hjr†r¶2hxXsepr·2†r¸2hjn†r¹2jXrawrº2†r»2hjv†r¼2jj½†r½2jRX}}r¾2†r¿2hj!†rÀ2jRX{{rÁ2†rÂ2jj½†rÃ2hxXvarrÄ2†rÅ2hjn†rÆ2jXnl2brrÇ2†rÈ2hjr†rÉ2hxXseprÊ2†rË2hjn†rÌ2jXescaperÍ2†rÎ2hjv†rÏ2jj½†rÐ2jRX}}rÑ2†rÒ2hj!†rÓ2jRX{%rÔ2†rÕ2jj½†rÖ2jÃX
endautoescaper×2†rØ2jj½†rÙ2jRX%}rÚ2†rÛ2hX,
--DATA--
return array('var' => "<Fabien>\nTwig", 'sep' => '<br />')
--EXPECT--
&lt;Fabien&gt;<br />
Twig
&lt;Fabien&gt;&lt;br /&gt;
Twig
&lt;Fabien&gt;<br />
Twig
&lt;Fabien&gt;<br />
Twig
&lt;Fabien&gt;&lt;br /&gt;
Twig
--TEST--
"autoescape" tag applies escaping after calling filters
--TEMPLATE--
rÜ2†rÝ2jRX{%rÞ2†rß2jj½†rà2jÃX
autoescaperá2†râ2jj½†rã2jŒX'html'rä2†rå2jj½†ræ2jRX%}rç2†rè2hX®

(escape_and_nl2br is an escaper filter)

1. Don't escape escaper filter output
( var is escaped by |escape_and_nl2br, line-breaks are added, 
  the output is not escaped )
ré2†rê2jRX{{rë2†rì2jj½†rí2hxXvarrî2†rï2hjn†rð2jXescape_and_nl2brrñ2†rò2jj½†ró2jRX}}rô2†rõ2hX˜

2. Don't escape escaper filter output
( var is escaped by |escape_and_nl2br, line-breaks are added, 
  the output is not escaped, |raw is redundant )
rö2†r÷2jRX{{rø2†rù2jj½†rú2hxXvarrû2†rü2hjn†rý2jXescape_and_nl2brrþ2†rÿ2hjn†r3jXrawr3†r3jj½†r3jRX}}r3†r3hXƒ

3. Explicit escape
( var is escaped by |escape_and_nl2br, line-breaks are added,
  the output is explicitly escaped by |escape )
r3†r3jRX{{r3†r	3jj½†r
3hxXvarr3†r3hjn†r
3jXescape_and_nl2brr3†r3hjn†r3jXescaper3†r3jj½†r3jRX}}r3†r3hXe

4. Escape non-escaper filter output
( var is upper-cased by |upper,
  the output is auto-escaped )
r3†r3jRX{{r3†r3jj½†r3hxXvarr3†r3hjn†r3jXupperr3†r3jj½†r 3jRX}}r!3†r"3hXÍ

5. Escape if last filter is not an escaper
( var is escaped by |escape_and_nl2br, line-breaks are added,
  the output is upper-cased by |upper,
  the output is auto-escaped as |upper is not an escaper )
r#3†r$3jRX{{r%3†r&3jj½†r'3hxXvarr(3†r)3hjn†r*3jXescape_and_nl2brr+3†r,3hjn†r-3jXupperr.3†r/3jj½†r03jRX}}r13†r23hXÍ

6. Don't escape escaper filter output
( var is upper cased by upper,
  the output is escaped by |escape_and_nl2br, line-breaks are added,
  the output is not escaped as |escape_and_nl2br is an escaper )
r33†r43jRX{{r53†r63jj½†r73hxXvarr83†r93hjn†r:3jXupperr;3†r<3hjn†r=3jXescape_and_nl2brr>3†r?3jj½†r@3jRX}}rA3†rB3hX}

7. Escape if last filter is not an escaper
( the output of |format is "<b>" ~ var ~ "</b>",
  the output is auto-escaped )
rC3†rD3jRX{{rE3†rF3jj½†rG3jñX"<b>%s</b>"rH3†rI3hjn†rJ3jXformatrK3†rL3hjr†rM3hxXvarrN3†rO3hjv†rP3jj½†rQ3jRX}}rR3†rS3hX’

8. Escape if last filter is not an escaper
( the output of |format is "<b>" ~ var ~ "</b>",
  |raw is redundant,
  the output is auto-escaped )
rT3†rU3jRX{{rV3†rW3jj½†rX3jñX"<b>%s</b>"rY3†rZ3hjn†r[3jXrawr\3†r]3hjn†r^3jXformatr_3†r`3hjr†ra3hxXvarrb3†rc3hjv†rd3jj½†re3jRX}}rf3†rg3hX•

9. Don't escape escaper filter output
( the output of |format is "<b>" ~ var ~ "</b>",
  the output is not escaped due to |raw filter at the end )
rh3†ri3jRX{{rj3†rk3jj½†rl3jñX"<b>%s</b>"rm3†rn3hjn†ro3jXformatrp3†rq3hjr†rr3hxXvarrs3†rt3hjv†ru3hjn†rv3jXrawrw3†rx3jj½†ry3jRX}}rz3†r{3hX½

10. Don't escape escaper filter output
( the output of |format is "<b>" ~ var ~ "</b>",
  the output is not escaped due to |raw filter at the end,
  the |raw filter on var is redundant )
r|3†r}3jRX{{r~3†r3jj½†r€3jñX"<b>%s</b>"r3†r‚3hjn†rƒ3jXformatr„3†r…3hjr†r†3hxXvarr‡3†rˆ3hjn†r‰3jXrawrŠ3†r‹3hjv†rŒ3hjn†r3jXrawrŽ3†r3jj½†r3jRX}}r‘3†r’3hX

r“3†r”3jRX{%r•3†r–3jj½†r—3jÃX
endautoescaper˜3†r™3jj½†rš3jRX%}r›3†rœ3hXû
--DATA--
return array('var' => "<Fabien>\nTwig")
--EXPECT--

(escape_and_nl2br is an escaper filter)

1. Don't escape escaper filter output
( var is escaped by |escape_and_nl2br, line-breaks are added, 
  the output is not escaped )
&lt;Fabien&gt;<br />
Twig

2. Don't escape escaper filter output
( var is escaped by |escape_and_nl2br, line-breaks are added, 
  the output is not escaped, |raw is redundant )
&lt;Fabien&gt;<br />
Twig

3. Explicit escape
( var is escaped by |escape_and_nl2br, line-breaks are added,
  the output is explicitly escaped by |escape )
&amp;lt;Fabien&amp;gt;&lt;br /&gt;
Twig

4. Escape non-escaper filter output
( var is upper-cased by |upper,
  the output is auto-escaped )
&lt;FABIEN&gt;
TWIG

5. Escape if last filter is not an escaper
( var is escaped by |escape_and_nl2br, line-breaks are added,
  the output is upper-cased by |upper,
  the output is auto-escaped as |upper is not an escaper )
&amp;LT;FABIEN&amp;GT;&lt;BR /&gt;
TWIG

6. Don't escape escaper filter output
( var is upper cased by upper,
  the output is escaped by |escape_and_nl2br, line-breaks are added,
  the output is not escaped as |escape_and_nl2br is an escaper )
&lt;FABIEN&gt;<br />
TWIG

7. Escape if last filter is not an escaper
( the output of |format is "<b>" ~ var ~ "</b>",
  the output is auto-escaped )
&lt;b&gt;&lt;Fabien&gt;
Twig&lt;/b&gt;

8. Escape if last filter is not an escaper
( the output of |format is "<b>" ~ var ~ "</b>",
  |raw is redundant,
  the output is auto-escaped )
&lt;b&gt;&lt;Fabien&gt;
Twig&lt;/b&gt;

9. Don't escape escaper filter output
( the output of |format is "<b>" ~ var ~ "</b>",
  the output is not escaped due to |raw filter at the end )
<b><Fabien>
Twig</b>

10. Don't escape escaper filter output
( the output of |format is "<b>" ~ var ~ "</b>",
  the output is not escaped due to |raw filter at the end,
  the |raw filter on var is redundant )
<b><Fabien>
Twig</b>
--TEST--
"autoescape" tag applies escaping after calling filters, and before calling pre_escape filters
--TEMPLATE--
r3†rž3jRX{%rŸ3†r 3jj½†r¡3jÃX
autoescaper¢3†r£3jj½†r¤3jŒX'html'r¥3†r¦3jj½†r§3jRX%}r¨3†r©3hX{

(nl2br is pre_escaped for "html" and declared safe for "html")

1. Pre-escape and don't post-escape
( var|escape|nl2br )
rª3†r«3jRX{{r¬3†r­3jj½†r®3hxXvarr¯3†r°3hjn†r±3jXnl2brr²3†r³3jj½†r´3jRX}}rµ3†r¶3hX2

2. Don't double-pre-escape
( var|escape|nl2br )
r·3†r¸3jRX{{r¹3†rº3jj½†r»3hxXvarr¼3†r½3hjn†r¾3jXescaper¿3†rÀ3hjn†rÁ3jXnl2brrÂ3†rÃ3jj½†rÄ3jRX}}rÅ3†rÆ3hX0

3. Don't escape safe values
( var|raw|nl2br )
rÇ3†rÈ3jRX{{rÉ3†rÊ3jj½†rË3hxXvarrÌ3†rÍ3hjn†rÎ3jXrawrÏ3†rÐ3hjn†rÑ3jXnl2brrÒ3†rÓ3jj½†rÔ3jRX}}rÕ3†rÖ3hX9

4. Don't escape safe values
( var|escape|nl2br|nl2br )
r×3†rØ3jRX{{rÙ3†rÚ3jj½†rÛ3hxXvarrÜ3†rÝ3hjn†rÞ3jXnl2brrß3†rà3hjn†rá3jXnl2brrâ3†rã3jj½†rä3jRX}}rå3†ræ3hXc

5. Re-escape values that are escaped for an other contexts
( var|escape_something|escape|nl2br )
rç3†rè3jRX{{ré3†rê3jj½†rë3hxXvarrì3†rí3hjn†rî3jXescape_somethingrï3†rð3hjn†rñ3jXnl2brrò3†ró3jj½†rô3jRX}}rõ3†rö3hXY

6. Still escape when using filters not declared safe
( var|escape|nl2br|upper|escape )
r÷3†rø3jRX{{rù3†rú3jj½†rû3hxXvarrü3†rý3hjn†rþ3jXnl2brrÿ3†r4hjn†r4jXupperr4†r4jj½†r4jRX}}r4†r4hX

r4†r4jRX{%r	4†r
4jj½†r4jÃX
endautoescaper4†r
4jj½†r4jRX%}r4†r4hX
--DATA--
return array('var' => "<Fabien>\nTwig")
--EXPECT--

(nl2br is pre_escaped for "html" and declared safe for "html")

1. Pre-escape and don't post-escape
( var|escape|nl2br )
&lt;Fabien&gt;<br />
Twig

2. Don't double-pre-escape
( var|escape|nl2br )
&lt;Fabien&gt;<br />
Twig

3. Don't escape safe values
( var|raw|nl2br )
<Fabien><br />
Twig

4. Don't escape safe values
( var|escape|nl2br|nl2br )
&lt;Fabien&gt;<br /><br />
Twig

5. Re-escape values that are escaped for an other contexts
( var|escape_something|escape|nl2br )
&lt;FABIEN&gt;<br />
TWIG

6. Still escape when using filters not declared safe
( var|escape|nl2br|upper|escape )
&amp;LT;FABIEN&amp;GT;&lt;BR /&gt;
TWIG

--TEST--
"autoescape" tag handles filters preserving the safety
--TEMPLATE--
r4†r4jRX{%r4†r4jj½†r4jÃX
autoescaper4†r4jj½†r4jŒX'html'r4†r4jj½†r4jRX%}r4†r4hXx

(preserves_safety is preserving safety for "html")

1. Unsafe values are still unsafe
( var|preserves_safety|escape )
r4†r4jRX{{r 4†r!4jj½†r"4hxXvarr#4†r$4hjn†r%4jXpreserves_safetyr&4†r'4jj½†r(4jRX}}r)4†r*4hX@

2. Safe values are still safe
( var|escape|preserves_safety )
r+4†r,4jRX{{r-4†r.4jj½†r/4hxXvarr04†r14hjn†r24jXescaper34†r44hjn†r54jXpreserves_safetyr64†r74jj½†r84jRX}}r94†r:4hXn

3. Re-escape values that are escaped for an other contexts
( var|escape_something|preserves_safety|escape )
r;4†r<4jRX{{r=4†r>4jj½†r?4hxXvarr@4†rA4hjn†rB4jXescape_somethingrC4†rD4hjn†rE4jXpreserves_safetyrF4†rG4jj½†rH4jRX}}rI4†rJ4hX]

4. Still escape when using filters not declared safe
( var|escape|preserves_safety|replace(rK4†rL4hj­†rM4hX'FABIEN': 'FABPOT'})|escape )
rN4†rO4jRX{{rP4†rQ4jj½†rR4hxXvarrS4†rT4hjn†rU4jXescaperV4†rW4hjn†rX4jXpreserves_safetyrY4†rZ4hjn†r[4jXreplacer\4†r]4hjr†r^4hj­†r_4jŒX'FABIEN'r`4†ra4hj±†rb4jj½†rc4jŒX'FABPOT'rd4†re4hj½†rf4hjv†rg4jj½†rh4jRX}}ri4†rj4hX

rk4†rl4jRX{%rm4†rn4jj½†ro4jÃX
endautoescaperp4†rq4jj½†rr4jRX%}rs4†rt4hXø
--DATA--
return array('var' => "<Fabien>\nTwig")
--EXPECT--

(preserves_safety is preserving safety for "html")

1. Unsafe values are still unsafe
( var|preserves_safety|escape )
&lt;FABIEN&gt;
TWIG

2. Safe values are still safe
( var|escape|preserves_safety )
&LT;FABIEN&GT;
TWIG

3. Re-escape values that are escaped for an other contexts
( var|escape_something|preserves_safety|escape )
&lt;FABIEN&gt;
TWIG

4. Still escape when using filters not declared safe
( var|escape|preserves_safety|replace(ru4†rv4hj­†rw4hX]'FABIEN': 'FABPOT'})|escape )
&amp;LT;FABPOT&amp;GT;
TWIG

--TEST--
"block" tag
--TEMPLATE--
rx4†ry4jRX{%rz4†r{4jj½†r|4jÃXblockr}4†r~4jj½†r4hxXtitle1r€4†r4jj½†r‚4jRX%}rƒ4†r„4hXFOOr…4†r†4jRX{%r‡4†rˆ4jj½†r‰4jÃXendblockrŠ4†r‹4jj½†rŒ4jRX%}r4†rŽ4hj!†r4jRX{%r4†r‘4jj½†r’4jÃXblockr“4†r”4jj½†r•4hxXtitle2r–4†r—4jj½†r˜4hxXfoor™4†rš4hjn†r›4jXlowerrœ4†r4jj½†rž4jRX%}rŸ4†r 4hX
--TEMPLATE(foo.twig)--
r¡4†r¢4jRX{%r£4†r¤4jj½†r¥4jÃXblockr¦4†r§4jj½†r¨4hxXcontentr©4†rª4jj½†r«4jRX%}r¬4†r­4jRX{%r®4†r¯4jj½†r°4jÃXendblockr±4†r²4jj½†r³4jRX%}r´4†rµ4hX[
--DATA--
return array('foo' => 'bar')
--EXPECT--
FOObar
--TEST--
"block" tag
--TEMPLATE--
r¶4†r·4jRX{%r¸4†r¹4jj½†rº4jÃXblockr»4†r¼4jj½†r½4hxXcontentr¾4†r¿4jj½†rÀ4jRX%}rÁ4†rÂ4hX
    rÃ4†rÄ4jRX{%rÅ4†rÆ4jj½†rÇ4jÃXblockrÈ4†rÉ4jj½†rÊ4hxXcontentrË4†rÌ4jj½†rÍ4jRX%}rÎ4†rÏ4hX
    rÐ4†rÑ4jRX{%rÒ4†rÓ4jj½†rÔ4jÃXendblockrÕ4†rÖ4jj½†r×4jRX%}rØ4†rÙ4hj!†rÚ4jRX{%rÛ4†rÜ4jj½†rÝ4jÃXendblockrÞ4†rß4jj½†rà4jRX%}rá4†râ4hXÁ
--DATA--
return array()
--EXCEPTION--
Twig_Error_Syntax: The block 'content' has already been defined line 2 in "index.twig" at line 3
--TEST--
"§" special chars in a block name
--TEMPLATE--
rã4†rä4jRX{%rå4†ræ4jj½†rç4jÃXblockrè4†ré4jj½†rê4hxX§rë4†rì4jj½†rí4jRX%}rî4†rï4hX
§
rð4†rñ4jRX{%rò4†ró4jj½†rô4jÃXendblockrõ4†rö4jj½†r÷4hxjë4†rø4jj½†rù4jRX%}rú4†rû4hXM
--DATA--
return array()
--EXPECT--
§
--TEST--
"embed" tag
--TEMPLATE--
FOO
rü4†rý4jRX{%rþ4†rÿ4jj½†r5jÃXembedr5†r5jj½†r5jñX
"foo.twig"r5†r5jj½†r5jRX%}r5†r5hX
    r	5†r
5jRX{%r5†r5jj½†r
5jÃXblockr5†r5jj½†r5hxXc1r5†r5jj½†r5jRX%}r5†r5hX	
        r5†r5jRX{{r5†r5jj½†r5híXparentr5†r5hjr†r5hjv†r5jj½†r5jRX}}r 5†r!5hX
        block1extended
    r"5†r#5jRX{%r$5†r%5jj½†r&5jÃXendblockr'5†r(5jj½†r)5jRX%}r*5†r+5hj!†r,5jRX{%r-5†r.5jj½†r/5jÃXendembedr05†r15jj½†r25jRX%}r35†r45hX

BAR
--TEMPLATE(foo.twig)--
A
r55†r65jRX{%r75†r85jj½†r95jÃXblockr:5†r;5jj½†r<5hxXc1r=5†r>5jj½†r?5jRX%}r@5†rA5hX
    block1
rB5†rC5jRX{%rD5†rE5jj½†rF5jÃXendblockrG5†rH5jj½†rI5jRX%}rJ5†rK5hX
B
rL5†rM5jRX{%rN5†rO5jj½†rP5jÃXblockrQ5†rR5jj½†rS5hxXc2rT5†rU5jj½†rV5jRX%}rW5†rX5hX
    block2
rY5†rZ5jRX{%r[5†r\5jj½†r]5jÃXendblockr^5†r_5jj½†r`5jRX%}ra5†rb5hX¡
C
--DATA--
return array()
--EXPECT--
FOO

A
            block1

        block1extended
    B
    block2
C
BAR
--TEST--
"embed" tag
--TEMPLATE(index.twig)--
FOO
rc5†rd5jRX{%re5†rf5jj½†rg5jÃXembedrh5†ri5jj½†rj5jñX
"foo.twig"rk5†rl5jj½†rm5jRX%}rn5†ro5hX
    rp5†rq5jRX{%rr5†rs5jj½†rt5jÃXblockru5†rv5jj½†rw5hxXc1rx5†ry5jj½†rz5jRX%}r{5†r|5hX	
        r}5†r~5jRX{{r5†r€5jj½†r5hxXnothingr‚5†rƒ5jj½†r„5jRX}}r…5†r†5hX
    r‡5†rˆ5jRX{%r‰5†rŠ5jj½†r‹5jÃXendblockrŒ5†r5jj½†rŽ5jRX%}r5†r5hj!†r‘5jRX{%r’5†r“5jj½†r”5jÃXendembedr•5†r–5jj½†r—5jRX%}r˜5†r™5hX
BAR
--TEMPLATE(foo.twig)--
rš5†r›5jRX{%rœ5†r5jj½†rž5jÃXblockrŸ5†r 5jj½†r¡5hxXc1r¢5†r£5jj½†r¤5jRX%}r¥5†r¦5jRX{%r§5†r¨5jj½†r©5jÃXendblockrª5†r«5jj½†r¬5jRX%}r­5†r®5hX
--DATA--
return array()
--EXCEPTION--
Twig_Error_Runtime: Variable "nothing" does not exist in "index.twig" at line 5
--TEST--
"embed" tag
--TEMPLATE--
FOO
r¯5†r°5jRX{%r±5†r²5jj½†r³5jÃXembedr´5†rµ5jj½†r¶5jñX
"foo.twig"r·5†r¸5jj½†r¹5jRX%}rº5†r»5hX
    r¼5†r½5jRX{%r¾5†r¿5jj½†rÀ5jÃXblockrÁ5†rÂ5jj½†rÃ5hxXc1rÄ5†rÅ5jj½†rÆ5jRX%}rÇ5†rÈ5hX	
        rÉ5†rÊ5jRX{{rË5†rÌ5jj½†rÍ5híXparentrÎ5†rÏ5hjr†rÐ5hjv†rÑ5jj½†rÒ5jRX}}rÓ5†rÔ5hX
        block1extended
    rÕ5†rÖ5jRX{%r×5†rØ5jj½†rÙ5jÃXendblockrÚ5†rÛ5jj½†rÜ5jRX%}rÝ5†rÞ5hj!†rß5jRX{%rà5†rá5jj½†râ5jÃXendembedrã5†rä5jj½†rå5jRX%}ræ5†rç5hX

rè5†ré5jRX{%rê5†rë5jj½†rì5jÃXembedrí5†rî5jj½†rï5jñX
"foo.twig"rð5†rñ5jj½†rò5jRX%}ró5†rô5hX
    rõ5†rö5jRX{%r÷5†rø5jj½†rù5jÃXblockrú5†rû5jj½†rü5hxXc1rý5†rþ5jj½†rÿ5jRX%}r6†r6hX	
        r6†r6jRX{{r6†r6jj½†r6híXparentr6†r6hjr†r	6hjv†r
6jj½†r6jRX}}r6†r
6hX
        block1extended
    r6†r6jRX{%r6†r6jj½†r6jÃXendblockr6†r6jj½†r6jRX%}r6†r6hj!†r6jRX{%r6†r6jj½†r6jÃXendembedr6†r6jj½†r6jRX%}r6†r 6hX

BAR
--TEMPLATE(foo.twig)--
A
r!6†r"6jRX{%r#6†r$6jj½†r%6jÃXblockr&6†r'6jj½†r(6hxXc1r)6†r*6jj½†r+6jRX%}r,6†r-6hX
    block1
r.6†r/6jRX{%r06†r16jj½†r26jÃXendblockr36†r46jj½†r56jRX%}r66†r76hX
B
r86†r96jRX{%r:6†r;6jj½†r<6jÃXblockr=6†r>6jj½†r?6hxXc2r@6†rA6jj½†rB6e(jRX%}rC6†rD6hX
    block2
rE6†rF6jRX{%rG6†rH6jj½†rI6jÃXendblockrJ6†rK6jj½†rL6jRX%}rM6†rN6hXÒ
C
--DATA--
return array()
--EXPECT--
FOO

A
            block1

        block1extended
    B
    block2
C

A
            block1

        block1extended
    B
    block2
C
BAR
--TEST--
"embed" tag
--TEMPLATE--
rO6†rP6jRX{%rQ6†rR6jj½†rS6jÃXembedrT6†rU6jj½†rV6jñX
"foo.twig"rW6†rX6jj½†rY6jRX%}rZ6†r[6hX
    r\6†r]6jRX{%r^6†r_6jj½†r`6jÃXblockra6†rb6jj½†rc6hxXc1rd6†re6jj½†rf6jRX%}rg6†rh6hX	
        ri6†rj6jRX{{rk6†rl6jj½†rm6híXparentrn6†ro6hjr†rp6hjv†rq6jj½†rr6jRX}}rs6†rt6hX	
        ru6†rv6jRX{%rw6†rx6jj½†ry6jÃXembedrz6†r{6jj½†r|6jñX
"foo.twig"r}6†r~6jj½†r6jRX%}r€6†r6hX

            r‚6†rƒ6jRX{%r„6†r…6jj½†r†6jÃXblockr‡6†rˆ6jj½†r‰6hxXc1rŠ6†r‹6jj½†rŒ6jRX%}r6†rŽ6hX
                r6†r6jRX{{r‘6†r’6jj½†r“6híXparentr”6†r•6hjr†r–6hjv†r—6jj½†r˜6jRX}}r™6†rš6hX,
                block1extended
            r›6†rœ6jRX{%r6†rž6jj½†rŸ6jÃXendblockr 6†r¡6jj½†r¢6jRX%}r£6†r¤6hX	
        r¥6†r¦6jRX{%r§6†r¨6jj½†r©6jÃXendembedrª6†r«6jj½†r¬6jRX%}r­6†r®6hX

    r¯6†r°6jRX{%r±6†r²6jj½†r³6jÃXendblockr´6†rµ6jj½†r¶6jRX%}r·6†r¸6hj!†r¹6jRX{%rº6†r»6jj½†r¼6jÃXendembedr½6†r¾6jj½†r¿6jRX%}rÀ6†rÁ6hX
--TEMPLATE(foo.twig)--
A
rÂ6†rÃ6jRX{%rÄ6†rÅ6jj½†rÆ6jÃXblockrÇ6†rÈ6jj½†rÉ6hxXc1rÊ6†rË6jj½†rÌ6jRX%}rÍ6†rÎ6hX
    block1
rÏ6†rÐ6jRX{%rÑ6†rÒ6jj½†rÓ6jÃXendblockrÔ6†rÕ6jj½†rÖ6jRX%}r×6†rØ6hX
B
rÙ6†rÚ6jRX{%rÛ6†rÜ6jj½†rÝ6jÃXblockrÞ6†rß6jj½†rà6hxXc2rá6†râ6jj½†rã6jRX%}rä6†rå6hX
    block2
ræ6†rç6jRX{%rè6†ré6jj½†rê6jÃXendblockrë6†rì6jj½†rí6jRX%}rî6†rï6hXÒ
C
--DATA--
return array()
--EXPECT--
A
            block1

        
A
                    block1

                block1extended
            B
    block2
C
    B
    block2
C
--TEST--
"embed" tag
--TEMPLATE--
rð6†rñ6jRX{%rò6†ró6jj½†rô6jÃXextendsrõ6†rö6jj½†r÷6jñX"base.twig"rø6†rù6jj½†rú6jRX%}rû6†rü6hX

rý6†rþ6jRX{%rÿ6†r7jj½†r7jÃXblockr7†r7jj½†r7hxXc1r7†r7jj½†r7jRX%}r7†r	7hX
    r
7†r7jRX{{r7†r
7jj½†r7híXparentr7†r7hjr†r7hjv†r7jj½†r7jRX}}r7†r7hX
    blockc1baseextended
r7†r7jRX{%r7†r7jj½†r7jÃXendblockr7†r7jj½†r7jRX%}r7†r7hX

r 7†r!7jRX{%r"7†r#7jj½†r$7jÃXblockr%7†r&7jj½†r'7hxXc2r(7†r)7jj½†r*7jRX%}r+7†r,7hX
    r-7†r.7jRX{{r/7†r07jj½†r17híXparentr27†r37hjr†r47hjv†r57jj½†r67jRX}}r77†r87hX

    r97†r:7jRX{%r;7†r<7jj½†r=7jÃXembedr>7†r?7jj½†r@7jñX
"foo.twig"rA7†rB7jj½†rC7jRX%}rD7†rE7hX	
        rF7†rG7jRX{%rH7†rI7jj½†rJ7jÃXblockrK7†rL7jj½†rM7hxXc1rN7†rO7jj½†rP7jRX%}rQ7†rR7hX

            rS7†rT7jRX{{rU7†rV7jj½†rW7híXparentrX7†rY7hjr†rZ7hjv†r[7jj½†r\7jRX}}r]7†r^7hX$
            block1extended
        r_7†r`7jRX{%ra7†rb7jj½†rc7jÃXendblockrd7†re7jj½†rf7jRX%}rg7†rh7hX
    ri7†rj7jRX{%rk7†rl7jj½†rm7jÃXendembedrn7†ro7jj½†rp7jRX%}rq7†rr7hj!†rs7jRX{%rt7†ru7jj½†rv7jÃXendblockrw7†rx7jj½†ry7jRX%}rz7†r{7hX
--TEMPLATE(base.twig)--
A
r|7†r}7jRX{%r~7†r7jj½†r€7jÃXblockr7†r‚7jj½†rƒ7hxXc1r„7†r…7jj½†r†7jRX%}r‡7†rˆ7hX
    blockc1base
r‰7†rŠ7jRX{%r‹7†rŒ7jj½†r7jÃXendblockrŽ7†r7jj½†r7jRX%}r‘7†r’7hj!†r“7jRX{%r”7†r•7jj½†r–7jÃXblockr—7†r˜7jj½†r™7hxXc2rš7†r›7jj½†rœ7jRX%}r7†rž7hX
    blockc2base
rŸ7†r 7jRX{%r¡7†r¢7jj½†r£7jÃXendblockr¤7†r¥7jj½†r¦7jRX%}r§7†r¨7hX
B
--TEMPLATE(foo.twig)--
A
r©7†rª7jRX{%r«7†r¬7jj½†r­7jÃXblockr®7†r¯7jj½†r°7hxXc1r±7†r²7jj½†r³7jRX%}r´7†rµ7hX
    block1
r¶7†r·7jRX{%r¸7†r¹7jj½†rº7jÃXendblockr»7†r¼7jj½†r½7jRX%}r¾7†r¿7hX
B
rÀ7†rÁ7jRX{%rÂ7†rÃ7jj½†rÄ7jÃXblockrÅ7†rÆ7jj½†rÇ7hxXc2rÈ7†rÉ7jj½†rÊ7jRX%}rË7†rÌ7hX
    block2
rÍ7†rÎ7jRX{%rÏ7†rÐ7jj½†rÑ7jÃXendblockrÒ7†rÓ7jj½†rÔ7jRX%}rÕ7†rÖ7hX
C
--DATA--
return array()
--EXPECT--
A
        blockc1base

    blockc1baseextended
        blockc2base


    
A
                block1

            block1extended
        B
    block2
CB--TEST--
"filter" tag applies a filter on its children
--TEMPLATE--
r×7†rØ7jRX{%rÙ7†rÚ7jj½†rÛ7jÃXfilterrÜ7†rÝ7jj½†rÞ7jXupperrß7†rà7jj½†rá7jRX%}râ7†rã7hX
Some text with a rä7†rå7jRX{{ræ7†rç7jj½†rè7hxXvarré7†rê7jj½†rë7jRX}}rì7†rí7hj!†rî7jRX{%rï7†rð7jj½†rñ7jÃX	endfilterrò7†ró7jj½†rô7jRX%}rõ7†rö7hX‹
--DATA--
return array('var' => 'var')
--EXPECT--
SOME TEXT WITH A VAR
--TEST--
"filter" tag applies a filter on its children
--TEMPLATE--
r÷7†rø7jRX{%rù7†rú7jj½†rû7jÃXfilterrü7†rý7jj½†rþ7jXjson_encoderÿ7†r8hjn†r8jXrawr8†r8jj½†r8jRX%}r8†r8hXtestr8†r8jRX{%r	8†r
8jj½†r8jÃX	endfilterr8†r
8jj½†r8jRX%}r8†r8hXo
--DATA--
return array()
--EXPECT--
"test"
--TEST--
"filter" tags accept multiple chained filters
--TEMPLATE--
r8†r8jRX{%r8†r8jj½†r8jÃXfilterr8†r8jj½†r8jXlowerr8†r8hjn†r8jXtitler8†r8jj½†r8jRX%}r8†r 8hX
  r!8†r"8jRX{{r#8†r$8jj½†r%8hxXvarr&8†r'8jj½†r(8jRX}}r)8†r*8hj!†r+8jRX{%r,8†r-8jj½†r.8jÃX	endfilterr/8†r08jj½†r18jRX%}r28†r38hXt
--DATA--
return array('var' => 'VAR')
--EXPECT--
    Var
--TEST--
"filter" tags can be nested at will
--TEMPLATE--
r48†r58jRX{%r68†r78jj½†r88jÃXfilterr98†r:8jj½†r;8jXlowerr<8†r=8hjn†r>8jXtitler?8†r@8jj½†rA8jRX%}rB8†rC8hX
  rD8†rE8jRX{{rF8†rG8jj½†rH8hxXvarrI8†rJ8jj½†rK8jRX}}rL8†rM8hX
  rN8†rO8jRX{%rP8†rQ8jj½†rR8jÃXfilterrS8†rT8jj½†rU8jXupperrV8†rW8jj½†rX8jRX%}rY8†rZ8hX
    r[8†r\8jRX{{r]8†r^8jj½†r_8hxXvarr`8†ra8jj½†rb8jRX}}rc8†rd8hX
  re8†rf8jRX{%rg8†rh8jj½†ri8jÃX	endfilterrj8†rk8jj½†rl8jRX%}rm8†rn8hX
  ro8†rp8jRX{{rq8†rr8jj½†rs8hxXvarrt8†ru8jj½†rv8jRX}}rw8†rx8hj!†ry8jRX{%rz8†r{8jj½†r|8jÃX	endfilterr}8†r~8jj½†r8jRX%}r€8†r8hXŽ
--DATA--
return array('var' => 'var')
--EXPECT--
  Var
      Var
    Var
--TEST--
"filter" tag applies the filter on "for" tags
--TEMPLATE--
r‚8†rƒ8jRX{%r„8†r…8jj½†r†8jÃXfilterr‡8†rˆ8jj½†r‰8jXupperrŠ8†r‹8jj½†rŒ8jRX%}r8†rŽ8hj!†r8jRX{%r8†r‘8jj½†r’8jÃXforr“8†r”8jj½†r•8hxXitemr–8†r—8jj½†r˜8jÃXinr™8†rš8jj½†r›8hxXitemsrœ8†r8jj½†rž8jRX%}rŸ8†r 8hj!†r¡8jRX{{r¢8†r£8jj½†r¤8hxXitemr¥8†r¦8jj½†r§8jRX}}r¨8†r©8hj!†rª8jRX{%r«8†r¬8jj½†r­8jÃXendforr®8†r¯8jj½†r°8jRX%}r±8†r²8hj!†r³8jRX{%r´8†rµ8jj½†r¶8jÃX	endfilterr·8†r¸8jj½†r¹8jRX%}rº8†r»8hX…
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
A
B
--TEST--
"filter" tag applies the filter on "if" tags
--TEMPLATE--
r¼8†r½8jRX{%r¾8†r¿8jj½†rÀ8jÃXfilterrÁ8†rÂ8jj½†rÃ8jXupperrÄ8†rÅ8jj½†rÆ8jRX%}rÇ8†rÈ8hj!†rÉ8jRX{%rÊ8†rË8jj½†rÌ8jÃXifrÍ8†rÎ8jj½†rÏ8hxXitemsrÐ8†rÑ8jj½†rÒ8jRX%}rÓ8†rÔ8hj!†rÕ8jRX{{rÖ8†r×8jj½†rØ8hxXitemsrÙ8†rÚ8hjn†rÛ8jXjoinrÜ8†rÝ8hjr†rÞ8jŒX', 'rß8†rà8hjv†rá8jj½†râ8jRX}}rã8†rä8hj!†rå8jRX{%ræ8†rç8jj½†rè8jÃXendifré8†rê8jj½†rë8jRX%}rì8†rí8hX

rî8†rï8jRX{%rð8†rñ8jj½†rò8jÃXifró8†rô8jj½†rõ8hxXitemsrö8†r÷8jX.3rø8†rù8jj½†rú8jÃXisrû8†rü8jj½†rý8jXdefinedrþ8†rÿ8jj½†r9jRX%}r9†r9hX
FOO
r9†r9jRX{%r9†r9jj½†r9jÃXelser9†r	9jj½†r
9jRX%}r9†r9hj!†r
9jRX{{r9†r9jj½†r9hxXitemsr9†r9jX.1r9†r9jj½†r9jRX}}r9†r9hj!†r9jRX{%r9†r9jj½†r9jÃXendifr9†r9jj½†r9jRX%}r9†r 9hX

r!9†r"9jRX{%r#9†r$9jj½†r%9jÃXifr&9†r'9jj½†r(9hxXitemsr)9†r*9jX.3r+9†r,9jj½†r-9jÃXisr.9†r/9jj½†r09jXdefinedr19†r29jj½†r39jRX%}r49†r59hX
FOO
r69†r79jRX{%r89†r99jj½†r:9jÃXelseifr;9†r<9jj½†r=9hxXitemsr>9†r?9jX.1r@9†rA9jj½†rB9jRX%}rC9†rD9hj!†rE9jRX{{rF9†rG9jj½†rH9hxXitemsrI9†rJ9jX.0rK9†rL9jj½†rM9jRX}}rN9†rO9hj!†rP9jRX{%rQ9†rR9jj½†rS9jÃXendifrT9†rU9jj½†rV9jRX%}rW9†rX9hX

rY9†rZ9jRX{%r[9†r\9jj½†r]9jÃX	endfilterr^9†r_9jj½†r`9jRX%}ra9†rb9hX{
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
A, B

B

A
--TEST--
"for" tag takes a condition
--TEMPLATE--
rc9†rd9jRX{%re9†rf9jj½†rg9jÃXforrh9†ri9jj½†rj9hxj܆rk9jj½†rl9jÃXinrm9†rn9jj½†ro9jX1.rp9†rq9jX.5rr9†rs9jj½†rt9hxXifru9†rv9jj½†rw9hxj܆rx9jj½†ry9jÃXisrz9†r{9jj½†r|9jXoddr}9†r~9jj½†r9jjv†r€9jRX%}r9†r‚9hX
    rƒ9†r„9jRX{{r…9†r†9jj½†r‡9híXlooprˆ9†r‰9hxX.indexrŠ9†r‹9jj½†rŒ9jRX}}r9†rŽ9hX.r9†r9jRX{{r‘9†r’9jj½†r“9hxj܆r”9jj½†r•9jRX}}r–9†r—9jRX{{r˜9†r™9jj½†rš9hxXfoor›9†rœ9hxX.barr9†rž9jj½†rŸ9jRX}}r 9†r¡9hj!†r¢9jRX{%r£9†r¤9jj½†r¥9jÃXendforr¦9†r§9jj½†r¨9jRX%}r©9†rª9hX»
--DATA--
return array('foo' => array('bar' => 'X'))
--CONFIG--
return array('strict_variables' => false)
--EXPECT--
1.1X
2.3X
3.5X
--TEST--
"for" tag keeps the context safe
--TEMPLATE--
r«9†r¬9jRX{%r­9†r®9jj½†r¯9jÃXforr°9†r±9jj½†r²9hxXitemr³9†r´9jj½†rµ9jÃXinr¶9†r·9jj½†r¸9hxXitemsr¹9†rº9jj½†r»9jRX%}r¼9†r½9hX
  r¾9†r¿9jRX{%rÀ9†rÁ9jj½†rÂ9jÃXforrÃ9†rÄ9jj½†rÅ9hxXitemrÆ9†rÇ9jj½†rÈ9jÃXinrÉ9†rÊ9jj½†rË9hxXitemsrÌ9†rÍ9jj½†rÎ9jRX%}rÏ9†rÐ9hX
    * rÑ9†rÒ9jRX{{rÓ9†rÔ9jj½†rÕ9hxXitemrÖ9†r×9jj½†rØ9jRX}}rÙ9†rÚ9hX
  rÛ9†rÜ9jRX{%rÝ9†rÞ9jj½†rß9jÃXendforrà9†rá9jj½†râ9jRX%}rã9†rä9hX
  * rå9†ræ9jRX{{rç9†rè9jj½†ré9hxXitemrê9†rë9jj½†rì9jRX}}rí9†rî9hj!†rï9jRX{%rð9†rñ9jj½†rò9jÃXendforró9†rô9jj½†rõ9jRX%}rö9†r÷9hX¯
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
      * a
      * b
    * a
      * a
      * b
    * b
--TEST--
"for" tag can use an "else" clause
--TEMPLATE--
rø9†rù9jRX{%rú9†rû9jj½†rü9jÃXforrý9†rþ9jj½†rÿ9hxXitemr:†r:jj½†r:jÃXinr:†r:jj½†r:hxXitemsr:†r:jj½†r:jRX%}r	:†r
:hX
  * r:†r:jRX{{r
:†r:jj½†r:hxXitemr:†r:jj½†r:jRX}}r:†r:hj!†r:jRX{%r:†r:jj½†r:jÃXelser:†r:jj½†r:jRX%}r:†r:hX
  no item
r:†r:jRX{%r :†r!:jj½†r":jÃXendforr#:†r$:jj½†r%:jRX%}r&:†r':hX*
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
  * a
  * b
--DATA--
return array('items' => array())
--EXPECT--
  no item
--DATA--
return array()
--CONFIG--
return array('strict_variables' => false)
--EXPECT--
  no item
--TEST--
"for" tag does not reset inner variables
--TEMPLATE--
r(:†r):jRX{%r*:†r+:jj½†r,:jÃXforr-:†r.:jj½†r/:hxj܆r0:jj½†r1:jÃXinr2:†r3:jj½†r4:jX1.r5:†r6:jX.2r7:†r8:jj½†r9:jRX%}r::†r;:hX
  r<:†r=:jRX{%r>:†r?:jj½†r@:jÃXforrA:†rB:jj½†rC:hxXjrD:†rE:jj½†rF:jÃXinrG:†rH:jj½†rI:jX0.rJ:†rK:jX.2rL:†rM:jj½†rN:jRX%}rO:†rP:hX
    rQ:†rR:jRX{{rS:†rT:hxj¹'†rU:jRX}}rV:†rW:jRX{%rX:†rY:jj½†rZ:jÃXsetr[:†r\:jj½†r]:hxj¹'†r^:jj½†r_:hj2†r`:jj½†ra:hxj¹'†rb:hji†rc:jj†rd:jj½†re:jRX%}rf:†rg:hj½†rh:jRX{{ri:†rj:jj½†rk:híXlooprl:†rm:hxX.parentrn:†ro:hxX.looprp:†rq:hxX.indexrr:†rs:jj½†rt:jRX}}ru:†rv:hX
  rw:†rx:jRX{%ry:†rz:jj½†r{:jÃXendforr|:†r}:jj½†r~:jRX%}r:†r€:hj!†r:jRX{%r‚:†rƒ:jj½†r„:jÃXendforr…:†r†:jj½†r‡:jRX%}rˆ:†r‰:hX«
--DATA--
return array('k' => 0)
--EXPECT--
      0 1
      1 1
      2 1
        3 2
      4 2
      5 2
--TEST--
"for" tag can iterate over keys and values
--TEMPLATE--
rŠ:†r‹:jRX{%rŒ:†r:jj½†rŽ:jÃXforr:†r:jj½†r‘:hxXkeyr’:†r“:hjƒ†r”:jj½†r•:hxXitemr–:†r—:jj½†r˜:jÃXinr™:†rš:jj½†r›:hxXitemsrœ:†r:jj½†rž:jRX%}rŸ:†r :hX
  * r¡:†r¢:jRX{{r£:†r¤:jj½†r¥:hxXkeyr¦:†r§:jj½†r¨:jRX}}r©:†rª:hj†r«:jRX{{r¬:†r­:jj½†r®:hxXitemr¯:†r°:jj½†r±:jRX}}r²:†r³:hj!†r´:jRX{%rµ:†r¶:jj½†r·:jÃXendforr¸:†r¹:jj½†rº:jRX%}r»:†r¼:hX„
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
  * 0/a
  * 1/b
--TEST--
"for" tag can iterate over keys
--TEMPLATE--
r½:†r¾:jRX{%r¿:†rÀ:jj½†rÁ:jÃXforrÂ:†rÃ:jj½†rÄ:hxXkeyrÅ:†rÆ:jj½†rÇ:jÃXinrÈ:†rÉ:jj½†rÊ:hxXitemsrË:†rÌ:hjn†rÍ:jXkeysrÎ:†rÏ:jj½†rÐ:jRX%}rÑ:†rÒ:hX
  * rÓ:†rÔ:jRX{{rÕ:†rÖ:jj½†r×:hxXkeyrØ:†rÙ:jj½†rÚ:jRX}}rÛ:†rÜ:hj!†rÝ:jRX{%rÞ:†rß:jj½†rà:jÃXendforrá:†râ:jj½†rã:jRX%}rä:†rå:hX–
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
  * 0
  * 1
--TEST--
"for" tag adds a loop variable to the context locally
--TEMPLATE--
ræ:†rç:jRX{%rè:†ré:jj½†rê:jÃXforrë:†rì:jj½†rí:hxXitemrî:†rï:jj½†rð:jÃXinrñ:†rò:jj½†ró:hxXitemsrô:†rõ:jj½†rö:jRX%}r÷:†rø:hj!†rù:jRX{%rú:†rû:jj½†rü:jÃXendforrý:†rþ:jj½†rÿ:jRX%}r;†r;hj!†r;jRX{%r;†r;jj½†r;jÃXifr;†r;jj½†r;híXloopr	;†r
;jj½†r;jÃXisr;†r
;jj½†r;jÃXnotr;†r;jj½†r;jXdefinedr;†r;jj½†r;jRX%}r;†r;hXWORKSr;†r;jRX{%r;†r;jj½†r;jÃXendifr;†r;jj½†r;jRX%}r;†r ;hX€
--DATA--
return array('items' => array())
--EXPECT--
WORKS
--TEST--
"for" tag adds a loop variable to the context
--TEMPLATE--
r!;†r";jRX{%r#;†r$;jj½†r%;jÃXforr&;†r';jj½†r(;hxXitemr);†r*;jj½†r+;jÃXinr,;†r-;jj½†r.;hxXitemsr/;†r0;jj½†r1;jRX%}r2;†r3;hX
  * r4;†r5;jRX{{r6;†r7;jj½†r8;híXloopr9;†r:;hxX.indexr;;†r<;jj½†r=;jRX}}r>;†r?;hj†r@;jRX{{rA;†rB;jj½†rC;híXlooprD;†rE;hxX.index0rF;†rG;jj½†rH;jRX}}rI;†rJ;hX
  * rK;†rL;jRX{{rM;†rN;jj½†rO;híXlooprP;†rQ;hxX	.revindexrR;†rS;jj½†rT;jRX}}rU;†rV;hj†rW;jRX{{rX;†rY;jj½†rZ;híXloopr[;†r\;hxX
.revindex0r];†r^;jj½†r_;jRX}}r`;†ra;hX
  * rb;†rc;jRX{{rd;†re;jj½†rf;híXlooprg;†rh;hxX.firstri;†rj;jj½†rk;jRX}}rl;†rm;hj†rn;jRX{{ro;†rp;jj½†rq;híXlooprr;†rs;hxX.lastrt;†ru;jj½†rv;jRX}}rw;†rx;hj†ry;jRX{{rz;†r{;jj½†r|;híXloopr};†r~;hxX.lengthr;†r€;jj½†r;jRX}}r‚;†rƒ;hX

r„;†r…;jRX{%r†;†r‡;jj½†rˆ;jÃXendforr‰;†rŠ;jj½†r‹;jRX%}rŒ;†r;hX‘
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
  * 1/0
  * 2/1
  * 1//2

  * 2/1
  * 1/0
  * /1/2
--TEST--
"for" tag
--TEMPLATE--
rŽ;†r;jRX{%r;†r‘;jj½†r’;jÃXforr“;†r”;jj½†r•;hxj܆r–;hjƒ†r—;jj½†r˜;hxXitemr™;†rš;jj½†r›;jÃXinrœ;†r;jj½†rž;hxXitemsrŸ;†r ;jj½†r¡;hxXifr¢;†r£;jj½†r¤;híXloopr¥;†r¦;hxX.lastr§;†r¨;jj½†r©;hjÞ†rª;jj½†r«;jj¯†r¬;jj½†r­;jRX%}r®;†r¯;hj!†r°;jRX{%r±;†r²;jj½†r³;jÃXendforr´;†rµ;jj½†r¶;jRX%}r·;†r¸;hXÈ
--DATA--
return array('items' => array('a', 'b'))
--EXCEPTION--
Twig_Error_Syntax: The "loop" variable cannot be used in a looping condition in "index.twig" at line 2
--TEST--
"for" tag
--TEMPLATE--
r¹;†rº;jRX{%r»;†r¼;jj½†r½;jÃXforr¾;†r¿;jj½†rÀ;hxj܆rÁ;hjƒ†rÂ;jj½†rÃ;hxXitemrÄ;†rÅ;jj½†rÆ;jÃXinrÇ;†rÈ;jj½†rÉ;hxXitemsrÊ;†rË;jj½†rÌ;hxXifrÍ;†rÎ;jj½†rÏ;hxj܆rÐ;jj½†rÑ;hjÞ†rÒ;jj½†rÓ;jj¯†rÔ;jj½†rÕ;jRX%}rÖ;†r×;hX
    rØ;†rÙ;jRX{{rÚ;†rÛ;jj½†rÜ;híXlooprÝ;†rÞ;hxX.lastrß;†rà;jj½†rá;jRX}}râ;†rã;hj!†rä;jRX{%rå;†ræ;jj½†rç;jÃXendforrè;†ré;jj½†rê;jRX%}rë;†rì;hXí
--DATA--
return array('items' => array('a', 'b'))
--EXCEPTION--
Twig_Error_Syntax: The "loop.last" variable is not defined when looping with a condition in "index.twig" at line 3
--TEST--
"for" tag can use an "else" clause
--TEMPLATE--
rí;†rî;jRX{%rï;†rð;jj½†rñ;jÃXforrò;†ró;jj½†rô;hxXitemrõ;†rö;jj½†r÷;jÃXinrø;†rù;jj½†rú;hxXitemsrû;†rü;jj½†rý;jRX%}rþ;†rÿ;hX
  r<†r<jRX{%r<†r<jj½†r<jÃXforr<†r<jj½†r<hxXitemr<†r	<jj½†r
<jÃXinr<†r<jj½†r
<hxXitems1r<†r<jj½†r<jRX%}r<†r<hX
    * r<†r<jRX{{r<†r<jj½†r<hxXitemr<†r<jj½†r<jRX}}r<†r<hX
  r<†r<jRX{%r<†r <jj½†r!<jÃXelser"<†r#<jj½†r$<jRX%}r%<†r&<hX
    no r'<†r(<jRX{{r)<†r*<jj½†r+<hxXitemr,<†r-<jj½†r.<jRX}}r/<†r0<hX
  r1<†r2<jRX{%r3<†r4<jj½†r5<jÃXendforr6<†r7<jj½†r8<jRX%}r9<†r:<hj!†r;<jRX{%r<<†r=<jj½†r><jÃXelser?<†r@<jj½†rA<jRX%}rB<†rC<hX
  no item1
rD<†rE<jRX{%rF<†rG<jj½†rH<jÃXendforrI<†rJ<jj½†rK<jRX%}rL<†rM<hX²
--DATA--
return array('items' => array('a', 'b'), 'items1' => array())
--EXPECT--
no a
        no b
--TEST--
"for" tag iterates over iterable and countable objects
--TEMPLATE--
rN<†rO<jRX{%rP<†rQ<jj½†rR<jÃXforrS<†rT<jj½†rU<hxXitemrV<†rW<jj½†rX<jÃXinrY<†rZ<jj½†r[<hxXitemsr\<†r]<jj½†r^<jRX%}r_<†r`<hX
  * ra<†rb<jRX{{rc<†rd<jj½†re<hxXitemrf<†rg<jj½†rh<jRX}}ri<†rj<hX
  * rk<†rl<jRX{{rm<†rn<e(jj½†ro<híXlooprp<†rq<hxX.indexrr<†rs<jj½†rt<jRX}}ru<†rv<hj†rw<jRX{{rx<†ry<jj½†rz<híXloopr{<†r|<hxX.index0r}<†r~<jj½†r<jRX}}r€<†r<hX
  * r‚<†rƒ<jRX{{r„<†r…<jj½†r†<híXloopr‡<†rˆ<hxX	.revindexr‰<†rŠ<jj½†r‹<jRX}}rŒ<†r<hj†rŽ<jRX{{r<†r<jj½†r‘<híXloopr’<†r“<hxX
.revindex0r”<†r•<jj½†r–<jRX}}r—<†r˜<hX
  * r™<†rš<jRX{{r›<†rœ<jj½†r<híXlooprž<†rŸ<hxX.firstr <†r¡<jj½†r¢<jRX}}r£<†r¤<hj†r¥<jRX{{r¦<†r§<jj½†r¨<híXloopr©<†rª<hxX.lastr«<†r¬<jj½†r­<jRX}}r®<†r¯<hj†r°<jRX{{r±<†r²<jj½†r³<híXloopr´<†rµ<hxX.lengthr¶<†r·<jj½†r¸<jRX}}r¹<†rº<hX

r»<†r¼<jRX{%r½<†r¾<jj½†r¿<jÃXendforrÀ<†rÁ<jj½†rÂ<jRX%}rÃ<†rÄ<hX

rÅ<†rÆ<jRX{%rÇ<†rÈ<jj½†rÉ<jÃXforrÊ<†rË<jj½†rÌ<hxXkeyrÍ<†rÎ<hjƒ†rÏ<jj½†rÐ<hxXvaluerÑ<†rÒ<jj½†rÓ<jÃXinrÔ<†rÕ<jj½†rÖ<hxXitemsr×<†rØ<jj½†rÙ<jRX%}rÚ<†rÛ<hX
  * rÜ<†rÝ<jRX{{rÞ<†rß<jj½†rà<hxXkeyrá<†râ<jj½†rã<jRX}}rä<†rå<hj†ræ<jRX{{rç<†rè<jj½†ré<hxXvaluerê<†rë<jj½†rì<jRX}}rí<†rî<hj!†rï<jRX{%rð<†rñ<jj½†rò<jÃXendforró<†rô<jj½†rõ<jRX%}rö<†r÷<hX

rø<†rù<jRX{%rú<†rû<jj½†rü<jÃXforrý<†rþ<jj½†rÿ<hxXkeyr=†r=jj½†r=jÃXinr=†r=jj½†r=hxXitemsr=†r=hjn†r=jXkeysr	=†r
=jj½†r=jRX%}r=†r
=hX
  * r=†r=jRX{{r=†r=jj½†r=hxXkeyr=†r=jj½†r=jRX}}r=†r=hj!†r=jRX{%r=†r=jj½†r=jÃXendforr=†r=jj½†r=jRX%}r=†r =hXF
--DATA--
class ItemsIteratorCountable implements Iterator, Countable
r!=†r"=hj­†r#=hXZ
  protected $values = array('foo' => 'bar', 'bar' => 'foo');
  public function current() r$=†r%=hj­†r&=hX: return current($this->values); }
  public function key() r'=†r(=hj­†r)=hX7 return key($this->values); }
  public function next() r*=†r+=hj­†r,=hX: return next($this->values); }
  public function rewind() r-=†r.=hj­†r/=hX: return reset($this->values); }
  public function valid() r0=†r1=hj­†r2=hXF return false !== current($this->values); }
  public function count() r3=†r4=hj­†r5=hX return count($this->values); }
}
return array('items' => new ItemsIteratorCountable())
--EXPECT--
  * bar
  * 1/0
  * 2/1
  * 1//2

  * foo
  * 2/1
  * 1/0
  * /1/2


  * foo/bar
  * bar/foo

  * foo
  * bar
--TEST--
"for" tag iterates over iterable objects
--TEMPLATE--
r6=†r7=jRX{%r8=†r9=jj½†r:=jÃXforr;=†r<=jj½†r==hxXitemr>=†r?=jj½†r@=jÃXinrA=†rB=jj½†rC=hxXitemsrD=†rE=jj½†rF=jRX%}rG=†rH=hX
  * rI=†rJ=jRX{{rK=†rL=jj½†rM=hxXitemrN=†rO=jj½†rP=jRX}}rQ=†rR=hX
  * rS=†rT=jRX{{rU=†rV=jj½†rW=híXlooprX=†rY=hxX.indexrZ=†r[=jj½†r\=jRX}}r]=†r^=hj†r_=jRX{{r`=†ra=jj½†rb=híXlooprc=†rd=hxX.index0re=†rf=jj½†rg=jRX}}rh=†ri=hX
  * rj=†rk=jRX{{rl=†rm=jj½†rn=híXloopro=†rp=hxX.firstrq=†rr=jj½†rs=jRX}}rt=†ru=hX

rv=†rw=jRX{%rx=†ry=jj½†rz=jÃXendforr{=†r|=jj½†r}=jRX%}r~=†r=hX

r€=†r=jRX{%r‚=†rƒ=jj½†r„=jÃXforr…=†r†=jj½†r‡=hxXkeyrˆ=†r‰=hjƒ†rŠ=jj½†r‹=hxXvaluerŒ=†r=jj½†rŽ=jÃXinr=†r=jj½†r‘=hxXitemsr’=†r“=jj½†r”=jRX%}r•=†r–=hX
  * r—=†r˜=jRX{{r™=†rš=jj½†r›=hxXkeyrœ=†r=jj½†rž=jRX}}rŸ=†r =hj†r¡=jRX{{r¢=†r£=jj½†r¤=hxXvaluer¥=†r¦=jj½†r§=jRX}}r¨=†r©=hj!†rª=jRX{%r«=†r¬=jj½†r­=jÃXendforr®=†r¯=jj½†r°=jRX%}r±=†r²=hX

r³=†r´=jRX{%rµ=†r¶=jj½†r·=jÃXforr¸=†r¹=jj½†rº=hxXkeyr»=†r¼=jj½†r½=jÃXinr¾=†r¿=jj½†rÀ=hxXitemsrÁ=†rÂ=hjn†rÃ=jXkeysrÄ=†rÅ=jj½†rÆ=jRX%}rÇ=†rÈ=hX
  * rÉ=†rÊ=jRX{{rË=†rÌ=jj½†rÍ=hxXkeyrÎ=†rÏ=jj½†rÐ=jRX}}rÑ=†rÒ=hj!†rÓ=jRX{%rÔ=†rÕ=jj½†rÖ=jÃXendforr×=†rØ=jj½†rÙ=jRX%}rÚ=†rÛ=hX2
--DATA--
class ItemsIterator implements Iterator
rÜ=†rÝ=hj­†rÞ=hXZ
  protected $values = array('foo' => 'bar', 'bar' => 'foo');
  public function current() rß=†rà=hj­†rá=hX: return current($this->values); }
  public function key() râ=†rã=hj­†rä=hX7 return key($this->values); }
  public function next() rå=†ræ=hj­†rç=hX: return next($this->values); }
  public function rewind() rè=†ré=hj­†rê=hX: return reset($this->values); }
  public function valid() rë=†rì=hj­†rí=hXì return false !== current($this->values); }
}
return array('items' => new ItemsIterator())
--EXPECT--
  * bar
  * 1/0
  * 1

  * foo
  * 2/1
  * 


  * foo/bar
  * bar/foo

  * foo
  * bar
--TEST--
"for" tags can be nested
--TEMPLATE--
rî=†rï=jRX{%rð=†rñ=jj½†rò=jÃXforró=†rô=jj½†rõ=hxXkeyrö=†r÷=hjƒ†rø=jj½†rù=hxXitemrú=†rû=jj½†rü=jÃXinrý=†rþ=jj½†rÿ=hxXitemsr>†r>jj½†r>jRX%}r>†r>hX
* r>†r>jRX{{r>†r>jj½†r	>hxXkeyr
>†r>jj½†r>jRX}}r
>†r>hX (r>†r>jRX{{r>†r>jj½†r>híXloopr>†r>hxX.lengthr>†r>jj½†r>jRX}}r>†r>hX):
r>†r>jRX{%r>†r>jj½†r>jÃXforr >†r!>jj½†r">hxXvaluer#>†r$>jj½†r%>jÃXinr&>†r'>jj½†r(>hxXitemr)>†r*>jj½†r+>jRX%}r,>†r->hX
  * r.>†r/>jRX{{r0>†r1>jj½†r2>hxXvaluer3>†r4>jj½†r5>jRX}}r6>†r7>hX (r8>†r9>jRX{{r:>†r;>jj½†r<>híXloopr=>†r>>hxX.lengthr?>†r@>jj½†rA>jRX}}rB>†rC>hX)
rD>†rE>jRX{%rF>†rG>jj½†rH>jÃXendforrI>†rJ>jj½†rK>jRX%}rL>†rM>hj!†rN>jRX{%rO>†rP>jj½†rQ>jÃXendforrR>†rS>jj½†rT>jRX%}rU>†rV>hXà
--DATA--
return array('items' => array('a' => array('a1', 'a2', 'a3'), 'b' => array('b1')))
--EXPECT--
* a (2):
  * a1 (3)
  * a2 (3)
  * a3 (3)
* b (2):
  * b1 (1)
--TEST--
"for" tag iterates over item values
--TEMPLATE--
rW>†rX>jRX{%rY>†rZ>jj½†r[>jÃXforr\>†r]>jj½†r^>hxXitemr_>†r`>jj½†ra>jÃXinrb>†rc>jj½†rd>hxXitemsre>†rf>jj½†rg>jRX%}rh>†ri>hX
  * rj>†rk>jRX{{rl>†rm>jj½†rn>hxXitemro>†rp>jj½†rq>jRX}}rr>†rs>hj!†rt>jRX{%ru>†rv>jj½†rw>jÃXendforrx>†ry>jj½†rz>jRX%}r{>†r|>hXq
--DATA--
return array('items' => array('a', 'b'))
--EXPECT--
  * a
  * b
--TEST--
global variables
--TEMPLATE--
r}>†r~>jRX{%r>†r€>jj½†r>jÃXincluder‚>†rƒ>jj½†r„>jñX"included.twig"r…>†r†>jj½†r‡>jRX%}rˆ>†r‰>hj!†rŠ>jRX{%r‹>†rŒ>jj½†r>jÃXfromrŽ>†r>jj½†r>jñX"included.twig"r‘>†r’>jj½†r“>hxXimportr”>†r•>jj½†r–>hxXfoobarr—>†r˜>jj½†r™>jRX%}rš>†r›>hj!†rœ>jRX{{r>†rž>jj½†rŸ>hxXfoobarr >†r¡>hjr†r¢>hjv†r£>jj½†r¤>jRX}}r¥>†r¦>hX
--TEMPLATE(included.twig)--
r§>†r¨>jRX{%r©>†rª>jj½†r«>jÃXmacror¬>†r­>jj½†r®>hxXfoobarr¯>†r°>hjr†r±>hjv†r²>jj½†r³>jRX%}r´>†rµ>hX
called foobar
r¶>†r·>jRX{%r¸>†r¹>jj½†rº>jÃXendmacror»>†r¼>jj½†r½>jRX%}r¾>†r¿>hXb
--DATA--
return array();
--EXPECT--
called foobar
--TEST--
"if" creates a condition
--TEMPLATE--
rÀ>†rÁ>jRX{%rÂ>†rÃ>jj½†rÄ>jÃXifrÅ>†rÆ>jj½†rÇ>hxj/†rÈ>jj½†rÉ>jÃXisrÊ>†rË>jj½†rÌ>jXdefinedrÍ>†rÎ>jj½†rÏ>jRX%}rÐ>†rÑ>hX
  rÒ>†rÓ>jRX{{rÔ>†rÕ>jj½†rÖ>hxj/†r×>jj½†rØ>jRX}}rÙ>†rÚ>hj!†rÛ>jRX{%rÜ>†rÝ>jj½†rÞ>jÃXelseifrß>†rà>jj½†rá>hxjü†râ>jj½†rã>jÃXisrä>†rå>jj½†ræ>jXdefinedrç>†rè>jj½†ré>jRX%}rê>†rë>hX
  rì>†rí>jRX{{rî>†rï>jj½†rð>hxjü†rñ>jj½†rò>jRX}}ró>†rô>hj!†rõ>jRX{%rö>†r÷>jj½†rø>jÃXelserù>†rú>jj½†rû>jRX%}rü>†rý>hX
  NOTHING
rþ>†rÿ>jRX{%r?†r?jj½†r?jÃXendifr?†r?jj½†r?jRX%}r?†r?hXÉ
--DATA--
return array('a' => 'a')
--EXPECT--
  a
--DATA--
return array('b' => 'b')
--EXPECT--
  b
--DATA--
return array()
--EXPECT--
  NOTHING
--TEST--
"if" takes an expression as a test
--TEMPLATE--
r?†r	?jRX{%r
?†r?jj½†r?jÃXifr
?†r?jj½†r?hxj/†r?jj½†r?hj†r?jj½†r?jj††r?jj½†r?jRX%}r?†r?hX
  A1
r?†r?jRX{%r?†r?jj½†r?jÃXelseifr?†r?jj½†r?hxj/†r ?jj½†r!?hjÞ†r"?jj½†r#?jj†r$?jj¯†r%?jj½†r&?jRX%}r'?†r(?hX
  A2
r)?†r*?jRX{%r+?†r,?jj½†r-?jÃXelser.?†r/?jj½†r0?jRX%}r1?†r2?hX
  A3
r3?†r4?jRX{%r5?†r6?jj½†r7?jÃXendifr8?†r9?jj½†r:?jRX%}r;?†r<?hXº
--DATA--
return array('a' => 1)
--EXPECT--
  A1
--DATA--
return array('a' => 12)
--EXPECT--
  A2
--DATA--
return array('a' => 7)
--EXPECT--
  A3
--TEST--
"include" tag
--TEMPLATE--
FOO
r=?†r>?jRX{%r??†r@?jj½†rA?jÃXincluderB?†rC?jj½†rD?jñX
"foo.twig"rE?†rF?jj½†rG?jRX%}rH?†rI?hX®

BAR
--TEMPLATE(foo.twig)--
FOOBAR
--DATA--
return array()
--EXPECT--
FOO

FOOBAR
BAR
--TEST--
"include" tag allows expressions for the template to include
--TEMPLATE--
FOO
rJ?†rK?jRX{%rL?†rM?jj½†rN?jÃXincluderO?†rP?jj½†rQ?hxXfoorR?†rS?jj½†rT?jRX%}rU?†rV?hXŽ

BAR
--TEMPLATE(foo.twig)--
FOOBAR
--DATA--
return array('foo' => 'foo.twig')
--EXPECT--
FOO

FOOBAR
BAR
--TEST--
"include" tag
--TEMPLATE--
rW?†rX?jRX{%rY?†rZ?jj½†r[?jÃXincluder\?†r]?jj½†r^?hj=†r_?jñX
"foo.twig"r`?†ra?hjƒ†rb?jj½†rc?jñX
"bar.twig"rd?†re?hjA†rf?jj½†rg?hxXignorerh?†ri?jj½†rj?hxXmissingrk?†rl?jj½†rm?jRX%}rn?†ro?hj!†rp?jRX{%rq?†rr?jj½†rs?jÃXincludert?†ru?jj½†rv?jñX
"foo.twig"rw?†rx?jj½†ry?hxXignorerz?†r{?jj½†r|?hxXmissingr}?†r~?jj½†r?jRX%}r€?†r?hj!†r‚?jRX{%rƒ?†r„?jj½†r…?jÃXincluder†?†r‡?jj½†rˆ?jñX
"foo.twig"r‰?†rŠ?jj½†r‹?hxXignorerŒ?†r?jj½†rŽ?hxXmissingr?†r?jj½†r‘?hxXwithr’?†r“?jj½†r”?hj­†r•?hj½†r–?jj½†r—?jRX%}r˜?†r™?hj!†rš?jRX{%r›?†rœ?jj½†r?jÃXincluderž?†rŸ?jj½†r ?jñX
"foo.twig"r¡?†r¢?jj½†r£?hxXignorer¤?†r¥?jj½†r¦?hxXmissingr§?†r¨?jj½†r©?hxXwithrª?†r«?jj½†r¬?hj­†r­?hj½†r®?jj½†r¯?hxXonlyr°?†r±?jj½†r²?jRX%}r³?†r´?hXH
--DATA--
return array()
--EXPECT--
--TEST--
"include" tag
--TEMPLATE--
rµ?†r¶?jRX{%r·?†r¸?jj½†r¹?jÃXextendsrº?†r»?jj½†r¼?jñX"base.twig"r½?†r¾?jj½†r¿?jRX%}rÀ?†rÁ?hX

rÂ?†rÃ?jRX{%rÄ?†rÅ?jj½†rÆ?jÃXblockrÇ?†rÈ?jj½†rÉ?hxXcontentrÊ?†rË?jj½†rÌ?jRX%}rÍ?†rÎ?hX
    rÏ?†rÐ?jRX{{rÑ?†rÒ?jj½†rÓ?híXparentrÔ?†rÕ?hjr†rÖ?hjv†r×?jj½†rØ?jRX}}rÙ?†rÚ?hj!†rÛ?jRX{%rÜ?†rÝ?jj½†rÞ?jÃXendblockrß?†rà?jj½†rá?jRX%}râ?†rã?hX
--TEMPLATE(base.twig)--
rä?†rå?jRX{%ræ?†rç?jj½†rè?jÃXblockré?†rê?jj½†rë?hxXcontentrì?†rí?jj½†rî?jRX%}rï?†rð?hX
    rñ?†rò?jRX{%ró?†rô?jj½†rõ?jÃXincluderö?†r÷?jj½†rø?jñX
"foo.twig"rù?†rú?jj½†rû?jRX%}rü?†rý?hj!†rþ?jRX{%rÿ?†r@jj½†r@jÃXendblockr@†r@jj½†r@jRX%}r@†r@hXœ
--DATA--
return array();
--EXCEPTION--
Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3.
--TEST--
"include" tag
--TEMPLATE--
r@†r@jRX{%r	@†r
@jj½†r@jÃXincluder@†r
@jj½†r@jñX
"foo.twig"r@†r@jj½†r@jRX%}r@†r@hX·
--DATA--
return array();
--EXCEPTION--
Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2.
--TEST--
"include" tag accept variables and only
--TEMPLATE--
r@†r@jRX{%r@†r@jj½†r@jÃXincluder@†r@jj½†r@jñX
"foo.twig"r@†r@jj½†r@jRX%}r@†r @hj!†r!@jRX{%r"@†r#@jj½†r$@jÃXincluder%@†r&@jj½†r'@jñX
"foo.twig"r(@†r)@jj½†r*@hxXonlyr+@†r,@jj½†r-@jRX%}r.@†r/@hj!†r0@jRX{%r1@†r2@jj½†r3@jÃXincluder4@†r5@jj½†r6@jñX
"foo.twig"r7@†r8@jj½†r9@hxXwithr:@†r;@jj½†r<@hj­†r=@jŒX'foo1'r>@†r?@hj±†r@@jj½†rA@jŒX'bar'rB@†rC@hj½†rD@jj½†rE@jRX%}rF@†rG@hj!†rH@jRX{%rI@†rJ@jj½†rK@jÃXincluderL@†rM@jj½†rN@jñX
"foo.twig"rO@†rP@jj½†rQ@hxXwithrR@†rS@jj½†rT@hj­†rU@jŒX'foo1'rV@†rW@hj±†rX@jj½†rY@jŒX'bar'rZ@†r[@hj½†r\@jj½†r]@hxXonlyr^@†r_@jj½†r`@jRX%}ra@†rb@hX
--TEMPLATE(foo.twig)--
rc@†rd@jRX{%re@†rf@jj½†rg@jÃXforrh@†ri@jj½†rj@hxj¹'†rk@hjƒ†rl@jj½†rm@hxj½'†rn@jj½†ro@jÃXinrp@†rq@jj½†rr@hxX_contextrs@†rt@jj½†ru@jRX%}rv@†rw@jRX{{rx@†ry@jj½†rz@hxj¹'†r{@jj½†r|@jRX}}r}@†r~@hjƒ†r@jRX{%r€@†r@jj½†r‚@jÃXendforrƒ@†r„@jj½†r…@jRX%}r†@†r‡@hXÇ
--DATA--
return array('foo' => 'bar')
--EXPECT--
foo,global,_parent,
global,_parent,
foo,global,foo1,_parent,
foo1,global,_parent,
--TEST--
"include" tag accepts Twig_Template instance
--TEMPLATE--
rˆ@†r‰@jRX{%rŠ@†r‹@jj½†rŒ@jÃXincluder@†rŽ@jj½†r@hxXfoor@†r‘@jj½†r’@jRX%}r“@†r”@hX— FOO
--TEMPLATE(foo.twig)--
BAR
--DATA--
return array('foo' => $twig->loadTemplate('foo.twig'))
--EXPECT--
BAR FOO
--TEST--
"include" tag
--TEMPLATE--
r•@†r–@jRX{%r—@†r˜@jj½†r™@jÃXincluderš@†r›@jj½†rœ@hj=†r@jñX
"foo.twig"rž@†rŸ@hjƒ†r @jj½†r¡@jñX
"bar.twig"r¢@†r£@hjA†r¤@jj½†r¥@jRX%}r¦@†r§@hj!†r¨@jRX{%r©@†rª@jj½†r«@jÃXincluder¬@†r­@jj½†r®@hj=†r¯@jñX
"bar.twig"r°@†r±@hjƒ†r²@jj½†r³@jñX
"foo.twig"r´@†rµ@hjA†r¶@jj½†r·@jRX%}r¸@†r¹@hX|
--TEMPLATE(foo.twig)--
foo
--DATA--
return array()
--EXPECT--
foo
foo
--TEST--
"include" tag accept variables
--TEMPLATE--
rº@†r»@jRX{%r¼@†r½@jj½†r¾@jÃXincluder¿@†rÀ@jj½†rÁ@jñX
"foo.twig"rÂ@†rÃ@jj½†rÄ@hxXwithrÅ@†rÆ@jj½†rÇ@hj­†rÈ@jŒX'foo'rÉ@†rÊ@hj±†rË@jj½†rÌ@jŒX'bar'rÍ@†rÎ@hj½†rÏ@jj½†rÐ@jRX%}rÑ@†rÒ@hj!†rÓ@jRX{%rÔ@†rÕ@jj½†rÖ@jÃXincluder×@†rØ@jj½†rÙ@jñX
"foo.twig"rÚ@†rÛ@jj½†rÜ@hxXwithrÝ@†rÞ@jj½†rß@hxXvarsrà@†rá@jj½†râ@jRX%}rã@†rä@hX
--TEMPLATE(foo.twig)--
rå@†ræ@jRX{{rç@†rè@jj½†ré@hxXfoorê@†rë@jj½†rì@jRX}}rí@†rî@hXo
--DATA--
return array('vars' => array('foo' => 'bar'))
--EXPECT--
bar
bar
--TEST--
"extends" tag
--TEMPLATE--
rï@†rð@jRX{%rñ@†rò@jj½†ró@jÃXextendsrô@†rõ@jj½†rö@jñX
"foo.twig"r÷@†rø@jj½†rù@jRX%}rú@†rû@hX

rü@†rý@jRX{%rþ@†rÿ@jj½†rAjÃXblockrA†rAjj½†rAhxXcontentrA†rAjj½†rAjRX%}rA†rAhX
FOO
r	A†r
AjRX{%rA†rAjj½†r
AjÃXendblockrA†rAjj½†rAjRX%}rA†rAhX
--TEMPLATE(foo.twig)--
rA†rAjRX{%rA†rAjj½†rAjÃXblockrA†rAjj½†rAhxXcontentrA†rAjj½†rAjRX%}rA†rAjRX{%r A†r!Ajj½†r"AjÃXendblockr#A†r$Ajj½†r%AjRX%}r&A†r'AhXJ
--DATA--
return array()
--EXPECT--
FOO
--TEST--
block_expr2
--TEMPLATE--
r(A†r)AjRX{%r*A†r+Ajj½†r,AjÃXextendsr-A†r.Ajj½†r/AjñX"base2.twig"r0A†r1Ajj½†r2AjRX%}r3A†r4AhX

r5A†r6AjRX{%r7A†r8Ajj½†r9AjÃXblockr:A†r;Ajj½†r<AhxXelementr=A†r>Ajj½†r?Ajjv†r@AjRX%}rAA†rBAhX
    Element:
    rCA†rDAjRX{{rEA†rFAhjv†rGAjj½†rHAhíXparentrIA†rJAhjr†rKAhjv†rLAjj½†rMAjjv†rNAjRX}}rOA†rPAhj!†rQAjRX{%rRA†rSAjj½†rTAjÃXendblockrUA†rVAjj½†rWAjRX%}rXA†rYAhX
--TEMPLATE(base2.twig)--
rZA†r[AjRX{%r\A†r]Ajj½†r^AjÃXextendsr_A†r`Ajj½†raAjñX"base.twig"rbA†rcAjj½†rdAjRX%}reA†rfAhX
--TEMPLATE(base.twig)--
rgA†rhAjRX{%riA†rjAjj½†rkAjÃX	spacelessrlA†rmAjj½†rnAjRX%}roA†rpAhj!†rqAjRX{%rrA†rsAjj½†rtAjÃXblockruA†rvAjj½†rwAhxXelementrxA†ryAjj½†rzAjjv†r{AjRX%}r|A†r}AhX
    <div>
        r~A†rAjRX{%r€A†rAjX- r‚A†rƒAjÃXifr„A†r…Ajj½†r†AhxXitemr‡A†rˆAhxX	.childrenr‰A†rŠAjj½†r‹AjÃXisrŒA†rAjj½†rŽAjXdefinedrA†rAjj½†r‘AjRX%}r’A†r“AhX

            r”A†r•AjRX{%r–A†r—AjX- r˜A†r™AjÃXforršA†r›Ajj½†rœAhxXitemrA†ržAjj½†rŸAjÃXinr A†r¡Ajj½†r¢AhxXitemr£A†r¤AhxX	.childrenr¥A†r¦Ajj½†r§AjRX%}r¨A†r©AhX
                rªA†r«AjRX{{r¬A†r­Ahjv†r®Ajj½†r¯AhíXblockr°A†r±Ahjr†r²AjŒX	'element'r³A†r´Ahjv†rµAjj½†r¶Ajjv†r·AjRX}}r¸A†r¹AhX

            rºA†r»AjRX{%r¼A†r½Ajj½†r¾AjÃXendforr¿A†rÀAjj½†rÁAjRX%}rÂA†rÃAhX	
        rÄA†rÅAjRX{%rÆA†rÇAjX- rÈA†rÉAjÃXendifrÊA†rËAjj½†rÌAjjv†rÍAjRX%}rÎA†rÏAhX
    </div>
rÐA†rÑAjRX{%rÒA†rÓAjX- rÔA†rÕAjÃXendblockrÖA†r×Ajj½†rØAjRX%}rÙA†rÚAhj!†rÛAjRX{%rÜA†rÝAjj½†rÞAjÃXendspacelessrßA†ràAjj½†ráAjRX%}râA†rãAhXæ
--DATA--
return array(
    'item' => array(
        'children' => array(
            null,
            null,
        )
    )
)
--EXPECT--
Element:<div>Element:<div></div>Element:<div></div></div>
--TEST--
block_expr
--TEMPLATE--
räA†råAjRX{%ræA†rçAjj½†rèAjÃXextendsréA†rêAjj½†rëAjñX"base.twig"rìA†ríAjj½†rîAjRX%}rïA†rðAhX

rñA†ròAjRX{%róA†rôAjj½†rõAjÃXblockröA†r÷Ajj½†røAhxXelementrùA†rúAjj½†rûAjjv†rüAjRX%}rýA†rþAhX
    Element:
    rÿA†rBjRX{{rB†rBhjv†rBjj½†rBhíXparentrB†rBhjr†rBhjv†rBjj½†r	Bjjv†r
BjRX}}rB†rBhj!†r
BjRX{%rB†rBjj½†rBjÃXendblockrB†rBjj½†rBjRX%}rB†rBhX
--TEMPLATE(base.twig)--
rB†rBjRX{%rB†rBjj½†rBjÃX	spacelessrB†rBjj½†rBjRX%}rB†rBhj!†r BjRX{%r!B†r"Bjj½†r#BjÃXblockr$B†r%Bjj½†r&BhxXelementr'B†r(Bjj½†r)Bjjv†r*BjRX%}r+B†r,BhX
    <div>
        r-B†r.BjRX{%r/B†r0BjX- r1B†r2BjÃXifr3B†r4Bjj½†r5BhxXitemr6B†r7BhxX	.childrenr8B†r9Bjj½†r:BjÃXisr;B†r<Bjj½†r=BjXdefinedr>B†r?Bjj½†r@BjRX%}rAB†rBBhX

            rCB†rDBjRX{%rEB†rFBjX- rGB†rHBjÃXforrIB†rJBjj½†rKBhxXitemrLB†rMBjj½†rNBjÃXinrOB†rPBjj½†rQBhxXitemrRB†rSBhxX	.childrenrTB†rUBjj½†rVBjRX%}rWB†rXBhX
                rYB†rZBjRX{{r[B†r\Bhjv†r]Bjj½†r^BhíXblockr_B†r`Bhjr†raBjŒX	'element'rbB†rcBhjv†rdBjj½†reBjjv†rfBjRX}}rgB†rhBhX

            riB†rjBjRX{%rkB†rlBjj½†rmBjÃXendforrnB†roBjj½†rpBjRX%}rqB†rrBhX	
        rsB†rtBjRX{%ruB†rvBjX- rwB†rxBjÃXendifryB†rzBjj½†r{Bjjv†r|Be(jRX%}r}B†r~BhX
    </div>
rB†r€BjRX{%rB†r‚BjX- rƒB†r„BjÃXendblockr…B†r†Bjj½†r‡BjRX%}rˆB†r‰Bhj!†rŠBjRX{%r‹B†rŒBjj½†rBjÃXendspacelessrŽB†rBjj½†rBjRX%}r‘B†r’BhXé
--DATA--
return array(
    'item' => array(
        'children' => array(
            null,
            null,
        )
    )
)
--EXPECT--
Element:<div>Element:<div></div>Element:<div></div></div>
--TEST--
"extends" tag
--TEMPLATE--
r“B†r”BjRX{%r•B†r–Bjj½†r—BjÃXextendsr˜B†r™Bjj½†ršBhxX
standaloner›B†rœBjj½†rBhjʆržBjj½†rŸBhxXfoor B†r¡Bjj½†r¢Bhj±†r£Bjj½†r¤BjŒX
'bar.twig'r¥B†r¦Bjj½†r§BjRX%}r¨B†r©BhX

rªB†r«BjRX{%r¬B†r­Bjj½†r®BjÃXblockr¯B†r°Bjj½†r±BhxXcontentr²B†r³Bjj½†r´BjRX%}rµB†r¶BjRX{{r·B†r¸Bjj½†r¹BhíXparentrºB†r»Bhjr†r¼Bhjv†r½Bjj½†r¾BjRX}}r¿B†rÀBhXFOOrÁB†rÂBjRX{%rÃB†rÄBjj½†rÅBjÃXendblockrÆB†rÇBjj½†rÈBjRX%}rÉB†rÊBhX
--TEMPLATE(foo.twig)--
rËB†rÌBjRX{%rÍB†rÎBjj½†rÏBjÃXblockrÐB†rÑBjj½†rÒBhxXcontentrÓB†rÔBjj½†rÕBjRX%}rÖB†r×BhXFOOrØB†rÙBjRX{%rÚB†rÛBjj½†rÜBjÃXendblockrÝB†rÞBjj½†rßBjRX%}ràB†ráBhX
--TEMPLATE(bar.twig)--
râB†rãBjRX{%räB†råBjj½†ræBjÃXblockrçB†rèBjj½†réBhxXcontentrêB†rëBjj½†rìBjRX%}ríB†rîBhXBARrïB†rðBjRX{%rñB†ròBjj½†róBjÃXendblockrôB†rõBjj½†röBjRX%}r÷B†røBhXx
--DATA--
return array('foo' => 'foo.twig', 'standalone' => true)
--EXPECT--
FOOFOO
--TEST--
"extends" tag
--TEMPLATE--
rùB†rúBjRX{%rûB†rüBjj½†rýBjÃXextendsrþB†rÿBjj½†rChxXfoorC†rCjj½†rCjRX%}rC†rChX

rC†rCjRX{%rC†r	Cjj½†r
CjÃXblockrC†rCjj½†r
ChxXcontentrC†rCjj½†rCjRX%}rC†rChX
FOO
rC†rCjRX{%rC†rCjj½†rCjÃXendblockrC†rCjj½†rCjRX%}rC†rChX
--TEMPLATE(foo.twig)--
rC†rCjRX{%rC†r Cjj½†r!CjÃXblockr"C†r#Cjj½†r$ChxXcontentr%C†r&Cjj½†r'CjRX%}r(C†r)CjRX{%r*C†r+Cjj½†r,CjÃXendblockr-C†r.Cjj½†r/CjRX%}r0C†r1ChX_
--DATA--
return array('foo' => 'foo.twig')
--EXPECT--
FOO
--TEST--
"extends" tag
--TEMPLATE--
r2C†r3CjRX{%r4C†r5Cjj½†r6CjÃXextendsr7C†r8Cjj½†r9CjñX
"foo.twig"r:C†r;Cjj½†r<CjRX%}r=C†r>ChX
--TEMPLATE(foo.twig)--
r?C†r@CjRX{%rAC†rBCjj½†rCCjÃXblockrDC†rECjj½†rFChxXcontentrGC†rHCjj½†rICjRX%}rJC†rKChXFOOrLC†rMCjRX{%rNC†rOCjj½†rPCjÃXendblockrQC†rRCjj½†rSCjRX%}rTC†rUChXL
--DATA--
return array()
--EXPECT--
FOO
--TEST--
"extends" tag
--TEMPLATE--
rVC†rWCjRX{%rXC†rYCjj½†rZCjÃXextendsr[C†r\Cjj½†r]Chj=†r^CjñX
"foo.twig"r_C†r`Chjƒ†raCjj½†rbCjñX
"bar.twig"rcC†rdChjA†reCjj½†rfCjRX%}rgC†rhChX
--TEMPLATE(bar.twig)--
riC†rjCjRX{%rkC†rlCjj½†rmCjÃXblockrnC†roCjj½†rpChxXcontentrqC†rrCjj½†rsCjRX%}rtC†ruChX
foo
rvC†rwCjRX{%rxC†ryCjj½†rzCjÃXendblockr{C†r|Cjj½†r}CjRX%}r~C†rChXL
--DATA--
return array()
--EXPECT--
foo
--TEST--
"extends" tag
--TEMPLATE--
r€C†rCjRX{%r‚C†rƒCjj½†r„CjÃXextendsr…C†r†Cjj½†r‡CjñX
"layout.twig"rˆC†r‰Cjj½†rŠCjRX%}r‹C†rŒCjRX{%rC†rŽCjj½†rCjÃXblockrC†r‘Cjj½†r’ChxXcontentr“C†r”Cjj½†r•CjRX%}r–C†r—CjRX{{r˜C†r™Cjj½†ršChíXparentr›C†rœChjr†rChjv†ržCjj½†rŸCjRX}}r C†r¡ChXindex r¢C†r£CjRX{%r¤C†r¥Cjj½†r¦CjÃXendblockr§C†r¨Cjj½†r©CjRX%}rªC†r«ChX
--TEMPLATE(layout.twig)--
r¬C†r­CjRX{%r®C†r¯Cjj½†r°CjÃXextendsr±C†r²Cjj½†r³CjñX"base.twig"r´C†rµCjj½†r¶CjRX%}r·C†r¸CjRX{%r¹C†rºCjj½†r»CjÃXblockr¼C†r½Cjj½†r¾ChxXcontentr¿C†rÀCjj½†rÁCjRX%}rÂC†rÃCjRX{{rÄC†rÅCjj½†rÆChíXparentrÇC†rÈChjr†rÉChjv†rÊCjj½†rËCjRX}}rÌC†rÍChXlayout rÎC†rÏCjRX{%rÐC†rÑCjj½†rÒCjÃXendblockrÓC†rÔCjj½†rÕCjRX%}rÖC†r×ChX
--TEMPLATE(base.twig)--
rØC†rÙCjRX{%rÚC†rÛCjj½†rÜCjÃXblockrÝC†rÞCjj½†rßChxXcontentràC†ráCjj½†râCjRX%}rãC†räChXbase råC†ræCjRX{%rçC†rèCjj½†réCjÃXendblockrêC†rëCjj½†rìCjRX%}ríC†rîChXX
--DATA--
return array()
--EXPECT--
base layout index
--TEST--
"block" tag
--TEMPLATE--
rïC†rðCjRX{%rñC†ròCjj½†róCjÃXblockrôC†rõCjj½†röChxXcontentr÷C†røCjj½†rùCjRX%}rúC†rûChX
    CONTENT
    rüC†rýCjRX{%rþC†rÿCjX- rD†rDjÃXblockrD†rDjj½†rDhxX
subcontentrD†rDjj½†rDjjv†rDjRX%}r	D†r
DhX
        SUBCONTENT
    rD†rDjRX{%r
D†rDjX- rD†rDjÃXendblockrD†rDjj½†rDjjv†rDjRX%}rD†rDhX
    ENDCONTENT
rD†rDjRX{%rD†rDjj½†rDjÃXendblockrD†rDjj½†rDjRX%}rD†r DhXy
--TEMPLATE(foo.twig)--
--DATA--
return array()
--EXPECT--
CONTENTSUBCONTENTENDCONTENT
--TEST--
"block" tag
--TEMPLATE--
r!D†r"DjRX{%r#D†r$Djj½†r%DjÃXextendsr&D†r'Djj½†r(DjñX
"foo.twig"r)D†r*Djj½†r+DjRX%}r,D†r-DhX

r.D†r/DjRX{%r0D†r1Djj½†r2DjÃXblockr3D†r4Djj½†r5DhxXcontentr6D†r7Djj½†r8DjRX%}r9D†r:DhX
    r;D†r<DjRX{%r=D†r>Djj½†r?DjÃXblockr@D†rADjj½†rBDhxX
subcontentrCD†rDDjj½†rEDjRX%}rFD†rGDhX	
        rHD†rIDjRX{%rJD†rKDjj½†rLDjÃXblockrMD†rNDjj½†rODhxX
subsubcontentrPD†rQDjj½†rRDjRX%}rSD†rTDhX#
            SUBSUBCONTENT
        rUD†rVDjRX{%rWD†rXDjj½†rYDjÃXendblockrZD†r[Djj½†r\DjRX%}r]D†r^DhX
    r_D†r`DjRX{%raD†rbDjj½†rcDjÃXendblockrdD†reDjj½†rfDjRX%}rgD†rhDhj!†riDjRX{%rjD†rkDjj½†rlDjÃXendblockrmD†rnDjj½†roDjRX%}rpD†rqDhX
--TEMPLATE(foo.twig)--
rrD†rsDjRX{%rtD†ruDjj½†rvDjÃXblockrwD†rxDjj½†ryDhxXcontentrzD†r{Djj½†r|DjRX%}r}D†r~DhX
    rD†r€DjRX{%rD†r‚Djj½†rƒDjÃXblockr„D†r…Djj½†r†DhxX
subcontentr‡D†rˆDjj½†r‰DjRX%}rŠD†r‹DhX
        SUBCONTENT
    rŒD†rDjRX{%rŽD†rDjj½†rDjÃXendblockr‘D†r’Djj½†r“DjRX%}r”D†r•Dhj!†r–DjRX{%r—D†r˜Djj½†r™DjÃXendblockršD†r›Djj½†rœDjRX%}rD†ržDhXV
--DATA--
return array()
--EXPECT--
SUBSUBCONTENT
--TEST--
"extends" tag
--TEMPLATE--
rŸD†r DjRX{%r¡D†r¢Djj½†r£DjÃXextendsr¤D†r¥Djj½†r¦DjñX
"layout.twig"r§D†r¨Djj½†r©DjRX%}rªD†r«Dhj!†r¬DjRX{%r­D†r®Djj½†r¯DjÃXblockr°D†r±Djj½†r²DhxXinsider³D†r´Djj½†rµDjRX%}r¶D†r·DhXINSIDEr¸D†r¹DjRX{%rºD†r»Djj½†r¼DjÃXendblockr½D†r¾Djj½†r¿DhxXinsiderÀD†rÁDjj½†rÂDjRX%}rÃD†rÄDhX
--TEMPLATE(layout.twig)--
rÅD†rÆDjRX{%rÇD†rÈDjj½†rÉDjÃXextendsrÊD†rËDjj½†rÌDjñX"base.twig"rÍD†rÎDjj½†rÏDjRX%}rÐD†rÑDhj!†rÒDjRX{%rÓD†rÔDjj½†rÕDjÃXblockrÖD†r×Djj½†rØDhxXbodyrÙD†rÚDjj½†rÛDjRX%}rÜD†rÝDhX
    rÞD†rßDjRX{%ràD†ráDjj½†râDjÃXblockrãD†räDjj½†råDhxXinsideræD†rçDjj½†rèDjŒX''réD†rêDjj½†rëDjRX%}rìD†ríDhj!†rîDjRX{%rïD†rðDjj½†rñDjÃXendblockròD†róDjj½†rôDhxXbodyrõD†röDjj½†r÷DjRX%}røD†rùDhX
--TEMPLATE(base.twig)--
rúD†rûDjRX{%rüD†rýDjj½†rþDjÃXblockrÿD†rEjj½†rEhxXbodyrE†rEjj½†rEjŒX''rE†rEjj½†rEjRX%}rE†r	EhXO
--DATA--
return array()
--EXPECT--
INSIDE
--TEST--
"extends" tag
--TEMPLATE--
r
E†rEjRX{%rE†r
Ejj½†rEjÃXextendsrE†rEjj½†rEhxXfoorE†rEjj½†rEhjʆrEjj½†rEjŒX
'foo.twig'rE†rEjj½†rEhj±†rEjj½†rEjŒX
'bar.twig'rE†rEjj½†rEjRX%}rE†r EhXÄ
--TEMPLATE(foo.twig)--
FOO
--TEMPLATE(bar.twig)--
BAR
--DATA--
return array('foo' => true)
--EXPECT--
FOO
--DATA--
return array('foo' => false)
--EXPECT--
BAR
--TEST--
"extends" tag
--TEMPLATE--
r!E†r"EjRX{%r#E†r$Ejj½†r%EjÃXblockr&E†r'Ejj½†r(EhxXcontentr)E†r*Ejj½†r+EjRX%}r,E†r-EhX
    r.E†r/EjRX{%r0E†r1Ejj½†r2EjÃXextendsr3E†r4Ejj½†r5EjñX
"foo.twig"r6E†r7Ejj½†r8EjRX%}r9E†r:Ehj!†r;EjRX{%r<E†r=Ejj½†r>EjÃXendblockr?E†r@Ejj½†rAEjRX%}rBE†rCEhX{
--EXCEPTION--
Twig_Error_Syntax: Cannot extend from a block in "index.twig" at line 3
--TEST--
"extends" tag
--TEMPLATE--
rDE†rEEjRX{%rFE†rGEjj½†rHEjÃXextendsrIE†rJEjj½†rKEjñX"base.twig"rLE†rMEjj½†rNEjRX%}rOE†rPEhj!†rQEjRX{%rRE†rSEjj½†rTEjÃXblockrUE†rVEjj½†rWEhxXcontentrXE†rYEjj½†rZEjRX%}r[E†r\EjRX{%r]E†r^Ejj½†r_EjÃXincluder`E†raEjj½†rbEjñX"included.twig"rcE†rdEjj½†reEjRX%}rfE†rgEjRX{%rhE†riEjj½†rjEjÃXendblockrkE†rlEjj½†rmEjRX%}rnE†roEhX

rpE†rqEjRX{%rrE†rsEjj½†rtEjÃXblockruE†rvEjj½†rwEhxXfooterrxE†ryEjj½†rzEjRX%}r{E†r|EhXFooterr}E†r~EjRX{%rE†r€Ejj½†rEjÃXendblockr‚E†rƒEjj½†r„EjRX%}r…E†r†EhX
--TEMPLATE(included.twig)--
r‡E†rˆEjRX{%r‰E†rŠEjj½†r‹EjÃXextendsrŒE†rEjj½†rŽEjñX"base.twig"rE†rEjj½†r‘EjRX%}r’E†r“Ehj!†r”EjRX{%r•E†r–Ejj½†r—EjÃXblockr˜E†r™Ejj½†ršEhxXcontentr›E†rœEjj½†rEjRX%}ržE†rŸEhXIncluded Contentr E†r¡EjRX{%r¢E†r£Ejj½†r¤EjÃXendblockr¥E†r¦Ejj½†r§EjRX%}r¨E†r©EhX
--TEMPLATE(base.twig)--
rªE†r«EjRX{%r¬E†r­Ejj½†r®EjÃXblockr¯E†r°Ejj½†r±EhxXcontentr²E†r³Ejj½†r´EjRX%}rµE†r¶EhXDefault Contentr·E†r¸EjRX{%r¹E†rºEjj½†r»EjÃXendblockr¼E†r½Ejj½†r¾EjRX%}r¿E†rÀEhX

rÁE†rÂEjRX{%rÃE†rÄEjj½†rÅEjÃXblockrÆE†rÇEjj½†rÈEhxXfooterrÉE†rÊEjj½†rËEjRX%}rÌE†rÍEhXDefault FooterrÎE†rÏEjRX{%rÐE†rÑEjj½†rÒEjÃXendblockrÓE†rÔEjj½†rÕEjRX%}rÖE†r×EhXo
--DATA--
return array()
--EXPECT--
Included Content
Default Footer
Footer
--TEST--
"extends" tag
--TEMPLATE--
rØE†rÙEjRX{%rÚE†rÛEjj½†rÜEjÃXextendsrÝE†rÞEjj½†rßEjñX
"foo.twig"ràE†ráEjj½†râEjRX%}rãE†räEhX

råE†ræEjRX{%rçE†rèEjj½†réEjÃXblockrêE†rëEjj½†rìEhxXcontentríE†rîEjj½†rïEjRX%}rðE†rñEhX
  ròE†róEjRX{%rôE†rõEjj½†röEjÃXblockr÷E†røEjj½†rùEhxXinsiderúE†rûEjj½†rüEjRX%}rýE†rþEhX
    INSIDE OVERRIDDEN
  rÿE†rFjRX{%rF†rFjj½†rFjÃXendblockrF†rFjj½†rFjRX%}rF†rFhX


  BEFORE
  r	F†r
FjRX{{rF†rFjj½†r
FhíXparentrF†rFhjr†rFhjv†rFjj½†rFjRX}}rF†rFhX	
  AFTER
rF†rFjRX{%rF†rFjj½†rFjÃXendblockrF†rFjj½†rFjRX%}rF†rFhX
--TEMPLATE(foo.twig)--
rF†r FjRX{%r!F†r"Fjj½†r#FjÃXblockr$F†r%Fjj½†r&FhxXcontentr'F†r(Fjj½†r)FjRX%}r*F†r+FhX
  BAR
r,F†r-FjRX{%r.F†r/Fjj½†r0FjÃXendblockr1F†r2Fjj½†r3FjRX%}r4F†r5FhXx
--DATA--
return array()
--EXPECT--

INSIDE OVERRIDDEN
  
  BEFORE
    BAR

  AFTER
--TEST--
"extends" tag
--TEMPLATE--
r6F†r7FjRX{%r8F†r9Fjj½†r:FjÃXextendsr;F†r<Fjj½†r=FjñX
"foo.twig"r>F†r?Fjj½†r@FjRX%}rAF†rBFhX

rCF†rDFjRX{%rEF†rFFjj½†rGFjÃXblockrHF†rIFjj½†rJFhxXcontentrKF†rLFjj½†rMFjRX%}rNF†rOFjRX{{rPF†rQFjj½†rRFhíXparentrSF†rTFhjr†rUFhjv†rVFjj½†rWFjRX}}rXF†rYFhXFOOrZF†r[FjRX{{r\F†r]Fjj½†r^FhíXparentr_F†r`Fhjr†raFhjv†rbFjj½†rcFjRX}}rdF†reFjRX{%rfF†rgFjj½†rhFjÃXendblockriF†rjFjj½†rkFjRX%}rlF†rmFhX
--TEMPLATE(foo.twig)--
rnF†roFjRX{%rpF†rqFjj½†rrFjÃXblockrsF†rtFjj½†ruFhxXcontentrvF†rwFjj½†rxFjRX%}ryF†rzFhXBARr{F†r|FjRX{%r}F†r~Fjj½†rFjÃXendblockr€F†rFjj½†r‚FjRX%}rƒF†r„FhXQ
--DATA--
return array()
--EXPECT--
BARFOOBAR
--TEST--
"parent" tag
--TEMPLATE--
r…F†r†FjRX{%r‡F†rˆFjj½†r‰FjÃXuserŠF†r‹Fjj½†rŒFjŒX
'foo.twig'rF†rŽFjj½†rFjRX%}rF†r‘FhX

r’F†r“FjRX{%r”F†r•Fjj½†r–FjÃXblockr—F†r˜Fjj½†r™FhxXcontentršF†r›Fjj½†rœFjRX%}rF†ržFhX
    rŸF†r FjRX{{r¡F†r¢Fjj½†r£FhíXparentr¤F†r¥Fhjr†r¦Fhjv†r§Fjj½†r¨FjRX}}r©F†rªFhj!†r«FjRX{%r¬F†r­Fjj½†r®FjÃXendblockr¯F†r°Fjj½†r±FjRX%}r²F†r³FhX
--TEMPLATE(foo.twig)--
r´F†rµFjRX{%r¶F†r·Fjj½†r¸FjÃXblockr¹F†rºFjj½†r»FhxXcontentr¼F†r½Fjj½†r¾FjRX%}r¿F†rÀFhXBARrÁF†rÂFjRX{%rÃF†rÄFjj½†rÅFjÃXendblockrÆF†rÇFjj½†rÈFjRX%}rÉF†rÊFhXK
--DATA--
return array()
--EXPECT--
BAR
--TEST--
"parent" tag
--TEMPLATE--
rËF†rÌFjRX{%rÍF†rÎFjj½†rÏFjÃXblockrÐF†rÑFjj½†rÒFhxXcontentrÓF†rÔFjj½†rÕFjRX%}rÖF†r×FhX
    rØF†rÙFjRX{{rÚF†rÛFjj½†rÜFhíXparentrÝF†rÞFhjr†rßFhjv†ràFjj½†ráFjRX}}râF†rãFhj!†räFjRX{%råF†ræFjj½†rçFjÃXendblockrèF†réFjj½†rêFjRX%}rëF†rìFhXÛ
--EXCEPTION--
Twig_Error_Syntax: Calling "parent" on a template that does not extend nor "use" another template is forbidden in "index.twig" at line 3
--TEST--
"extends" tag accepts Twig_Template instance
--TEMPLATE--
ríF†rîFjRX{%rïF†rðFjj½†rñFjÃXextendsròF†róFjj½†rôFhxXfoorõF†röFjj½†r÷FjRX%}røF†rùFhX

rúF†rûFjRX{%rüF†rýFjj½†rþFjÃXblockrÿF†rGjj½†rGhxXcontentrG†rGjj½†rGjRX%}rG†rGhj!†rGjRX{{rG†r	Gjj½†r
GhíXparentrG†rGhjr†r
Ghjv†rGjj½†rGjRX}}rG†rGhXFOO
rG†rGjRX{%rG†rGjj½†rGjÃXendblockrG†rGjj½†rGjRX%}rG†rGhX
--TEMPLATE(foo.twig)--
rG†rGjRX{%rG†rGjj½†r GjÃXblockr!G†r"Gjj½†r#GhxXcontentr$G†r%Gjj½†r&GjRX%}r'G†r(GhXBARr)G†r*GjRX{%r+G†r,Gjj½†r-GjÃXendblockr.G†r/Gjj½†r0GjRX%}r1G†r2GhX{
--DATA--
return array('foo' => $twig->loadTemplate('foo.twig'))
--EXPECT--
BARFOO
--TEST--
"parent" function
--TEMPLATE--
r3G†r4GjRX{%r5G†r6Gjj½†r7GjÃXextendsr8G†r9Gjj½†r:GjñX
"parent.twig"r;G†r<Gjj½†r=GjRX%}r>G†r?GhX

r@G†rAGjRX{%rBG†rCGjj½†rDGjÃXuserEG†rFGjj½†rGGjñX"use1.twig"rHG†rIGjj½†rJGjRX%}rKG†rLGhj!†rMGjRX{%rNG†rOGjj½†rPGjÃXuserQG†rRGjj½†rSGjñX"use2.twig"rTG†rUGjj½†rVGjRX%}rWG†rXGhX

rYG†rZGjRX{%r[G†r\Gjj½†r]GjÃXblockr^G†r_Gjj½†r`GhxXcontent_parentraG†rbGjj½†rcGjRX%}rdG†reGhX
    rfG†rgGjRX{{rhG†riGjj½†rjGhíXparentrkG†rlGhjr†rmGhjv†rnGjj½†roGjRX}}rpG†rqGhj!†rrGjRX{%rsG†rtGjj½†ruGjÃXendblockrvG†rwGjj½†rxGjRX%}ryG†rzGhX

r{G†r|GjRX{%r}G†r~Gjj½†rGjÃXblockr€G†rGjj½†r‚GhxXcontent_use1rƒG†r„Gjj½†r…GjRX%}r†G†r‡GhX
    rˆG†r‰GjRX{{rŠG†r‹Gjj½†rŒGhíXparentrG†rŽGhjr†rGhjv†rGjj½†r‘GjRX}}r’G†r“Ghj!†r”GjRX{%r•G†r–Gjj½†r—GjÃXendblockr˜G†r™Gjj½†ršGjRX%}r›G†rœGhX

rG†ržGjRX{%rŸG†r Gjj½†r¡GjÃXblockr¢G†r£Gjj½†r¤GhxXcontent_use2r¥G†r¦Gjj½†r§GjRX%}r¨G†r©GhX
    rªG†r«GjRX{{r¬G†r­Gjj½†r®GhíXparentr¯G†r°Ghjr†r±Ghjv†r²Gjj½†r³GjRX}}r´G†rµGhj!†r¶GjRX{%r·G†r¸Gjj½†r¹GjÃXendblockrºG†r»Gjj½†r¼GjRX%}r½G†r¾GhX

r¿G†rÀGjRX{%rÁG†rÂGjj½†rÃGjÃXblockrÄG†rÅGjj½†rÆGhxXcontentrÇG†rÈGjj½†rÉGjRX%}rÊG†rËGhX
    rÌG†rÍGjRX{{rÎG†rÏGjj½†rÐGhíXblockrÑG†rÒGhjr†rÓGjŒX'content_use1_only'rÔG†rÕGhjv†rÖGjj½†r×GjRX}}rØG†rÙGhX
    rÚG†rÛGjRX{{rÜG†rÝGjj½†rÞGhíXblockrßG†ràGhjr†ráGjŒX'content_use2_only'râG†rãGhjv†räGjj½†råGjRX}}ræG†rçGhj!†rèGjRX{%réG†rêGjj½†rëGjÃXendblockrìG†ríGjj½†rîGjRX%}rïG†rðGhX
--TEMPLATE(parent.twig)--
rñG†ròGjRX{%róG†rôGjj½†rõGjÃXblockröG†r÷Gjj½†røGhxXcontent_parentrùG†rúGjj½†rûGjŒX'content_parent'rüG†rýGjj½†rþGjRX%}rÿG†rHhj!†rHjRX{%rH†rHjj½†rHjÃXblockrH†rHjj½†rHhxXcontent_use1rH†r	Hjj½†r
HjŒX'content_parent'rH†rHjj½†r
HjRX%}rH†rHhj!†rHjRX{%rH†rHjj½†rHjÃXblockrH†rHjj½†rHhxXcontent_use2rH†rHjj½†rHjŒX'content_parent'rH†rHjj½†rHjRX%}rH†rHhj!†rHjRX{%r H†r!Hjj½†r"HjÃXblockr#H†r$Hjj½†r%HhxXcontentr&H†r'Hjj½†r(HjŒX''r)H†r*Hjj½†r+HjRX%}r,H†r-HhX
--TEMPLATE(use1.twig)--
r.H†r/HjRX{%r0H†r1Hjj½†r2HjÃXblockr3H†r4Hjj½†r5HhxXcontent_use1r6H†r7Hjj½†r8HjŒX'content_use1'r9H†r:Hjj½†r;HjRX%}r<H†r=Hhj!†r>HjRX{%r?H†r@Hjj½†rAHjÃXblockrBH†rCHjj½†rDHhxXcontent_use2rEH†rFHjj½†rGHjŒX'content_use1'rHH†rIHjj½†rJHjRX%}rKH†rLHhj!†rMHjRX{%rNH†rOHjj½†rPHjÃXblockrQH†rRHjj½†rSHhxXcontent_use1_onlyrTH†rUHjj½†rVHjŒX'content_use1_only'rWH†rXHjj½†rYHjRX%}rZH†r[HhX
--TEMPLATE(use2.twig)--
r\H†r]HjRX{%r^H†r_Hjj½†r`HjÃXblockraH†rbHjj½†rcHhxXcontent_use2rdH†reHjj½†rfHjŒX'content_use2'rgH†rhHjj½†riHjRX%}rjH†rkHhj!†rlHjRX{%rmH†rnHjj½†roHjÃXblockrpH†rqHjj½†rrHhxXcontent_use2_onlyrsH†rtHjj½†ruHjŒX'content_use2_only'rvH†rwHjj½†rxHjRX%}ryH†rzHhX§
--DATA--
return array()
--EXPECT--
    content_parent
    content_use1
    content_use2
    content_use1_only
    content_use2_only
--TEST--
"macro" tag
--TEMPLATE--
r{H†r|HjRX{%r}H†r~Hjj½†rHjÃXimportr€H†rHjj½†r‚HhxX_selfrƒH†r„Hjj½†r…HhxXasr†H†r‡Hjj½†rˆHhxXmacrosr‰H†rŠHjj½†r‹HjRX%}rŒH†rHhX

rŽH†rHjRX{{rH†r‘Hjj½†r’HhxXmacrosr“H†r”HhxX.inputr•H†r–Hhjr†r—HjŒX
'username'r˜H†r™Hhjv†ršHjj½†r›HjRX}}rœH†rHhj!†ržHjRX{{rŸH†r Hjj½†r¡HhxXmacrosr¢H†r£HhxX.inputr¤H†r¥Hhjr†r¦HjŒX
'password'r§H†r¨Hhjƒ†r©Hjj½†rªHjûXnullr«H†r¬He(hjƒ†r­Hjj½†r®HjŒX
'password'r¯H†r°Hhjƒ†r±Hjj½†r²Hjj†r³Hhjv†r´Hjj½†rµHjRX}}r¶H†r·HhX

r¸H†r¹HjRX{%rºH†r»Hjj½†r¼HjÃXmacror½H†r¾Hjj½†r¿HhxXinputrÀH†rÁHhjr†rÂHhxXnamerÃH†rÄHhjƒ†rÅHjj½†rÆHhxXvaluerÇH†rÈHhjƒ†rÉHjj½†rÊHhxXtyperËH†rÌHhjƒ†rÍHjj½†rÎHhxXsizerÏH†rÐHhjv†rÑHjj½†rÒHjRX%}rÓH†rÔHhX
  <input type="rÕH†rÖHjRX{{r×H†rØHjj½†rÙHhxXtyperÚH†rÛHhjn†rÜHjXdefaultrÝH†rÞHhjr†rßHjñX"text"ràH†ráHhjv†râHjj½†rãHjRX}}räH†råHhX" name="ræH†rçHjRX{{rèH†réHjj½†rêHhxXnamerëH†rìHjj½†ríHjRX}}rîH†rïHhX	" value="rðH†rñHjRX{{ròH†róHjj½†rôHhxXvaluerõH†röHhjn†r÷Hjj˜†røHhjn†rùHjXdefaultrúH†rûHhjr†rüHjŒX''rýH†rþHhjv†rÿHjj½†rIjRX}}rI†rIhX" size="rI†rIjRX{{rI†rIjj½†rIhxXsizerI†r	Ihjn†r
IjXdefaultrI†rIhjr†r
Ijj††rIjj¯†rIhjv†rIjj½†rIjRX}}rI†rIhX">
rI†rIjRX{%rI†rIjj½†rIjÃXendmacrorI†rIjj½†rIjRX%}rI†rIhX×
--DATA--
return array()
--EXPECT--
  <input type="text" name="username" value="" size="20">

  <input type="password" name="password" value="" size="1">
--TEST--
"macro" tag supports name for endmacro
--TEMPLATE--
rI†rIjRX{%r I†r!Ijj½†r"IjÃXimportr#I†r$Ijj½†r%IhxX_selfr&I†r'Ijj½†r(IhxXasr)I†r*Ijj½†r+IhxXmacrosr,I†r-Ijj½†r.IjRX%}r/I†r0IhX

r1I†r2IjRX{{r3I†r4Ijj½†r5IhxXmacrosr6I†r7IhxX.foor8I†r9Ihjr†r:Ihjv†r;Ijj½†r<IjRX}}r=I†r>Ihj!†r?IjRX{{r@I†rAIjj½†rBIhxXmacrosrCI†rDIhxX.barrEI†rFIhjr†rGIhjv†rHIjj½†rIIjRX}}rJI†rKIhX

rLI†rMIjRX{%rNI†rOIjj½†rPIjÃXmacrorQI†rRIjj½†rSIhxXfoorTI†rUIhjr†rVIhjv†rWIjj½†rXIjRX%}rYI†rZIhXfoor[I†r\IjRX{%r]I†r^Ijj½†r_IjÃXendmacror`I†raIjj½†rbIjRX%}rcI†rdIhj!†reIjRX{%rfI†rgIjj½†rhIjÃXmacroriI†rjIjj½†rkIhxXbarrlI†rmIhjr†rnIhjv†roIjj½†rpIjRX%}rqI†rrIhXbarrsI†rtIjRX{%ruI†rvIjj½†rwIjÃXendmacrorxI†ryIjj½†rzIhxXbarr{I†r|Ijj½†r}IjRX%}r~I†rIhXO
--DATA--
return array()
--EXPECT--
foo
bar

--TEST--
"macro" tag
--TEMPLATE--
r€I†rIjRX{%r‚I†rƒIjj½†r„IjÃXimportr…I†r†Ijj½†r‡IjŒX'forms.twig'rˆI†r‰Ijj½†rŠIhxXasr‹I†rŒIjj½†rIhxXformsrŽI†rIjj½†rIjRX%}r‘I†r’IhX

r“I†r”IjRX{{r•I†r–Ijj½†r—IhxXformsr˜I†r™IhxX.inputršI†r›Ihjr†rœIjŒX
'username'rI†ržIhjv†rŸIjj½†r IjRX}}r¡I†r¢Ihj!†r£IjRX{{r¤I†r¥Ijj½†r¦IhxXformsr§I†r¨IhxX.inputr©I†rªIhjr†r«IjŒX
'password'r¬I†r­Ihjƒ†r®Ijj½†r¯IjûXnullr°I†r±Ihjƒ†r²Ijj½†r³IjŒX
'password'r´I†rµIhjƒ†r¶Ijj½†r·Ijj†r¸Ihjv†r¹Ijj½†rºIjRX}}r»I†r¼IhX
--TEMPLATE(forms.twig)--
r½I†r¾IjRX{%r¿I†rÀIjj½†rÁIjÃXmacrorÂI†rÃIjj½†rÄIhxXinputrÅI†rÆIhjr†rÇIhxXnamerÈI†rÉIhjƒ†rÊIjj½†rËIhxXvaluerÌI†rÍIhjƒ†rÎIjj½†rÏIhxXtyperÐI†rÑIhjƒ†rÒIjj½†rÓIhxXsizerÔI†rÕIhjv†rÖIjj½†r×IjRX%}rØI†rÙIhX
  <input type="rÚI†rÛIjRX{{rÜI†rÝIjj½†rÞIhxXtyperßI†ràIhjn†ráIjXdefaultrâI†rãIhjr†räIjñX"text"råI†ræIhjv†rçIjj½†rèIjRX}}réI†rêIhX" name="rëI†rìIjRX{{ríI†rîIjj½†rïIhxXnamerðI†rñIjj½†ròIjRX}}róI†rôIhX	" value="rõI†röIjRX{{r÷I†røIjj½†rùIhxXvaluerúI†rûIhjn†rüIjj˜†rýIhjn†rþIjXdefaultrÿI†rJhjr†rJjŒX''rJ†rJhjv†rJjj½†rJjRX}}rJ†rJhX" size="rJ†r	JjRX{{r
J†rJjj½†rJhxXsizer
J†rJhjn†rJjXdefaultrJ†rJhjr†rJjj††rJjj¯†rJhjv†rJjj½†rJjRX}}rJ†rJhX">
rJ†rJjRX{%rJ†rJjj½†rJjÃXendmacrorJ†rJjj½†r JjRX%}r!J†r"JhX¼
--DATA--
return array()
--EXPECT--
  <input type="text" name="username" value="" size="20">

  <input type="password" name="password" value="" size="1">
--TEST--
"macro" tag
--TEMPLATE--
r#J†r$JjRX{%r%J†r&Jjj½†r'JjÃXfromr(J†r)Jjj½†r*JjŒX'forms.twig'r+J†r,Jjj½†r-JhxXimportr.J†r/Jjj½†r0JhxXfoor1J†r2Jjj½†r3JjRX%}r4J†r5Jhj!†r6JjRX{%r7J†r8Jjj½†r9JjÃXfromr:J†r;Jjj½†r<JjŒX'forms.twig'r=J†r>Jjj½†r?JhxXimportr@J†rAJjj½†rBJhxXfoorCJ†rDJjj½†rEJhxXasrFJ†rGJjj½†rHJhxXfoobarrIJ†rJJhjƒ†rKJjj½†rLJhxXbarrMJ†rNJjj½†rOJjRX%}rPJ†rQJhX

rRJ†rSJjRX{{rTJ†rUJjj½†rVJhxXfoorWJ†rXJhjr†rYJjŒX'foo'rZJ†r[Jhjv†r\Jjj½†r]JjRX}}r^J†r_Jhj!†r`JjRX{{raJ†rbJjj½†rcJhxXfoobarrdJ†reJhjr†rfJjŒX'foo'rgJ†rhJhjv†riJjj½†rjJjRX}}rkJ†rlJhj!†rmJjRX{{rnJ†roJjj½†rpJhxXbarrqJ†rrJhjr†rsJjŒX'foo'rtJ†ruJhjv†rvJjj½†rwJjRX}}rxJ†ryJhX
--TEMPLATE(forms.twig)--
rzJ†r{JjRX{%r|J†r}Jjj½†r~JjÃXmacrorJ†r€Jjj½†rJhxXfoor‚J†rƒJhjr†r„JhxXnamer…J†r†Jhjv†r‡Jjj½†rˆJjRX%}r‰J†rŠJhXfoor‹J†rŒJjRX{{rJ†rŽJjj½†rJhxXnamerJ†r‘Jjj½†r’JjRX}}r“J†r”JjRX{%r•J†r–Jjj½†r—JjÃXendmacror˜J†r™Jjj½†ršJjRX%}r›J†rœJhj!†rJjRX{%ržJ†rŸJjj½†r JjÃXmacror¡J†r¢Jjj½†r£JhxXbarr¤J†r¥Jhjr†r¦JhxXnamer§J†r¨Jhjv†r©Jjj½†rªJjRX%}r«J†r¬JhXbarr­J†r®JjRX{{r¯J†r°Jjj½†r±JhxXnamer²J†r³Jjj½†r´JjRX}}rµJ†r¶JjRX{%r·J†r¸Jjj½†r¹JjÃXendmacrorºJ†r»Jjj½†r¼JjRX%}r½J†r¾JhX[
--DATA--
return array()
--EXPECT--
foofoo
foofoo
barfoo
--TEST--
"macro" tag
--TEMPLATE--
r¿J†rÀJjRX{%rÁJ†rÂJjj½†rÃJjÃXfromrÄJ†rÅJjj½†rÆJjŒX'forms.twig'rÇJ†rÈJjj½†rÉJhxXimportrÊJ†rËJjj½†rÌJhxXfoorÍJ†rÎJjj½†rÏJjRX%}rÐJ†rÑJhX

rÒJ†rÓJjRX{{rÔJ†rÕJjj½†rÖJhxXfoor×J†rØJhjr†rÙJjŒX'foo'rÚJ†rÛJhjv†rÜJjj½†rÝJjRX}}rÞJ†rßJhj!†ràJjRX{{ráJ†râJjj½†rãJhxXfooräJ†råJhjr†ræJhjv†rçJjj½†rèJjRX}}réJ†rêJhX
--TEMPLATE(forms.twig)--
rëJ†rìJjRX{%ríJ†rîJjj½†rïJjÃXmacrorðJ†rñJjj½†ròJhxXfooróJ†rôJhjr†rõJhxXnameröJ†r÷Jhjv†røJjj½†rùJjRX%}rúJ†rûJjRX{{rüJ†rýJjj½†rþJhxXnamerÿJ†rKhjn†rKjXdefaultrK†rKhjr†rKjŒX'foo'rK†rKhjv†rKjj½†rKjRX}}r	K†r
KjRX{{rK†rKjj½†r
KhxXglobalrK†rKjj½†rKjRX}}rK†rKjRX{%rK†rKjj½†rKjÃXendmacrorK†rKjj½†rKjRX%}rK†rKhXZ
--DATA--
return array()
--EXPECT--
fooglobal
fooglobal
--TEST--
"macro" tag
--TEMPLATE--
rK†rKjRX{%rK†rKjj½†rKjÃXimportr K†r!Kjj½†r"KhxX_selfr#K†r$Kjj½†r%KhxXasr&K†r'Kjj½†r(KhxXformsr)K†r*Kjj½†r+KjRX%}r,K†r-KhX

r.K†r/KjRX{{r0K†r1Kjj½†r2KhxXformsr3K†r4KhxX.inputr5K†r6Khjr†r7KjŒX
'username'r8K†r9Khjv†r:Kjj½†r;KjRX}}r<K†r=Khj!†r>KjRX{{r?K†r@Kjj½†rAKhxXformsrBK†rCKhxX.inputrDK†rEKhjr†rFKjŒX
'password'rGK†rHKhjƒ†rIKjj½†rJKjûXnullrKK†rLKhjƒ†rMKjj½†rNKjŒX
'password'rOK†rPKhjƒ†rQKjj½†rRKjj†rSKhjv†rTKjj½†rUKjRX}}rVK†rWKhX

rXK†rYKjRX{%rZK†r[Kjj½†r\KjÃXmacror]K†r^Kjj½†r_KhxXinputr`K†raKhjr†rbKhxXnamercK†rdKhjƒ†reKjj½†rfKhxXvaluergK†rhKhjƒ†riKjj½†rjKhxXtyperkK†rlKhjƒ†rmKjj½†rnKhxXsizeroK†rpKhjv†rqKjj½†rrKjRX%}rsK†rtKhX
  <input type="ruK†rvKjRX{{rwK†rxKjj½†ryKhxXtyperzK†r{Khjn†r|KjXdefaultr}K†r~Khjr†rKjñX"text"r€K†rKhjv†r‚Kjj½†rƒKjRX}}r„K†r…KhX" name="r†K†r‡KjRX{{rˆK†r‰Kjj½†rŠKhxXnamer‹K†rŒKjj½†rKjRX}}rŽK†rKhX	" value="rK†r‘KjRX{{r’K†r“Kjj½†r”KhxXvaluer•K†r–Khjn†r—Kjj˜†r˜Khjn†r™KjXdefaultršK†r›Khjr†rœKjŒX''rK†ržKhjv†rŸKjj½†r KjRX}}r¡K†r¢KhX" size="r£K†r¤KjRX{{r¥K†r¦Kjj½†r§KhxXsizer¨K†r©Khjn†rªKjXdefaultr«K†r¬Khjr†r­Kjj††r®Kjj¯†r¯Khjv†r°Kjj½†r±KjRX}}r²K†r³KhX">
r´K†rµKjRX{%r¶K†r·Kjj½†r¸KjÃXendmacror¹K†rºKjj½†r»KjRX%}r¼K†r½KhXº
--DATA--
return array()
--EXPECT--
  <input type="text" name="username" value="" size="20">

  <input type="password" name="password" value="" size="1">
--TEST--
"raw" tag
--TEMPLATE--
r¾K†r¿KjRX{%rÀK†rÁKjj½†rÂKjÃXrawrÃK†rÄKjj½†rÅKjRX%}rÆK†rÇKhX
{{ foo }}
rÈK†rÉKjRX{%rÊK†rËKjj½†rÌKjÃXendrawrÍK†rÎKjj½†rÏKjRX%}rÐK†rÑKhX$
--DATA--
return array()
--EXPECT--
rÒK†rÓKjRX{{rÔK†rÕKjj½†rÖKhxXfoor×K†rØKjj½†rÙKjRX}}rÚK†rÛKhX!
--TEST--
"raw" tag
--TEMPLATE--
rÜK†rÝKjRX{%rÞK†rßKjj½†ràKjÃXrawráK†râKjj½†rãKjRX%}räK†råKhXÞ
{{ foo }}
{% endverbatim %}
--DATA--
return array()
--EXCEPTION--
Twig_Error_Syntax: Unexpected end of file: Unclosed "raw" block in "index.twig" at line 2
--TEST--
"raw" tag
--TEMPLATE--
1***

{%- raw %}
    {{ 'bla' }}
ræK†rçKjRX{%rèK†réKjj½†rêKjÃXendrawrëK†rìKjj½†ríKjRX%}rîK†rïKhX


1***
2***

rðK†rñKjRX{%ròK†róKjX- rôK†rõKjÃXrawröK†r÷KjX -røK†rùKjRX%}rúK†rûKhX
    {{ 'bla' }}
rüK†rýKjRX{%rþK†rÿKjj½†rLjÃXendrawrL†rLjj½†rLjRX%}rL†rLhX


2***
3***

rL†rLjRX{%rL†r	LjX- r
L†rLjÃXrawrL†r
LjX -rL†rLjRX%}rL†rLhX
    {{ 'bla' }}
rL†rLjRX{%rL†rLjj½†rLjÃXendrawrL†rLjX -rL†rLjRX%}rL†rLhX


3***
4***

rL†rLjRX{%rL†r LjX- r!L†r"LjÃXrawr#L†r$LjX -r%L†r&LjRX%}r'L†r(LhX
    {{ 'bla' }}
r)L†r*LjRX{%r+L†r,LjX- r-L†r.LjÃXendrawr/L†r0Ljj½†r1LjRX%}r2L†r3LhX


4***
5***

r4L†r5LjRX{%r6L†r7LjX- r8L†r9LjÃXrawr:L†r;LjX -r<L†r=LjRX%}r>L†r?LhX
    {{ 'bla' }}
r@L†rALjRX{%rBL†rCLjX- rDL†rELjÃXendrawrFL†rGLjX -rHL†rILjRX%}rJL†rKLhX3

5***
--DATA--
return array()
--EXPECT--
1***
    rLL†rMLjRX{{rNL†rOLjj½†rPLjŒX'bla'rQL†rRLjj½†rSLjRX}}rTL†rULhX


1***
2***rVL†rWLjRX{{rXL†rYLjj½†rZLjŒX'bla'r[L†r\Ljj½†r]LjRX}}r^L†r_LhX


2***
3***r`L†raLjRX{{rbL†rcLjj½†rdLjŒX'bla'reL†rfLjj½†rgLjRX}}rhL†riLhX

3***
4***rjL†rkLjRX{{rlL†rmLjj½†rnLjŒX'bla'roL†rpLjj½†rqLjRX}}rrL†rsLhX

4***
5***rtL†ruLjRX{{rvL†rwLjj½†rxLjŒX'bla'ryL†rzLjj½†r{LjRX}}r|L†r}LhX'5***
--TEST--
sandbox tag
--TEMPLATE--
r~L†rLjRX{%r€L†rLjX- r‚L†rƒLjÃXsandboxr„L†r…Ljj½†r†LjRX%}r‡L†rˆLhX
    r‰L†rŠLjRX{%r‹L†rŒLjX- rL†rŽLjÃXincluderL†rLjj½†r‘LjñX
"foo.twig"r’L†r“Ljj½†r”LjRX%}r•L†r–LhX
    a
r—L†r˜LjRX{%r™L†ršLjX- r›L†rœLjÃX
endsandboxrL†ržLjj½†rŸLjRX%}r L†r¡LhX´
--TEMPLATE(foo.twig)--
foo
--EXCEPTION--
Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 4
--TEST--
sandbox tag
--TEMPLATE--
r¢L†r£LjRX{%r¤L†r¥LjX- r¦L†r§LjÃXsandboxr¨L†r©Ljj½†rªLjRX%}r«L†r¬LhX
    r­L†r®LjRX{%r¯L†r°LjX- r±L†r²LjÃXincluder³L†r´Ljj½†rµLjñX
"foo.twig"r¶L†r·Ljj½†r¸LjRX%}r¹L†rºLhX

    r»L†r¼LjRX{%r½L†r¾Ljj½†r¿LjÃXifrÀL†rÁLjj½†rÂLjj†rÃLjj½†rÄLjRX%}rÅL†rÆLhX	
        rÇL†rÈLjRX{%rÉL†rÊLjX- rËL†rÌLjÃXincluderÍL†rÎLjj½†rÏLjñX
"foo.twig"rÐL†rÑLjj½†rÒLjRX%}rÓL†rÔLhX
    rÕL†rÖLjRX{%r×L†rØLjj½†rÙLjÃXendifrÚL†rÛLjj½†rÜLjRX%}rÝL†rÞLhj!†rßLjRX{%ràL†ráLjX- râL†rãLjÃX
endsandboxräL†råLjj½†ræLjRX%}rçL†rèLhX´
--TEMPLATE(foo.twig)--
foo
--EXCEPTION--
Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 5
--TEST--
sandbox tag
--TEMPLATE--
réL†rêLjRX{%rëL†rìLjX- ríL†rîLjÃXsandboxrïL†rðLjj½†rñLjRX%}ròL†róLhX
    rôL†rõLjRX{%röL†r÷LjX- røL†rùLjÃXincluderúL†rûLjj½†rüLjñX
"foo.twig"rýL†rþLjj½†rÿLjRX%}rM†rMhj!†rMjRX{%rM†rMjX- rM†rMjÃX
endsandboxrM†rMjj½†r	MjRX%}r
M†rMhX

rM†r
MjRX{%rM†rMjX- rM†rMjÃXsandboxrM†rMjj½†rMjRX%}rM†rMhX
    rM†rMjRX{%rM†rMjX- rM†rMjÃXincluderM†rMjj½†rMjñX
"foo.twig"r M†r!Mjj½†r"MjRX%}r#M†r$MhX
    r%M†r&MjRX{%r'M†r(MjX- r)M†r*MjÃXincluder+M†r,Mjj½†r-MjñX
"foo.twig"r.M†r/Mjj½†r0MjRX%}r1M†r2Mhj!†r3MjRX{%r4M†r5MjX- r6M†r7MjÃX
endsandboxr8M†r9Mjj½†r:MjRX%}r;M†r<MhX

r=M†r>MjRX{%r?M†r@MjX- rAM†rBMjÃXsandboxrCM†rDMjj½†rEMjRX%}rFM†rGMjRX{%rHM†rIMjj½†rJMjÃXincluderKM†rLMjj½†rMMjñX
"foo.twig"rNM†rOMjj½†rPMjRX%}rQM†rRMjRX{%rSM†rTMjj½†rUMjÃX
endsandboxrVM†rWMjj½†rXMjRX%}rYM†rZMhXo
--TEMPLATE(foo.twig)--
foo
--DATA--
return array()
--EXPECT--
foo
foo
foo
foo
--TEST--
"set" tag
--TEMPLATE--
r[M†r\MjRX{%r]M†r^Mjj½†r_MjÃXsetr`M†raMjj½†rbMhxXfoorcM†rdMjj½†reMhj2†rfMjj½†rgMjŒX'foo'rhM†riMjj½†rjMjRX%}rkM†rlMhj!†rmMjRX{%rnM†roMjj½†rpMjÃXsetrqM†rrMjj½†rsMhxXbarrtM†ruMjj½†rvMhj2†rwMjj½†rxMjŒX'foo<br />'ryM†rzMjj½†r{MjRX%}r|M†r}MhX

r~M†rMjRX{{r€M†rMjj½†r‚MhxXfoorƒM†r„Mjj½†r…MjRX}}r†M†r‡Mhj!†rˆMjRX{{r‰M†rŠMjj½†r‹MhxXbarrŒM†rMjj½†rŽMjRX}}rM†rMhX

r‘M†r’MjRX{%r“M†r”Mjj½†r•MjÃXsetr–M†r—Mjj½†r˜MhxXfoor™M†ršMhjƒ†r›Mjj½†rœMhxXbarrM†ržMjj½†rŸMhj2†r Mjj½†r¡MjŒX'foo'r¢M†r£Mhjƒ†r¤Mjj½†r¥MjŒX'bar'r¦M†r§Mjj½†r¨MjRX%}r©M†rªMhX

r«M†r¬MjRX{{r­M†r®Mjj½†r¯MhxXfoor°M†r±Mjj½†r²MjRX}}r³M†r´MjRX{{rµM†r¶Mjj½†r·MhxXbarr¸M†r¹Mjj½†rºMjRX}}r»M†r¼MhXu
--DATA--
return array()
--EXPECT--
foo
foo&lt;br /&gt;


foobar
--TEST--
"set" tag block empty capture
--TEMPLATE--
r½M†r¾MjRX{%r¿M†rÀMjj½†rÁMjÃXsetrÂM†rÃMjj½†rÄMhxXfoorÅM†rÆMjj½†rÇMjRX%}rÈM†rÉMjRX{%rÊM†rËMjj½†rÌMjÃXendsetrÍM†rÎMjj½†rÏMjRX%}rÐM†rÑMhX

rÒM†rÓMjRX{%rÔM†rÕMjj½†rÖMjÃXifr×M†rØMjj½†rÙMhxXfoorÚM†rÛMjj½†rÜMjRX%}rÝM†rÞMhXFAILrßM†ràMjRX{%ráM†râMjj½†rãMjÃXendifräM†råMjj½†ræMjRX%}rçM†rèMhXR
--DATA--
return array()
--EXPECT--
--TEST--
"set" tag block capture
--TEMPLATE--
réM†rêMjRX{%rëM†rìMjj½†ríMjÃXsetrîM†rïMjj½†rðMhxXfoorñM†ròMjj½†róMjRX%}rôM†rõMhXf<br />o<br />oröM†r÷MjRX{%røM†rùMjj½†rúMjÃXendsetrûM†rüMjj½†rýMjRX%}rþM†rÿMhX

rN†rNjRX{{rN†rNjj½†rNhxXfoorN†rNjj½†rNjRX}}rN†r	NhXT
--DATA--
return array()
--EXPECT--
f<br />o<br />o
--TEST--
"set" tag
--TEMPLATE--
r
N†rNjRX{%rN†r
Njj½†rNjÃXsetrN†rNjj½†rNhxXfoorN†rNhjƒ†rNjj½†rNhxXbarrN†rNjj½†rNhj2†rNjj½†rNjŒX'foo'rN†rNjj½†rNhj1†rNjj½†rNjŒX'bar'r N†r!Nhjƒ†r"Njj½†r#NjŒX'bar'r$N†r%Njj½†r&Nhj1†r'Njj½†r(NjŒX'foo'r)N†r*Njj½†r+NjRX%}r,N†r-NhX

r.N†r/NjRX{{r0N†r1Njj½†r2NhxXfoor3N†r4Njj½†r5NjRX}}r6N†r7Nhj!†r8NjRX{{r9N†r:Njj½†r;NhxXbarr<N†r=Njj½†r>NjRX}}r?N†r@NhXy
--DATA--
return array()
--EXPECT--
foobar
barfoo
--TEST--
"spaceless" tag removes whites between HTML tags
--TEMPLATE--
rAN†rBNjRX{%rCN†rDNjj½†rENjÃX	spacelessrFN†rGNjj½†rHNjRX%}rIN†rJNhX-

    <div>   <div>   foo   </div>   </div>

rKN†rLNjRX{%rMN†rNNjj½†rONjÃXendspacelessrPN†rQNjj½†rRNjRX%}rSN†rTNhXj
--DATA--
return array()
--EXPECT--
<div><div>   foo   </div></div>
--TEST--
"§" custom tag
--TEMPLATE--
rUN†rVNhj­†rWNhXa% § %}
--DATA--
return array()
--EXPECT--
§
--TEST--
Whitespace trimming on tags.
--TEMPLATE--
rXN†rYNjRX{{rZN†r[Njj½†r\Njj†r]Njj½†r^Nhjƒ†r_Njj½†r`NjŒX'{#-'raN†rbNhjn†rcNjXlengthrdN†reNjj½†rfNjRX}}rgN†rhNhj!†riNjRX{{rjN†rkNjj½†rlNjŒX'{{-'rmN†rnNhjn†roNjXlengthrpN†rqNjj½†rrNhjƒ†rsNjj½†rtNjj†ruNjj½†rvNhji†rwNjj½†rxNjŒX'{%-'ryN†rzNhjn†r{NjXlengthr|N†r}Njj½†r~NjRX}}rN†r€NhX

Trim on control tag:
rN†r‚NjRX{%rƒN†r„Njj½†r…NjÃXforr†N†r‡Njj½†rˆNhxj܆r‰Njj½†rŠNjÃXinr‹N†rŒNjj½†rNhxXrangerŽN†rNhjr†rNjj†r‘Nhjƒ†r’Njj½†r“NjX9r”N†r•Nhjv†r–Njj½†r—Njjv†r˜NjRX%}r™N†ršNhX
	r›N†rœNjRX{{rN†ržNjj½†rŸNhxj܆r Njj½†r¡NjRX}}r¢N†r£Nhj!†r¤NjRX{%r¥N†r¦NjX- r§N†r¨NjÃXendforr©N†rªNjj½†r«NjRX%}r¬N†r­NhX


Trim on output tag:
r®N†r¯NjRX{%r°N†r±Njj½†r²NjÃXforr³N†r´Njj½†rµNhxj܆r¶Njj½†r·NjÃXinr¸N†r¹Njj½†rºNhxXranger»N†r¼Nhjr†r½Njj†r¾Nhjƒ†r¿Njj½†rÀNjj”N†rÁNhjv†rÂNjj½†rÃNjRX%}rÄN†rÅNe(hX
	rÆN†rÇNjRX{{rÈN†rÉNhjv†rÊNjj½†rËNhxj܆rÌNjj½†rÍNjjv†rÎNjRX}}rÏN†rÐNhj!†rÑNjRX{%rÒN†rÓNjj½†rÔNjÃXendforrÕN†rÖNjj½†r×NjRX%}rØN†rÙNhX


Trim comments:
      
rÚN†rÛNjLX{#- Invisible -#}rÜN†rÝNhX1
       
After the comment.

Trim leading space:
rÞN†rßNjRX{%ràN†ráNjj½†râNjÃXifrãN†räNjj½†råNhxXleadingræN†rçNjj½†rèNjRX%}réN†rêNhX

		rëN†rìNjRX{{ríN†rîNhjv†rïNjj½†rðNhxXleadingrñN†ròNjj½†róNjRX}}rôN†rõNhj!†röNjRX{%r÷N†røNjj½†rùNjÃXendifrúN†rûNjj½†rüNjRX%}rýN†rþNhX

rÿN†rOjRX{%rO†rOjX- rO†rOjÃXifrO†rOjj½†rOhxXleadingrO†r	Ojj½†r
OjRX%}rO†rOhX
	r
O†rOjRX{{rO†rOhjv†rOjj½†rOhxXleadingrO†rOjj½†rOjRX}}rO†rOhX

rO†rOjRX{%rO†rOjX- rO†rOjÃXendifrO†rOjj½†r OjRX%}r!O†r"OhX


Trim trailing space:
r#O†r$OjRX{%r%O†r&Ojj½†r'OjÃXifr(O†r)Ojj½†r*OhxXtrailingr+O†r,Ojj½†r-Ojjv†r.OjRX%}r/O†r0OhX          
	r1O†r2OjRX{{r3O†r4Ojj½†r5OhxXtrailingr6O†r7Ojj½†r8Ojjv†r9OjRX}}r:O†r;OhX

r<O†r=OjRX{%r>O†r?Ojj½†r@OjÃXendifrAO†rBOjj½†rCOjjv†rDOjRX%}rEO†rFOhX


Combined:

rGO†rHOjRX{%rIO†rJOjX- rKO†rLOjÃXifrMO†rNOjj½†rOOhxXbothrPO†rQOjj½†rROjjv†rSOjRX%}rTO†rUOhX
<ul>
	<li>    rVO†rWOjRX{{rXO†rYOhjv†rZOjj½†r[OhxXbothr\O†r]Ojj½†r^Ojjv†r_OjRX}}r`O†raOhX   </li>
</ul>

rbO†rcOjRX{%rdO†reOjX- rfO†rgOjÃXendifrhO†riOjj½†rjOjjv†rkOjRX%}rlO†rmOhXy

end
--DATA--
return array('leading' => 'leading space', 'trailing' => 'trailing space', 'both' => 'both')
--EXPECT--
15
18

Trim on control tag:
123456789

Trim on output tag:
123456789

Trim comments:After the comment.

Trim leading space:
leading space
leading space

Trim trailing space:
trailing spaceCombined:<ul>
	<li>both</li>
</ul>end
--TEST--
"use" tag
--TEMPLATE--
rnO†roOjRX{%rpO†rqOjj½†rrOjÃXusersO†rtOjj½†ruOjñX
"blocks.twig"rvO†rwOjj½†rxOhxXwithryO†rzOjj½†r{OhxXcontentr|O†r}Ojj½†r~OhxXasrO†r€Ojj½†rOhxXfoor‚O†rƒOjj½†r„OjRX%}r…O†r†OhX

r‡O†rˆOjRX{{r‰O†rŠOjj½†r‹OhíXblockrŒO†rOhjr†rŽOjŒX'foo'rO†rOhjv†r‘Ojj½†r’OjRX}}r“O†r”OhX
--TEMPLATE(blocks.twig)--
r•O†r–OjRX{%r—O†r˜Ojj½†r™OjÃXblockršO†r›Ojj½†rœOhxXcontentrO†ržOjj½†rŸOjŒX'foo'r O†r¡Ojj½†r¢OjRX%}r£O†r¤OhXH
--DATA--
return array()
--EXPECT--
foo
--TEST--
"use" tag
--TEMPLATE--
r¥O†r¦OjRX{%r§O†r¨Ojj½†r©OjÃXuserªO†r«Ojj½†r¬OjñX
"blocks.twig"r­O†r®Ojj½†r¯OjRX%}r°O†r±OhX

r²O†r³OjRX{{r´O†rµOjj½†r¶OhíXblockr·O†r¸Ohjr†r¹OjŒX	'content'rºO†r»Ohjv†r¼Ojj½†r½OjRX}}r¾O†r¿OhX
--TEMPLATE(blocks.twig)--
rÀO†rÁOjRX{%rÂO†rÃOjj½†rÄOjÃXblockrÅO†rÆOjj½†rÇOhxXcontentrÈO†rÉOjj½†rÊOjŒX'foo'rËO†rÌOjj½†rÍOjRX%}rÎO†rÏOhXH
--DATA--
return array()
--EXPECT--
foo
--TEST--
"use" tag
--TEMPLATE--
rÐO†rÑOjRX{%rÒO†rÓOjj½†rÔOjÃXuserÕO†rÖOjj½†r×OjñX
"foo.twig"rØO†rÙOjj½†rÚOjRX%}rÛO†rÜOhX
--TEMPLATE(foo.twig)--
rÝO†rÞOjRX{%rßO†ràOjj½†ráOjÃXuserâO†rãOjj½†räOjñX
"bar.twig"råO†ræOjj½†rçOjRX%}rèO†réOhX[
--TEMPLATE(bar.twig)--
--DATA--
return array()
--EXPECT--
--TEST--
"use" tag
--TEMPLATE--
rêO†rëOjRX{%rìO†ríOjj½†rîOjÃXuserïO†rðOjj½†rñOjñX
"foo.twig"ròO†róOjj½†rôOjRX%}rõO†röOhX

r÷O†røOjRX{{rùO†rúOjj½†rûOhíXblockrüO†rýOhjr†rþOjŒX	'content'rÿO†rPhjv†rPjj½†rPjRX}}rP†rPhj!†rPjRX{{rP†rPjj½†rPhíXblockr	P†r
Phjr†rPjŒX'foo'rP†r
Phjv†rPjj½†rPjRX}}rP†rPhj!†rPjRX{{rP†rPjj½†rPhíXblockrP†rPhjr†rPjŒX'bar'rP†rPhjv†rPjj½†rPjRX}}rP†rPhX
--TEMPLATE(foo.twig)--
rP†r PjRX{%r!P†r"Pjj½†r#PjÃXuser$P†r%Pjj½†r&PjñX
"bar.twig"r'P†r(Pjj½†r)PjRX%}r*P†r+PhX

r,P†r-PjRX{%r.P†r/Pjj½†r0PjÃXblockr1P†r2Pjj½†r3PhxXcontentr4P†r5Pjj½†r6PjŒX'foo'r7P†r8Pjj½†r9PjRX%}r:P†r;Phj!†r<PjRX{%r=P†r>Pjj½†r?PjÃXblockr@P†rAPjj½†rBPhxXfoorCP†rDPjj½†rEPjŒX'foo'rFP†rGPjj½†rHPjRX%}rIP†rJPhX
--TEMPLATE(bar.twig)--
rKP†rLPjRX{%rMP†rNPjj½†rOPjÃXblockrPP†rQPjj½†rRPhxXcontentrSP†rTPjj½†rUPjŒX'bar'rVP†rWPjj½†rXPjRX%}rYP†rZPhj!†r[PjRX{%r\P†r]Pjj½†r^PjÃXblockr_P†r`Pjj½†raPhxXbarrbP†rcPjj½†rdPjŒX'bar'reP†rfPjj½†rgPjRX%}rhP†riPhXP
--DATA--
return array()
--EXPECT--
foo
foo
bar
--TEST--
"use" tag
--TEMPLATE--
rjP†rkPjRX{%rlP†rmPjj½†rnPjÃXuseroP†rpPjj½†rqPjñX"ancestor.twig"rrP†rsPjj½†rtPjRX%}ruP†rvPhj!†rwPjRX{%rxP†ryPjj½†rzPjÃXuser{P†r|Pjj½†r}PjñX
"parent.twig"r~P†rPjj½†r€PjRX%}rP†r‚PhX

rƒP†r„PjRX{{r…P†r†Pjj½†r‡PhíXblockrˆP†r‰Phjr†rŠPjŒX'container'r‹P†rŒPhjv†rPjj½†rŽPjRX}}rP†rPhX
--TEMPLATE(parent.twig)--
r‘P†r’PjRX{%r“P†r”Pjj½†r•PjÃXblockr–P†r—Pjj½†r˜PhxX
sub_containerr™P†ršPjj½†r›PjRX%}rœP†rPhXH
    <div class="overriden_sub_container">overriden sub_container</div>
ržP†rŸPjRX{%r P†r¡Pjj½†r¢PjÃXendblockr£P†r¤Pjj½†r¥PjRX%}r¦P†r§PhX
--TEMPLATE(ancestor.twig)--
r¨P†r©PjRX{%rªP†r«Pjj½†r¬PjÃXblockr­P†r®Pjj½†r¯PhxX	containerr°P†r±Pjj½†r²PjRX%}r³P†r´PhX
    <div class="container">rµP†r¶PjRX{{r·P†r¸Pjj½†r¹PhíXblockrºP†r»Phjr†r¼PjŒX'sub_container'r½P†r¾Phjv†r¿Pjj½†rÀPjRX}}rÁP†rÂPhX</div>
rÃP†rÄPjRX{%rÅP†rÆPjj½†rÇPjÃXendblockrÈP†rÉPjj½†rÊPjRX%}rËP†rÌPhX

rÍP†rÎPjRX{%rÏP†rÐPjj½†rÑPjÃXblockrÒP†rÓPjj½†rÔPhxX
sub_containerrÕP†rÖPjj½†r×PjRX%}rØP†rÙPhX4
    <div class="sub_container">sub_container</div>
rÚP†rÛPjRX{%rÜP†rÝPjj½†rÞPjÃXendblockrßP†ràPjj½†ráPjRX%}râP†rãPhX©
--DATA--
return array()
--EXPECT--
<div class="container">    <div class="overriden_sub_container">overriden sub_container</div>
</div>
--TEST--
"use" tag
--TEMPLATE--
räP†råPjRX{%ræP†rçPjj½†rèPjÃXuseréP†rêPjj½†rëPjñX
"parent.twig"rìP†ríPjj½†rîPjRX%}rïP†rðPhX

rñP†ròPjRX{{róP†rôPjj½†rõPhíXblockröP†r÷Phjr†røPjŒX'container'rùP†rúPhjv†rûPjj½†rüPjRX}}rýP†rþPhX
--TEMPLATE(parent.twig)--
rÿP†rQjRX{%rQ†rQjj½†rQjÃXuserQ†rQjj½†rQjñX"ancestor.twig"rQ†rQjj½†r	QjRX%}r
Q†rQhX

rQ†r
QjRX{%rQ†rQjj½†rQjÃXblockrQ†rQjj½†rQhxX
sub_containerrQ†rQjj½†rQjRX%}rQ†rQhXH
    <div class="overriden_sub_container">overriden sub_container</div>
rQ†rQjRX{%rQ†rQjj½†rQjÃXendblockrQ†rQjj½†r QjRX%}r!Q†r"QhX
--TEMPLATE(ancestor.twig)--
r#Q†r$QjRX{%r%Q†r&Qjj½†r'QjÃXblockr(Q†r)Qjj½†r*QhxX	containerr+Q†r,Qjj½†r-QjRX%}r.Q†r/QhX
    <div class="container">r0Q†r1QjRX{{r2Q†r3Qjj½†r4QhíXblockr5Q†r6Qhjr†r7QjŒX'sub_container'r8Q†r9Qhjv†r:Qjj½†r;QjRX}}r<Q†r=QhX</div>
r>Q†r?QjRX{%r@Q†rAQjj½†rBQjÃXendblockrCQ†rDQjj½†rEQjRX%}rFQ†rGQhX

rHQ†rIQjRX{%rJQ†rKQjj½†rLQjÃXblockrMQ†rNQjj½†rOQhxX
sub_containerrPQ†rQQjj½†rRQjRX%}rSQ†rTQhX4
    <div class="sub_container">sub_container</div>
rUQ†rVQjRX{%rWQ†rXQjj½†rYQjÃXendblockrZQ†r[Qjj½†r\QjRX%}r]Q†r^QhX©
--DATA--
return array()
--EXPECT--
<div class="container">    <div class="overriden_sub_container">overriden sub_container</div>
</div>
--TEST--
"use" tag
--TEMPLATE--
r_Q†r`QjRX{%raQ†rbQjj½†rcQjÃXuserdQ†reQjj½†rfQjñX
"foo.twig"rgQ†rhQjj½†riQhxXwithrjQ†rkQjj½†rlQhxXcontentrmQ†rnQjj½†roQhxXasrpQ†rqQjj½†rrQhxXfoo_contentrsQ†rtQjj½†ruQjRX%}rvQ†rwQhj!†rxQjRX{%ryQ†rzQjj½†r{QjÃXuser|Q†r}Qjj½†r~QjñX
"bar.twig"rQ†r€Qjj½†rQjRX%}r‚Q†rƒQhX

r„Q†r…QjRX{{r†Q†r‡Qjj½†rˆQhíXblockr‰Q†rŠQhjr†r‹QjŒX	'content'rŒQ†rQhjv†rŽQjj½†rQjRX}}rQ†r‘Qhj!†r’QjRX{{r“Q†r”Qjj½†r•QhíXblockr–Q†r—Qhjr†r˜QjŒX'foo'r™Q†ršQhjv†r›Qjj½†rœQjRX}}rQ†ržQhj!†rŸQjRX{{r Q†r¡Qjj½†r¢QhíXblockr£Q†r¤Qhjr†r¥QjŒX'bar'r¦Q†r§Qhjv†r¨Qjj½†r©QjRX}}rªQ†r«Qhj!†r¬QjRX{{r­Q†r®Qjj½†r¯QhíXblockr°Q†r±Qhjr†r²QjŒX
'foo_content'r³Q†r´Qhjv†rµQjj½†r¶QjRX}}r·Q†r¸QhX
--TEMPLATE(foo.twig)--
r¹Q†rºQjRX{%r»Q†r¼Qjj½†r½QjÃXblockr¾Q†r¿Qjj½†rÀQhxXcontentrÁQ†rÂQjj½†rÃQjŒX'foo'rÄQ†rÅQjj½†rÆQjRX%}rÇQ†rÈQhj!†rÉQjRX{%rÊQ†rËQjj½†rÌQjÃXblockrÍQ†rÎQjj½†rÏQhxXfoorÐQ†rÑQjj½†rÒQjŒX'foo'rÓQ†rÔQjj½†rÕQjRX%}rÖQ†r×QhX
--TEMPLATE(bar.twig)--
rØQ†rÙQjRX{%rÚQ†rÛQjj½†rÜQjÃXblockrÝQ†rÞQjj½†rßQhxXcontentràQ†ráQjj½†râQjŒX'bar'rãQ†räQjj½†råQjRX%}ræQ†rçQhj!†rèQjRX{%réQ†rêQjj½†rëQjÃXblockrìQ†ríQjj½†rîQhxXbarrïQ†rðQjj½†rñQjŒX'bar'ròQ†róQjj½†rôQjRX%}rõQ†röQhXT
--DATA--
return array()
--EXPECT--
bar
foo
bar
foo
--TEST--
"use" tag
--TEMPLATE--
r÷Q†røQjRX{%rùQ†rúQjj½†rûQjÃXuserüQ†rýQjj½†rþQjñX
"foo.twig"rÿQ†rRjj½†rRjRX%}rR†rRhj!†rRjRX{%rR†rRjj½†rRjÃXuserR†r	Rjj½†r
RjñX
"bar.twig"rR†rRjj½†r
RjRX%}rR†rRhX

rR†rRjRX{{rR†rRjj½†rRhíXblockrR†rRhjr†rRjŒX	'content'rR†rRhjv†rRjj½†rRjRX}}rR†rRhj!†rRjRX{{rR†r Rjj½†r!RhíXblockr"R†r#Rhjr†r$RjŒX'foo'r%R†r&Rhjv†r'Rjj½†r(RjRX}}r)R†r*Rhj!†r+RjRX{{r,R†r-Rjj½†r.RhíXblockr/R†r0Rhjr†r1RjŒX'bar'r2R†r3Rhjv†r4Rjj½†r5RjRX}}r6R†r7RhX
--TEMPLATE(foo.twig)--
r8R†r9RjRX{%r:R†r;Rjj½†r<RjÃXblockr=R†r>Rjj½†r?RhxXcontentr@R†rARjj½†rBRjŒX'foo'rCR†rDRjj½†rERjRX%}rFR†rGRhj!†rHRjRX{%rIR†rJRjj½†rKRjÃXblockrLR†rMRjj½†rNRhxXfoorOR†rPRjj½†rQRjŒX'foo'rRR†rSRjj½†rTRjRX%}rUR†rVRhX
--TEMPLATE(bar.twig)--
rWR†rXRjRX{%rYR†rZRjj½†r[RjÃXblockr\R†r]Rjj½†r^RhxXcontentr_R†r`Rjj½†raRjŒX'bar'rbR†rcRjj½†rdRjRX%}reR†rfRhj!†rgRjRX{%rhR†riRjj½†rjRjÃXblockrkR†rlRjj½†rmRhxXbarrnR†roRjj½†rpRjŒX'bar'rqR†rrRjj½†rsRjRX%}rtR†ruRhXP
--DATA--
return array()
--EXPECT--
bar
foo
bar
--TEST--
"use" tag
--TEMPLATE--
rvR†rwRjRX{%rxR†ryRjj½†rzRjÃXuser{R†r|Rjj½†r}RjŒX'file2.html.twig'r~R†rRjRX%}r€R†rRhj!†r‚RjRX{%rƒR†r„Rjj½†r…RjÃXblockr†R†r‡Rjj½†rˆRhxXfoobarr‰R†rŠRjj½†r‹RjRX%}rŒR†rRhX
    rŽR†rRjRX{{rR†r‘Rhjv†r’Rjj½†r“RhíXparentr”R†r•Rhjr†r–Rhjv†r—Rjj½†r˜Rjjv†r™RjRX}}ršR†r›RhX(
    Content of block (second override)
rœR†rRjRX{%ržR†rŸRjj½†r RjÃXendblockr¡R†r¢Rjj½†r£RhxXfoobarr¤R†r¥Rjj½†r¦RjRX%}r§R†r¨RhX
--TEMPLATE(file2.html.twig)--
r©R†rªRjRX{%r«R†r¬Rjj½†r­RjÃXuser®R†r¯Rjj½†r°RjŒX'file1.html.twig'r±R†r²Rjj½†r³RjRX%}r´R†rµRhj!†r¶RjRX{%r·R†r¸Rjj½†r¹RjÃXblockrºR†r»Rjj½†r¼RhxXfoobarr½R†r¾Rjj½†r¿RjRX%}rÀR†rÁRhX
    rÂR†rÃRjRX{{rÄR†rÅRhjv†rÆRjj½†rÇRhíXparentrÈR†rÉRhjr†rÊRhjv†rËRjj½†rÌRjjv†rÍRjRX}}rÎR†rÏRhX'
    Content of block (first override)
rÐR†rÑRjRX{%rÒR†rÓRjj½†rÔRjÃXendblockrÕR†rÖRjj½†r×RhxXfoobarrØR†rÙRjj½†rÚRjRX%}rÛR†rÜRhX
--TEMPLATE(file1.html.twig)--
rÝR†rÞRjRX{%rßR†ràRjj½†ráRjÃXblockrâR†rãRjj½†räRhxXfoobarråR†ræRjj½†rçRjjv†rèRjRX%}réR†rêRhX
    Content of block
rëR†rìRjRX{%ríR†rîRjj½†rïRjÃXendblockrðR†rñRjj½†ròRhxXfoobarróR†rôRjj½†rõRjRX%}röR†r÷RhXš
--DATA--
return array()
--EXPECT--
Content of block
Content of block (first override)
Content of block (second override)
--TEST--
"use" tag
--TEMPLATE--
røR†rùRjRX{%rúR†rûRjj½†rüRjÃXuserýR†rþRjj½†rÿRjŒX'file2.html.twig'rS†rSjj½†rSjRX%}rS†rShj!†rSjRX{%rS†rSjj½†rSjÃXuser	S†r
Sjj½†rSjŒX'file1.html.twig'rS†r
Sjj½†rShxXwithrS†rSjj½†rShxXfoorS†rSjj½†rSjRX%}rS†rShj!†rSjRX{%rS†rSjj½†rSjÃXblockrS†rSjj½†rShxXfoorS†rSjj½†r SjRX%}r!S†r"ShX
    r#S†r$SjRX{{r%S†r&Shjv†r'Sjj½†r(ShíXparentr)S†r*Shjr†r+Shjv†r,Sjj½†r-Sjjv†r.SjRX}}r/S†r0ShX&
    Content of foo (second override)
r1S†r2SjRX{%r3S†r4Sjj½†r5SjÃXendblockr6S†r7Sjj½†r8ShxXfoor9S†r:Sjj½†r;SjRX%}r<S†r=Shj!†r>SjRX{%r?S†r@Sjj½†rASjÃXblockrBS†rCSjj½†rDShxXbarrES†rFSjj½†rGSjRX%}rHS†rIShX
    rJS†rKSjRX{{rLS†rMShjv†rNSjj½†rOShíXparentrPS†rQShjr†rRShjv†rSSjj½†rTSjjv†rUSjRX}}rVS†rWShX&
    Content of bar (second override)
rXS†rYSjRX{%rZS†r[Sjj½†r\SjÃXendblockr]S†r^Sjj½†r_ShxXbarr`S†raSjj½†rbSjRX%}rcS†rdShX
--TEMPLATE(file2.html.twig)--
reS†rfSjRX{%rgS†rhSjj½†riSjÃXuserjS†rkSjj½†rlSjŒX'file1.html.twig'rmS†rnSjj½†roSjRX%}rpS†rqShj!†rrSjRX{%rsS†rtSjj½†ruSjÃXblockrvS†rwSjj½†rxShxXfooryS†rzSjj½†r{SjRX%}r|S†r}ShX
    r~S†rSjRX{{r€S†rShjv†r‚Sjj½†rƒShíXparentr„S†r…Shjr†r†Shjv†r‡Sjj½†rˆSjjv†r‰SjRX}}rŠS†r‹ShX%
    Content of foo (first override)
rŒS†rSjRX{%rŽS†rSjj½†rSjÃXendblockr‘S†r’Sjj½†r“ShxXfoor”S†r•Sjj½†r–SjRX%}r—S†r˜Shj!†r™SjRX{%ršS†r›Sjj½†rœSjÃXblockrS†ržSjj½†rŸShxXbarr S†r¡Sjj½†r¢SjRX%}r£S†r¤ShX
    r¥S†r¦SjRX{{r§S†r¨Shjv†r©Sjj½†rªShíXparentr«S†r¬Shjr†r­Shjv†r®Sjj½†r¯Sjjv†r°SjRX}}r±S†r²ShX%
    Content of bar (first override)
r³S†r´SjRX{%rµS†r¶Sjj½†r·SjÃXendblockr¸S†r¹Sjj½†rºShxXbarr»S†r¼Sjj½†r½SjRX%}r¾S†r¿ShX
--TEMPLATE(file1.html.twig)--
rÀS†rÁSjRX{%rÂS†rÃSjj½†rÄSjÃXblockrÅS†rÆSjj½†rÇShxXfoorÈS†rÉSjj½†rÊSjjv†rËSjRX%}rÌS†rÍShX
    Content of foo
rÎS†rÏSjRX{%rÐS†rÑSjj½†rÒSjÃXendblockrÓS†rÔSjj½†rÕShxXfoorÖS†r×Sjj½†rØSjRX%}rÙS†rÚShj!†rÛSjRX{%rÜS†rÝSjj½†rÞSjÃXblockrßS†ràSjj½†ráShxXbarrâS†rãSjj½†räSjjv†råSjRX%}ræS†rçShX
    Content of bar
rèS†réSjRX{%rêS†rëSjj½†rìSjÃXendblockríS†rîSjj½†rïShxXbarrðS†rñSjj½†ròSjRX%}róS†rôShXÄ
--DATA--
return array()
--EXPECT--
Content of foo
Content of foo (first override)
Content of foo (second override)
Content of bar
Content of bar (second override)
--TEST--
"use" tag
--TEMPLATE--
rõS†röSjRX{%r÷S†røSjj½†rùSjÃXuserúS†rûSjj½†rüSjŒX'file2.html.twig'rýS†rþSjj½†rÿShxXwithrT†rTjj½†rThxXfoobarrT†rTjj½†rThxXasrT†rTjj½†rThxXbase_base_foobarr	T†r
Tjj½†rTjRX%}rT†r
Thj!†rTjRX{%rT†rTjj½†rTjÃXblockrT†rTjj½†rThxXfoobarrT†rTjj½†rTjRX%}rT†rThX
    rT†rTjRX{{rT†rThjv†rTjj½†rThíXblockr T†r!Thjr†r"TjŒX'base_base_foobar'r#T†r$Thjv†r%Tjj½†r&Tjjv†r'TjRX}}r(T†r)ThX(
    Content of block (second override)
r*T†r+TjRX{%r,T†r-Tjj½†r.TjÃXendblockr/T†r0Tjj½†r1ThxXfoobarr2T†r3Tjj½†r4TjRX%}r5T†r6ThX
--TEMPLATE(file2.html.twig)--
r7T†r8TjRX{%r9T†r:Tjj½†r;TjÃXuser<T†r=Tjj½†r>TjŒX'file1.html.twig'r?T†r@Tjj½†rAThxXwithrBT†rCTjj½†rDThxXfoobarrET†rFTjj½†rGThxXasrHT†rITjj½†rJThxXbase_foobarrKT†rLTjj½†rMTjRX%}rNT†rOThj!†rPTjRX{%rQT†rRTjj½†rSTjÃXblockrTT†rUTjj½†rVThxXfoobarrWT†rXTjj½†rYTjRX%}rZT†r[ThX
    r\T†r]TjRX{{r^T†r_Thjv†r`Tjj½†raThíXblockrbT†rcThjr†rdTjŒX
'base_foobar'reT†rfThjv†rgTjj½†rhTjjv†riTjRX}}rjT†rkThX'
    Content of block (first override)
rlT†rmTjRX{%rnT†roTjj½†rpTjÃXendblockrqT†rrTjj½†rsThxXfoobarrtT†ruTjj½†rvTjRX%}rwT†rxThX
--TEMPLATE(file1.html.twig)--
ryT†rzTjRX{%r{T†r|Tjj½†r}TjÃXblockr~T†rTjj½†r€ThxXfoobarrT†r‚Tjj½†rƒTjjv†r„TjRX%}r…T†r†ThX
    Content of block
r‡T†rˆTjRX{%r‰T†rŠTjj½†r‹TjÃXendblockrŒT†rTjj½†rŽThxXfoobarrT†rTjj½†r‘TjRX%}r’T†r“ThXŸ
--DATA--
return array()
--EXPECT--
Content of block
Content of block (first override)
Content of block (second override)
--TEST--
"verbatim" tag
--TEMPLATE--
r”T†r•TjRX{%r–T†r—Tjj½†r˜TjÃXverbatimr™T†ršTjj½†r›TjRX%}rœT†rThX
{{ foo }}
ržT†rŸTjRX{%r T†r¡Tjj½†r¢TjÃXendverbatimr£T†r¤Tjj½†r¥TjRX%}r¦T†r§ThX$
--DATA--
return array()
--EXPECT--
r¨T†r©TjRX{{rªT†r«Tjj½†r¬ThxXfoor­T†r®Tjj½†r¯TjRX}}r°T†r±ThX&
--TEST--
"verbatim" tag
--TEMPLATE--
r²T†r³TjRX{%r´T†rµTjj½†r¶TjÃXverbatimr·T†r¸Tjj½†r¹TjRX%}rºT†r»ThXè
{{ foo }}
{% endraw %}
--DATA--
return array()
--EXCEPTION--
Twig_Error_Syntax: Unexpected end of file: Unclosed "verbatim" block in "index.twig" at line 2
--TEST--
"verbatim" tag
--TEMPLATE--
1***

{%- verbatim %}
    {{ 'bla' }}
r¼T†r½TjRX{%r¾T†r¿Tjj½†rÀTjÃXendverbatimrÁT†rÂTjj½†rÃTjRX%}rÄT†rÅThX


1***
2***

rÆT†rÇTjRX{%rÈT†rÉTjX- rÊT†rËTjÃXverbatimrÌT†rÍTjX -rÎT†rÏTjRX%}rÐT†rÑThX
    {{ 'bla' }}
rÒT†rÓTjRX{%rÔT†rÕTjj½†rÖTjÃXendverbatimr×T†rØTjj½†rÙTjRX%}rÚT†rÛThX


2***
3***

rÜT†rÝTjRX{%rÞT†rßTjX- ràT†ráTjÃXverbatimrâT†rãTe(jX -räT†råTjRX%}ræT†rçThX
    {{ 'bla' }}
rèT†réTjRX{%rêT†rëTjj½†rìTjÃXendverbatimríT†rîTjX -rïT†rðTjRX%}rñT†ròThX


3***
4***

róT†rôTjRX{%rõT†röTjX- r÷T†røTjÃXverbatimrùT†rúTjX -rûT†rüTjRX%}rýT†rþThX
    {{ 'bla' }}
rÿT†rUjRX{%rU†rUjX- rU†rUjÃXendverbatimrU†rUjj½†rUjRX%}rU†r	UhX


4***
5***

r
U†rUjRX{%rU†r
UjX- rU†rUjÃXverbatimrU†rUjX -rU†rUjRX%}rU†rUhX
    {{ 'bla' }}
rU†rUjRX{%rU†rUjX- rU†rUjÃXendverbatimrU†rUjX -rU†rUjRX%}r U†r!UhX3

5***
--DATA--
return array()
--EXPECT--
1***
    r"U†r#UjRX{{r$U†r%Ujj½†r&UjŒX'bla'r'U†r(Ujj½†r)UjRX}}r*U†r+UhX


1***
2***r,U†r-UjRX{{r.U†r/Ujj½†r0UjŒX'bla'r1U†r2Ujj½†r3UjRX}}r4U†r5UhX


2***
3***r6U†r7UjRX{{r8U†r9Ujj½†r:UjŒX'bla'r;U†r<Ujj½†r=UjRX}}r>U†r?UhX

3***
4***r@U†rAUjRX{{rBU†rCUjj½†rDUjŒX'bla'rEU†rFUjj½†rGUjRX}}rHU†rIUhX

4***
5***rJU†rKUjRX{{rLU†rMUjj½†rNUjŒX'bla'rOU†rPUjj½†rQUjRX}}rRU†rSUhX,5***
--TEST--
array index test
--TEMPLATE--
rTU†rUUjRX{%rVU†rWUjj½†rXUjÃXforrYU†rZUjj½†r[UhxXkeyr\U†r]Uhjƒ†r^Ujj½†r_UhxXvaluer`U†raUjj½†rbUjÃXinrcU†rdUjj½†reUhxXdaysrfU†rgUjj½†rhUjRX%}riU†rjUhj!†rkUjRX{{rlU†rmUjj½†rnUhxXkeyroU†rpUjj½†rqUjRX}}rrU†rsUhj!†rtUjRX{%ruU†rvUjj½†rwUjÃXendforrxU†ryUjj½†rzUjRX%}r{U†r|UhXG
--DATA--
return array('days' => array(
    1  => array('money' => 9),
    2  => array('money' => 21),
    3  => array('money' => 38),
    4  => array('money' => 6),
    18 => array('money' => 6),
    19 => array('money' => 3),
    31 => array('money' => 11),
));
--EXPECT--
1
2
3
4
18
19
31
--TEST--
"const" test
--TEMPLATE--
r}U†r~UjRX{{rU†r€Ujj½†rUjjw†r‚Ujj½†rƒUjÃXisr„U†r…Ujj½†r†UjXconstantr‡U†rˆUhjr†r‰UjŒX
'E_NOTICE'rŠU†r‹Uhjv†rŒUjj½†rUhjʆrŽUjj½†rUjŒX'ok'rU†r‘Ujj½†r’Uhj±†r“Ujj½†r”UjŒX'no'r•U†r–Ujj½†r—UjRX}}r˜U†r™Uhj!†ršUjRX{{r›U†rœUjj½†rUjŒX'bar'ržU†rŸUjj½†r UjÃXisr¡U†r¢Ujj½†r£UjXconstantr¤U†r¥Uhjr†r¦UjŒX'TwigTestFoo::BAR_NAME'r§U†r¨Uhjv†r©Ujj½†rªUhjʆr«Ujj½†r¬UjŒX'ok'r­U†r®Ujj½†r¯Uhj±†r°Ujj½†r±UjŒX'no'r²U†r³Ujj½†r´UjRX}}rµU†r¶Uhj!†r·UjRX{{r¸U†r¹Ujj½†rºUhxXvaluer»U†r¼Ujj½†r½UjÃXisr¾U†r¿Ujj½†rÀUjXconstantrÁU†rÂUhjr†rÃUjŒX'TwigTestFoo::BAR_NAME'rÄU†rÅUhjv†rÆUjj½†rÇUhjʆrÈUjj½†rÉUjŒX'ok'rÊU†rËUjj½†rÌUhj±†rÍUjj½†rÎUjŒX'no'rÏU†rÐUjj½†rÑUjRX}}rÒU†rÓUhj!†rÔUjRX{{rÕU†rÖUjj½†r×Ujj††rØUjj½†rÙUjÃXisrÚU†rÛUjj½†rÜUjXconstantrÝU†rÞUhjr†rßUjŒX'ARRAY_AS_PROPS'ràU†ráUhjƒ†râUjj½†rãUhxXobjecträU†råUhjv†ræUjj½†rçUhjʆrèUjj½†réUjŒX'ok'rêU†rëUjj½†rìUhj±†ríUjj½†rîUjŒX'no'rïU†rðUjj½†rñUjRX}}ròU†róUhX
--DATA--
return array('value' => 'bar', 'object' => new ArrayObject(array('hi')));
--EXPECT--
ok
ok
ok
ok--TEST--
"defined" test
--TEMPLATE--
rôU†rõUjRX{{röU†r÷Ujj½†røUhxX
definedVarrùU†rúUjX                     rûU†rüUjÃXisrýU†rþUjX     rÿU†rVjXdefinedrV†rVjj½†rVhjʆrVjj½†rVjŒX'ok'rV†rVjj½†rVhj±†r	Vjj½†r
VjŒX'ko'rV†rVjj½†r
VjRX}}rV†rVhj!†rVjRX{{rV†rVjj½†rVhxX
definedVarrV†rVjX                     rV†rVjÃXisrV†rVjj½†rVjÃXnotrV†rVjj½†rVjXdefinedrV†rVjj½†r Vhjʆr!Vjj½†r"VjŒX'ko'r#V†r$Vjj½†r%Vhj±†r&Vjj½†r'VjŒX'ok'r(V†r)Vjj½†r*VjRX}}r+V†r,Vhj!†r-VjRX{{r.V†r/Vjj½†r0VhxXundefinedVarr1V†r2VjX                   r3V†r4VjÃXisr5V†r6VjX     r7V†r8VjXdefinedr9V†r:Vjj½†r;Vhjʆr<Vjj½†r=VjŒX'ko'r>V†r?Vjj½†r@Vhj±†rAVjj½†rBVjŒX'ok'rCV†rDVjj½†rEVjRX}}rFV†rGVhj!†rHVjRX{{rIV†rJVjj½†rKVhxXundefinedVarrLV†rMVjX                   rNV†rOVjÃXisrPV†rQVjj½†rRVjÃXnotrSV†rTVjj½†rUVjXdefinedrVV†rWVjj½†rXVhjʆrYVjj½†rZVjŒX'ok'r[V†r\Vjj½†r]Vhj±†r^Vjj½†r_VjŒX'ko'r`V†raVjj½†rbVjRX}}rcV†rdVhj!†reVjRX{{rfV†rgVjj½†rhVhxXzeroVarriV†rjVjX                        rkV†rlVjÃXisrmV†rnVjX     roV†rpVjXdefinedrqV†rrVjj½†rsVhjʆrtVjj½†ruVjŒX'ok'rvV†rwVjj½†rxVhj±†ryVjj½†rzVjŒX'ko'r{V†r|Vjj½†r}VjRX}}r~V†rVhj!†r€VjRX{{rV†r‚Vjj½†rƒVhxXnullVarr„V†r…VjX                        r†V†r‡VjÃXisrˆV†r‰VjX     rŠV†r‹VjXdefinedrŒV†rVjj½†rŽVhjʆrVjj½†rVjŒX'ok'r‘V†r’Vjj½†r“Vhj±†r”Vjj½†r•VjŒX'ko'r–V†r—Vjj½†r˜VjRX}}r™V†ršVhj!†r›VjRX{{rœV†rVjj½†ržVhxXnestedrŸV†r VhxX.definedVarr¡V†r¢VjX              r£V†r¤VjÃXisr¥V†r¦VjX     r§V†r¨VjXdefinedr©V†rªVjj½†r«Vhjʆr¬Vjj½†r­VjŒX'ok'r®V†r¯Vjj½†r°Vhj±†r±Vjj½†r²VjŒX'ko'r³V†r´Vjj½†rµVjRX}}r¶V†r·Vhj!†r¸VjRX{{r¹V†rºVjj½†r»VhxXnestedr¼V†r½Vhj=†r¾VjŒX'definedVar'r¿V†rÀVhjA†rÁVjX           rÂV†rÃVjÃXisrÄV†rÅVjX     rÆV†rÇVjXdefinedrÈV†rÉVjj½†rÊVhjʆrËVjj½†rÌVjŒX'ok'rÍV†rÎVjj½†rÏVhj±†rÐVjj½†rÑVjŒX'ko'rÒV†rÓVjj½†rÔVjRX}}rÕV†rÖVhj!†r×VjRX{{rØV†rÙVjj½†rÚVhxXnestedrÛV†rÜVhxX.definedVarrÝV†rÞVjX              rßV†ràVjÃXisráV†râVjj½†rãVjÃXnoträV†råVjj½†ræVjXdefinedrçV†rèVjj½†réVhjʆrêVjj½†rëVjŒX'ko'rìV†ríVjj½†rîVhj±†rïVjj½†rðVjŒX'ok'rñV†ròVjj½†róVjRX}}rôV†rõVhj!†röVjRX{{r÷V†røVjj½†rùVhxXnestedrúV†rûVhxX
.undefinedVarrüV†rýVjX            rþV†rÿVjÃXisrW†rWjX     rW†rWjXdefinedrW†rWjj½†rWhjʆrWjj½†rWjŒX'ko'r	W†r
Wjj½†rWhj±†rWjj½†r
WjŒX'ok'rW†rWjj½†rWjRX}}rW†rWhj!†rWjRX{{rW†rWjj½†rWhxXnestedrW†rWhj=†rWjŒX'undefinedVar'rW†rWhjA†rWjX	         rW†rWjÃXisrW†r WjX     r!W†r"WjXdefinedr#W†r$Wjj½†r%Whjʆr&Wjj½†r'WjŒX'ko'r(W†r)Wjj½†r*Whj±†r+Wjj½†r,WjŒX'ok'r-W†r.Wjj½†r/WjRX}}r0W†r1Whj!†r2WjRX{{r3W†r4Wjj½†r5WhxXnestedr6W†r7WhxX
.undefinedVarr8W†r9WjX            r:W†r;WjÃXisr<W†r=Wjj½†r>WjÃXnotr?W†r@Wjj½†rAWjXdefinedrBW†rCWjj½†rDWhjʆrEWjj½†rFWjŒX'ok'rGW†rHWjj½†rIWhj±†rJWjj½†rKWjŒX'ko'rLW†rMWjj½†rNWjRX}}rOW†rPWhj!†rQWjRX{{rRW†rSWjj½†rTWhxXnestedrUW†rVWhxX.zeroVarrWW†rXWjX                 rYW†rZWjÃXisr[W†r\WjX     r]W†r^WjXdefinedr_W†r`Wjj½†raWhjʆrbWjj½†rcWjŒX'ok'rdW†reWjj½†rfWhj±†rgWjj½†rhWjŒX'ko'riW†rjWjj½†rkWjRX}}rlW†rmWhj!†rnWjRX{{roW†rpWjj½†rqWhxXnestedrrW†rsWhxX.nullVarrtW†ruWjX                 rvW†rwWjÃXisrxW†ryWjX     rzW†r{WjXdefinedr|W†r}Wjj½†r~WhjʆrWjj½†r€WjŒX'ok'rW†r‚Wjj½†rƒWhj±†r„Wjj½†r…WjŒX'ko'r†W†r‡Wjj½†rˆWjRX}}r‰W†rŠWhj!†r‹WjRX{{rŒW†rWjj½†rŽWhxXnestedrW†rWhxX
.definedArrayr‘W†r’WjX.0r“W†r”WjX
          r•W†r–WjÃXisr—W†r˜WjX     r™W†ršWjXdefinedr›W†rœWjj½†rWhjʆržWjj½†rŸWjŒX'ok'r W†r¡Wjj½†r¢Whj±†r£Wjj½†r¤WjŒX'ko'r¥W†r¦Wjj½†r§WjRX}}r¨W†r©Whj!†rªWjRX{{r«W†r¬Wjj½†r­WhxXnestedr®W†r¯Whj=†r°WjŒX'definedArray'r±W†r²WhjA†r³Whj=†r´Wjj¯†rµWhjA†r¶WjX      r·W†r¸WjÃXisr¹W†rºWjX     r»W†r¼WjXdefinedr½W†r¾Wjj½†r¿WhjʆrÀWjj½†rÁWjŒX'ok'rÂW†rÃWjj½†rÄWhj±†rÅWjj½†rÆWjŒX'ko'rÇW†rÈWjj½†rÉWjRX}}rÊW†rËWhj!†rÌWjRX{{rÍW†rÎWjj½†rÏWhxXobjectrÐW†rÑWhxX.foorÒW†rÓWjX                     rÔW†rÕWjÃXisrÖW†r×WjX     rØW†rÙWjXdefinedrÚW†rÛWjj½†rÜWhjʆrÝWjj½†rÞWjŒX'ok'rßW†ràWjj½†ráWhj±†râWjj½†rãWjŒX'ko'räW†råWjj½†ræWjRX}}rçW†rèWhj!†réWjRX{{rêW†rëWjj½†rìWhxXobjectríW†rîWhxX.undefinedMethodrïW†rðWjX	         rñW†ròWjÃXisróW†rôWjX     rõW†röWjXdefinedr÷W†røWjj½†rùWhjʆrúWjj½†rûWjŒX'ko'rüW†rýWjj½†rþWhj±†rÿWjj½†rXjŒX'ok'rX†rXjj½†rXjRX}}rX†rXhj!†rXjRX{{rX†rXjj½†r	XhxXobjectr
X†rXhxX.getFoorX†r
Xhjr†rXhjv†rXjX                rX†rXjÃXisrX†rXjX     rX†rXjXdefinedrX†rXjj½†rXhjʆrXjj½†rXjŒX'ok'rX†rXjj½†rXhj±†rXjj½†rXjŒX'ko'r X†r!Xjj½†r"XjRX}}r#X†r$Xhj!†r%XjRX{{r&X†r'Xjj½†r(XhxXobjectr)X†r*XhxX.getFoor+X†r,Xhjr†r-XjŒX'a'r.X†r/Xhjv†r0XjX
             r1X†r2XjÃXisr3X†r4XjX     r5X†r6XjXdefinedr7X†r8Xjj½†r9Xhjʆr:Xjj½†r;XjŒX'ok'r<X†r=Xjj½†r>Xhj±†r?Xjj½†r@XjŒX'ko'rAX†rBXjj½†rCXjRX}}rDX†rEXhj!†rFXjRX{{rGX†rHXjj½†rIXhxXobjectrJX†rKXhxX.undefinedMethodrLX†rMXhjr†rNXhjv†rOXjX       rPX†rQXjÃXisrRX†rSXjX     rTX†rUXjXdefinedrVX†rWXjj½†rXXhjʆrYXjj½†rZXjŒX'ko'r[X†r\Xjj½†r]Xhj±†r^Xjj½†r_XjŒX'ok'r`X†raXjj½†rbXjRX}}rcX†rdXhj!†reXjRX{{rfX†rgXjj½†rhXhxXobjectriX†rjXhxX.undefinedMethodrkX†rlXhjr†rmXjŒX'a'rnX†roXhjv†rpXjX    rqX†rrXjÃXisrsX†rtXjX     ruX†rvXjXdefinedrwX†rxXjj½†ryXhjʆrzXjj½†r{XjŒX'ko'r|X†r}Xjj½†r~Xhj±†rXjj½†r€XjŒX'ok'rX†r‚Xjj½†rƒXjRX}}r„X†r…Xhj!†r†XjRX{{r‡X†rˆXjj½†r‰XhxXobjectrŠX†r‹XhxX.selfrŒX†rXhxX.foorŽX†rXjX                rX†r‘XjÃXisr’X†r“XjX     r”X†r•XjXdefinedr–X†r—Xjj½†r˜Xhjʆr™Xjj½†ršXjŒX'ok'r›X†rœXjj½†rXhj±†ržXjj½†rŸXjŒX'ko'r X†r¡Xjj½†r¢XjRX}}r£X†r¤Xhj!†r¥XjRX{{r¦X†r§Xjj½†r¨XhxXobjectr©X†rªXhxX.selfr«X†r¬XhxX.undefinedMethodr­X†r®XjX    r¯X†r°XjÃXisr±X†r²XjX     r³X†r´XjXdefinedrµX†r¶Xjj½†r·Xhjʆr¸Xjj½†r¹XjŒX'ko'rºX†r»Xjj½†r¼Xhj±†r½Xjj½†r¾XjŒX'ok'r¿X†rÀXjj½†rÁXjRX}}rÂX†rÃXhj!†rÄXjRX{{rÅX†rÆXjj½†rÇXhxXobjectrÈX†rÉXhxX.undefinedMethodrÊX†rËXhxX.selfrÌX†rÍXjX    rÎX†rÏXjÃXisrÐX†rÑXjX     rÒX†rÓXjXdefinedrÔX†rÕXjj½†rÖXhjʆr×Xjj½†rØXjŒX'ko'rÙX†rÚXjj½†rÛXhj±†rÜXjj½†rÝXjŒX'ok'rÞX†rßXjj½†ràXjRX}}ráX†râXhXq
--DATA--
return array(
    'definedVar' => 'defined',
    'zeroVar'    => 0,
    'nullVar'    => null,
    'nested'      => array(
        'definedVar'   => 'defined',
        'zeroVar'      => 0,
        'nullVar'      => null,
        'definedArray' => array(0),
    ),
    'object' => new TwigTestFoo(),
);
--EXPECT--
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
--DATA--
return array(
    'definedVar' => 'defined',
    'zeroVar'    => 0,
    'nullVar'    => null,
    'nested'      => array(
        'definedVar'   => 'defined',
        'zeroVar'      => 0,
        'nullVar'      => null,
        'definedArray' => array(0),
    ),
    'object' => new TwigTestFoo(),
);
--CONFIG--
return array('strict_variables' => false)
--EXPECT--
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
--TEST--
"empty" test
--TEMPLATE--
rãX†räXjRX{{råX†ræXjj½†rçXhxXfoorèX†réXjj½†rêXjÃXisrëX†rìXjj½†ríXjXemptyrîX†rïXjj½†rðXhjʆrñXjj½†ròXjŒX'ok'róX†rôXjj½†rõXhj±†röXjj½†r÷XjŒX'ko'røX†rùXjj½†rúXjRX}}rûX†rüXhj!†rýXjRX{{rþX†rÿXjj½†rYhxXbarrY†rYjj½†rYjÃXisrY†rYjj½†rYjXemptyrY†rYjj½†r	Yhjʆr
Yjj½†rYjŒX'ok'rY†r
Yjj½†rYhj±†rYjj½†rYjŒX'ko'rY†rYjj½†rYjRX}}rY†rYhj!†rYjRX{{rY†rYjj½†rYhxXfoobarrY†rYjj½†rYjÃXisrY†rYjj½†rYjXemptyr Y†r!Yjj½†r"Yhjʆr#Yjj½†r$YjŒX'ok'r%Y†r&Yjj½†r'Yhj±†r(Yjj½†r)YjŒX'ko'r*Y†r+Yjj½†r,YjRX}}r-Y†r.Yhj!†r/YjRX{{r0Y†r1Yjj½†r2YhxXarrayr3Y†r4Yjj½†r5YjÃXisr6Y†r7Yjj½†r8YjXemptyr9Y†r:Yjj½†r;Yhjʆr<Yjj½†r=YjŒX'ok'r>Y†r?Yjj½†r@Yhj±†rAYjj½†rBYjŒX'ko'rCY†rDYjj½†rEYjRX}}rFY†rGYhj!†rHYjRX{{rIY†rJYjj½†rKYhxXzerorLY†rMYjj½†rNYjÃXisrOY†rPYjj½†rQYjXemptyrRY†rSYjj½†rTYhjʆrUYjj½†rVYjŒX'ok'rWY†rXYjj½†rYYhj±†rZYjj½†r[YjŒX'ko'r\Y†r]Yjj½†r^YjRX}}r_Y†r`Yhj!†raYjRX{{rbY†rcYjj½†rdYhxXstringreY†rfYjj½†rgYjÃXisrhY†riYjj½†rjYjXemptyrkY†rlYjj½†rmYhjʆrnYjj½†roYjŒX'ok'rpY†rqYjj½†rrYhj±†rsYjj½†rtYjŒX'ko'ruY†rvYjj½†rwYjRX}}rxY†ryYhj!†rzYjRX{{r{Y†r|Yjj½†r}YhxXcountable_emptyr~Y†rYjj½†r€YjÃXisrY†r‚Yjj½†rƒYjXemptyr„Y†r…Yjj½†r†Yhjʆr‡Yjj½†rˆYjŒX'ok'r‰Y†rŠYjj½†r‹Yhj±†rŒYjj½†rYjŒX'ko'rŽY†rYjj½†rYjRX}}r‘Y†r’Yhj!†r“YjRX{{r”Y†r•Yjj½†r–YhxXcountable_not_emptyr—Y†r˜Yjj½†r™YjÃXisršY†r›Yjj½†rœYjXemptyrY†ržYjj½†rŸYhjʆr Yjj½†r¡YjŒX'ok'r¢Y†r£Yjj½†r¤Yhj±†r¥Yjj½†r¦YjŒX'ko'r§Y†r¨Yjj½†r©YjRX}}rªY†r«Yhj!†r¬YjRX{{r­Y†r®Yjj½†r¯YhxXmarkup_emptyr°Y†r±Yjj½†r²YjÃXisr³Y†r´Yjj½†rµYjXemptyr¶Y†r·Yjj½†r¸Yhjʆr¹Yjj½†rºYjŒX'ok'r»Y†r¼Yjj½†r½Yhj±†r¾Yjj½†r¿YjŒX'ko'rÀY†rÁYjj½†rÂYjRX}}rÃY†rÄYhj!†rÅYjRX{{rÆY†rÇYjj½†rÈYhxXmarkup_not_emptyrÉY†rÊYjj½†rËYjÃXisrÌY†rÍYjj½†rÎYjXemptyrÏY†rÐYjj½†rÑYhjʆrÒYjj½†rÓYjŒX'ok'rÔY†rÕYjj½†rÖYhj±†r×Yjj½†rØYjŒX'ko'rÙY†rÚYjj½†rÛYjRX}}rÜY†rÝYhX4
--DATA--

class CountableStub implements Countable
rÞY†rßYhj­†ràYhXH
    private $items;

    public function __construct(array $items)
    ráY†râYhj­†rãYhXG
        $this->items = $items;
    }

    public function count()
    räY†råYhj­†ræYhXÈ
        return count($this->items);
    }
}
return array(
    'foo' => '', 'bar' => null, 'foobar' => false, 'array' => array(), 'zero' => 0, 'string' => '0',
    'countable_empty' => new CountableStub(array()), 'countable_not_empty' => new CountableStub(array(1, 2)),
    'markup_empty' => new Twig_Markup('', 'UTF-8'), 'markup_not_empty' => new Twig_Markup('test', 'UTF-8'),
);
--EXPECT--
ok
ok
ok
ok
ko
ko
ok
ko
ok
ko
--TEST--
"even" test
--TEMPLATE--
rçY†rèYjRX{{réY†rêYjj½†rëYjj†rìYjj½†ríYjÃXisrîY†rïYjj½†rðYjXevenrñY†ròYjj½†róYhjʆrôYjj½†rõYjŒX'ko'röY†r÷Yjj½†røYhj±†rùYjj½†rúYjŒX'ok'rûY†rüYjj½†rýYjRX}}rþY†rÿYhj!†rZjRX{{rZ†rZjj½†rZjj††rZjj½†rZjÃXisrZ†rZjj½†rZjXevenr	Z†r
Zjj½†rZhjʆrZjj½†r
ZjŒX'ok'rZ†rZjj½†rZhj±†rZjj½†rZjŒX'ko'rZ†rZjj½†rZjRX}}rZ†rZhj!†rZjRX{{rZ†rZjj½†rZjj†rZjj½†rZjÃXisrZ†rZjj½†r ZjÃXnotr!Z†r"Zjj½†r#ZjXevenr$Z†r%Zjj½†r&Zhjʆr'Zjj½†r(ZjŒX'ok'r)Z†r*Zjj½†r+Zhj±†r,Zjj½†r-ZjŒX'ko'r.Z†r/Zjj½†r0ZjRX}}r1Z†r2Zhj!†r3ZjRX{{r4Z†r5Zjj½†r6Zjj††r7Zjj½†r8ZjÃXisr9Z†r:Zjj½†r;ZjÃXnotr<Z†r=Zjj½†r>ZjXevenr?Z†r@Zjj½†rAZhjʆrBZjj½†rCZjŒX'ko'rDZ†rEZjj½†rFZhj±†rGZjj½†rHZjŒX'ok'rIZ†rJZjj½†rKZjRX}}rLZ†rMZhXd
--DATA--
return array()
--EXPECT--
ok
ok
ok
ok
--TEST--
Twig supports the in operator
--TEMPLATE--
rNZ†rOZjRX{%rPZ†rQZjj½†rRZjÃXifrSZ†rTZjj½†rUZhxXbarrVZ†rWZjj½†rXZjÃXinrYZ†rZZjj½†r[ZhxXfoor\Z†r]Zjj½†r^ZjRX%}r_Z†r`ZhX
TRUE
raZ†rbZjRX{%rcZ†rdZjj½†reZjÃXendifrfZ†rgZjj½†rhZjRX%}riZ†rjZhj!†rkZjRX{%rlZ†rmZjj½†rnZjÃXifroZ†rpZjj½†rqZjÃXnotrrZ†rsZjj½†rtZhjr†ruZhxXbarrvZ†rwZjj½†rxZjÃXinryZ†rzZjj½†r{ZhxXfoor|Z†r}Zhjv†r~Zjj½†rZjRX%}r€Z†rZhj!†r‚ZjRX{%rƒZ†r„Zjj½†r…ZjÃXelser†Z†r‡Zjj½†rˆZjRX%}r‰Z†rŠZhX
TRUE
r‹Z†rŒZjRX{%rZ†rŽZjj½†rZjÃXendifrZ†r‘Zjj½†r’ZjRX%}r“Z†r”Zhj!†r•ZjRX{%r–Z†r—Zjj½†r˜ZjÃXifr™Z†ršZjj½†r›ZhxXbarrœZ†rZjj½†ržZjÃXnotrŸZ†r Zjj½†r¡ZjÃXinr¢Z†r£Zjj½†r¤ZhxXfoor¥Z†r¦Zjj½†r§ZjRX%}r¨Z†r©Zhj!†rªZjRX{%r«Z†r¬Ze(jj½†r­ZjÃXelser®Z†r¯Zjj½†r°ZjRX%}r±Z†r²ZhX
TRUE
r³Z†r´ZjRX{%rµZ†r¶Zjj½†r·ZjÃXendifr¸Z†r¹Zjj½†rºZjRX%}r»Z†r¼Zhj!†r½ZjRX{%r¾Z†r¿Zjj½†rÀZjÃXifrÁZ†rÂZjj½†rÃZjŒX'a'rÄZ†rÅZjj½†rÆZjÃXinrÇZ†rÈZjj½†rÉZhxXbarrÊZ†rËZjj½†rÌZjRX%}rÍZ†rÎZhX
TRUE
rÏZ†rÐZjRX{%rÑZ†rÒZjj½†rÓZjÃXendifrÔZ†rÕZjj½†rÖZjRX%}r×Z†rØZhj!†rÙZjRX{%rÚZ†rÛZjj½†rÜZjÃXifrÝZ†rÞZjj½†rßZjŒX'c'ràZ†ráZjj½†râZjÃXnotrãZ†räZjj½†råZjÃXinræZ†rçZjj½†rèZhxXbarréZ†rêZjj½†rëZjRX%}rìZ†ríZhX
TRUE
rîZ†rïZjRX{%rðZ†rñZjj½†ròZjÃXendifróZ†rôZjj½†rõZjRX%}röZ†r÷Zhj!†røZjRX{%rùZ†rúZjj½†rûZjÃXifrüZ†rýZjj½†rþZjŒX''rÿZ†r[jj½†r[jÃXnotr[†r[jj½†r[jÃXinr[†r[jj½†r[hxXbarr[†r	[jj½†r
[jRX%}r[†r[hX
TRUE
r
[†r[jRX{%r[†r[jj½†r[jÃXendifr[†r[jj½†r[jRX%}r[†r[hj!†r[jRX{%r[†r[jj½†r[jÃXifr[†r[jj½†r[jŒX''r[†r[jj½†r [jÃXinr![†r"[jj½†r#[jŒX''r$[†r%[jj½†r&[jRX%}r'[†r([hX
TRUE
r)[†r*[jRX{%r+[†r,[jj½†r-[jÃXendifr.[†r/[jj½†r0[jRX%}r1[†r2[hj!†r3[jRX{%r4[†r5[jj½†r6[jÃXifr7[†r8[jj½†r9[jŒX'0'r:[†r;[jj½†r<[jÃXnotr=[†r>[jj½†r?[jÃXinr@[†rA[jj½†rB[jŒX''rC[†rD[jj½†rE[jRX%}rF[†rG[hX
TRUE
rH[†rI[jRX{%rJ[†rK[jj½†rL[jÃXendifrM[†rN[jj½†rO[jRX%}rP[†rQ[hj!†rR[jRX{%rS[†rT[jj½†rU[jÃXifrV[†rW[jj½†rX[jŒX'a'rY[†rZ[jj½†r[[jÃXnotr\[†r][jj½†r^[jÃXinr_[†r`[jj½†ra[jŒX'0'rb[†rc[jj½†rd[jRX%}re[†rf[hX
TRUE
rg[†rh[jRX{%ri[†rj[jj½†rk[jÃXendifrl[†rm[jj½†rn[jRX%}ro[†rp[hj!†rq[jRX{%rr[†rs[jj½†rt[jÃXifru[†rv[jj½†rw[jŒX'0'rx[†ry[jj½†rz[jÃXinr{[†r|[jj½†r}[jŒX'0'r~[†r[jj½†r€[jRX%}r[†r‚[hX
TRUE
rƒ[†r„[jRX{%r…[†r†[jj½†r‡[jÃXendifrˆ[†r‰[jj½†rŠ[jRX%}r‹[†rŒ[hj!†r[jRX{{rŽ[†r[jj½†r[jûXfalser‘[†r’[jj½†r“[jÃXinr”[†r•[jj½†r–[hj=†r—[jj¯†r˜[hjƒ†r™[jj½†rš[jj†r›[hjA†rœ[jj½†r[hjʆrž[jj½†rŸ[jŒX'TRUE'r [†r¡[jj½†r¢[hj±†r£[jj½†r¤[jŒX'FALSE'r¥[†r¦[jj½†r§[jRX}}r¨[†r©[hj!†rª[jRX{{r«[†r¬[jj½†r­[jûXtruer®[†r¯[jj½†r°[jÃXinr±[†r²[jj½†r³[hj=†r´[jj¯†rµ[hjƒ†r¶[jj½†r·[jj†r¸[hjA†r¹[jj½†rº[hjʆr»[jj½†r¼[jŒX'TRUE'r½[†r¾[jj½†r¿[hj±†rÀ[jj½†rÁ[jŒX'FALSE'rÂ[†rÃ[jj½†rÄ[jRX}}rÅ[†rÆ[hj!†rÇ[jRX{{rÈ[†rÉ[jj½†rÊ[jŒX'0'rË[†rÌ[jj½†rÍ[jÃXinrÎ[†rÏ[jj½†rÐ[hj=†rÑ[jj¯†rÒ[hjƒ†rÓ[jj½†rÔ[jj†rÕ[hjA†rÖ[jj½†r×[hjʆrØ[jj½†rÙ[jŒX'TRUE'rÚ[†rÛ[jj½†rÜ[hj±†rÝ[jj½†rÞ[jŒX'FALSE'rß[†rà[jj½†rá[jRX}}râ[†rã[hj!†rä[jRX{{rå[†ræ[jj½†rç[jŒX''rè[†ré[jj½†rê[jÃXinrë[†rì[jj½†rí[hj=†rî[jj¯†rï[hjƒ†rð[jj½†rñ[jj†rò[hjA†ró[jj½†rô[hjʆrõ[jj½†rö[jŒX'TRUE'r÷[†rø[jj½†rù[hj±†rú[jj½†rû[jŒX'FALSE'rü[†rý[jj½†rþ[jRX}}rÿ[†r\hj!†r\jRX{{r\†r\jj½†r\jj¯†r\jj½†r\jÃXinr\†r\jj½†r	\hj=†r
\jŒX''r\†r\hjƒ†r
\jj½†r\jj†r\hjA†r\jj½†r\hjʆr\jj½†r\jŒX'TRUE'r\†r\jj½†r\hj±†r\jj½†r\jŒX'FALSE'r\†r\jj½†r\jRX}}r\†r\hj!†r\jRX{{r\†r \jj½†r!\jŒX''r"\†r#\jj½†r$\jÃXinr%\†r&\jj½†r'\jŒX'foo'r(\†r)\jj½†r*\hjʆr+\jj½†r,\jŒX'TRUE'r-\†r.\jj½†r/\hj±†r0\jj½†r1\jŒX'FALSE'r2\†r3\jj½†r4\jRX}}r5\†r6\hj!†r7\jRX{{r8\†r9\jj½†r:\jj¯†r;\jj½†r<\jÃXinr=\†r>\jj½†r?\jŒX'foo'r@\†rA\jj½†rB\hjʆrC\jj½†rD\jŒX'TRUE'rE\†rF\jj½†rG\hj±†rH\jj½†rI\jŒX'FALSE'rJ\†rK\jj½†rL\jRX}}rM\†rN\hj!†rO\jRX{{rP\†rQ\jj½†rR\jûXfalserS\†rT\jj½†rU\jÃXinrV\†rW\jj½†rX\jŒX'foo'rY\†rZ\jj½†r[\hjʆr\\jj½†r]\jŒX'TRUE'r^\†r_\jj½†r`\hj±†ra\jj½†rb\jŒX'FALSE'rc\†rd\jj½†re\jRX}}rf\†rg\hj!†rh\jRX{{ri\†rj\jj½†rk\jûXtruerl\†rm\jj½†rn\jÃXinro\†rp\jj½†rq\jŒX'100'rr\†rs\jj½†rt\hjʆru\jj½†rv\jŒX'TRUE'rw\†rx\jj½†ry\hj±†rz\jj½†r{\jŒX'FALSE'r|\†r}\jj½†r~\jRX}}r\†r€\hj!†r\jRX{{r‚\†rƒ\jj½†r„\hj=†r…\hjA†r†\jj½†r‡\jÃXinrˆ\†r‰\jj½†rŠ\jŒX'Array'r‹\†rŒ\jj½†r\hjʆrŽ\jj½†r\jŒX'TRUE'r\†r‘\jj½†r’\hj±†r“\jj½†r”\jŒX'FALSE'r•\†r–\jj½†r—\jRX}}r˜\†r™\hj!†rš\jRX{{r›\†rœ\jj½†r\hj=†rž\hjA†rŸ\jj½†r \jÃXinr¡\†r¢\jj½†r£\hj=†r¤\jûXtruer¥\†r¦\hjƒ†r§\jj½†r¨\jûXfalser©\†rª\hjA†r«\jj½†r¬\hjʆr­\jj½†r®\jŒX'TRUE'r¯\†r°\jj½†r±\hj±†r²\jj½†r³\jŒX'FALSE'r´\†rµ\jj½†r¶\jRX}}r·\†r¸\hj!†r¹\jRX{{rº\†r»\jj½†r¼\hj=†r½\hjA†r¾\jj½†r¿\jÃXinrÀ\†rÁ\jj½†rÂ\hj=†rÃ\jûXtruerÄ\†rÅ\hjƒ†rÆ\jj½†rÇ\jŒX''rÈ\†rÉ\hjA†rÊ\jj½†rË\hjʆrÌ\jj½†rÍ\jŒX'TRUE'rÎ\†rÏ\jj½†rÐ\hj±†rÑ\jj½†rÒ\jŒX'FALSE'rÓ\†rÔ\jj½†rÕ\jRX}}rÖ\†r×\hj!†rØ\jRX{{rÙ\†rÚ\jj½†rÛ\hj=†rÜ\hjA†rÝ\jj½†rÞ\jÃXinrß\†rà\jj½†rá\hj=†râ\jûXtruerã\†rä\hjƒ†rå\jj½†ræ\hj=†rç\hjA†rè\hjA†ré\jj½†rê\hjʆrë\jj½†rì\jŒX'TRUE'rí\†rî\jj½†rï\hj±†rð\jj½†rñ\jŒX'FALSE'rò\†ró\jj½†rô\jRX}}rõ\†rö\hj!†r÷\jRX{{rø\†rù\jj½†rú\hxX
dir_objectrû\†rü\jj½†rý\jÃXinrþ\†rÿ\jj½†r]jŒX'foo'r]†r]hj1†r]hxXdir_namer]†r]jj½†r]hjʆr]jj½†r]jŒX'TRUE'r	]†r
]jj½†r]hj±†r]jj½†r
]jŒX'FALSE'r]†r]jj½†r]jRX}}r]†r]hj!†r]jRX{{r]†r]jj½†r]jj†r]jj½†r]jÃXinr]†r]jj½†r]jj†r]jj††r]jj†r]jj½†r]hjʆr ]jj½†r!]jŒX'TRUE'r"]†r#]jj½†r$]hj±†r%]jj½†r&]jŒX'FALSE'r']†r(]jj½†r)]jRX}}r*]†r+]hXs
--DATA--
return array('bar' => 'bar', 'foo' => array('bar' => 'bar'), 'dir_name' => dirname(__FILE__), 'dir_object' => new SplFileInfo(dirname(__FILE__)))
--EXPECT--
TRUE
TRUE
TRUE
TRUE
TRUE
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
TRUE
FALSE
FALSE
--TEST--
Twig supports the in operator when using objects
--TEMPLATE--
r,]†r-]jRX{%r.]†r/]jj½†r0]jÃXifr1]†r2]jj½†r3]hxXobjectr4]†r5]jj½†r6]jÃXinr7]†r8]jj½†r9]hxXobject_listr:]†r;]jj½†r<]jRX%}r=]†r>]hX
TRUE
r?]†r@]jRX{%rA]†rB]jj½†rC]jÃXendifrD]†rE]jj½†rF]jRX%}rG]†rH]hXü
--DATA--
$foo = new TwigTestFoo();
$foo1 = new TwigTestFoo();

$foo->position = $foo1;
$foo1->position = $foo;

return array(
    'object'      => $foo,
    'object_list' => array($foo1, $foo),
);
--EXPECT--
TRUE
--TEST--
"iterable" test
--TEMPLATE--
rI]†rJ]jRX{{rK]†rL]jj½†rM]hxXfoorN]†rO]jj½†rP]jÃXisrQ]†rR]jj½†rS]jXiterablerT]†rU]jj½†rV]hjʆrW]jj½†rX]jŒX'ok'rY]†rZ]jj½†r[]hj±†r\]jj½†r]]jŒX'ko'r^]†r_]jj½†r`]jRX}}ra]†rb]hj!†rc]jRX{{rd]†re]jj½†rf]hxXtraversablerg]†rh]jj½†ri]jÃXisrj]†rk]jj½†rl]jXiterablerm]†rn]jj½†ro]hjʆrp]jj½†rq]jŒX'ok'rr]†rs]jj½†rt]hj±†ru]jj½†rv]jŒX'ko'rw]†rx]jj½†ry]jRX}}rz]†r{]hj!†r|]jRX{{r}]†r~]jj½†r]hxXobjr€]†r]jj½†r‚]jÃXisrƒ]†r„]jj½†r…]jXiterabler†]†r‡]jj½†rˆ]hjʆr‰]jj½†rŠ]jŒX'ok'r‹]†rŒ]jj½†r]hj±†rŽ]jj½†r]jŒX'ko'r]†r‘]jj½†r’]jRX}}r“]†r”]hj!†r•]jRX{{r–]†r—]jj½†r˜]hxXvalr™]†rš]jj½†r›]jÃXisrœ]†r]jj½†rž]jXiterablerŸ]†r ]jj½†r¡]hjʆr¢]jj½†r£]jŒX'ok'r¤]†r¥]jj½†r¦]hj±†r§]jj½†r¨]jŒX'ko'r©]†rª]jj½†r«]jRX}}r¬]†r­]hXË
--DATA--
return array(
    'foo' => array(),
    'traversable' => new ArrayIterator(array()),
    'obj' => new stdClass(),
    'val' => 'test',
);
--EXPECT--
ok
ok
ko
ko--TEST--
"odd" test
--TEMPLATE--
r®]†r¯]jRX{{r°]†r±]jj½†r²]jj†r³]jj½†r´]jÃXisrµ]†r¶]jj½†r·]jXoddr¸]†r¹]jj½†rº]hjʆr»]jj½†r¼]jŒX'ok'r½]†r¾]jj½†r¿]hj±†rÀ]jj½†rÁ]jŒX'ko'rÂ]†rÃ]jj½†rÄ]jRX}}rÅ]†rÆ]hj!†rÇ]jRX{{rÈ]†rÉ]jj½†rÊ]jj††rË]jj½†rÌ]jÃXisrÍ]†rÎ]jj½†rÏ]jXoddrÐ]†rÑ]jj½†rÒ]hjʆrÓ]jj½†rÔ]jŒX'ko'rÕ]†rÖ]jj½†r×]hj±†rØ]jj½†rÙ]jŒX'ok'rÚ]†rÛ]jj½†rÜ]jRX}}rÝ]†rÞ]hX*
--DATA--
return array()
--EXPECT--
ok
ok
rß]†rà]e.