render('test'); } public function testAutoescapeOption() { $loader = new Twig_Loader_Array(array( 'html' => '{{ foo }} {{ foo }}', 'js' => '{{ bar }} {{ bar }}', )); $twig = new Twig_Environment($loader, array( 'debug' => true, 'cache' => false, 'autoescape' => array($this, 'escapingStrategyCallback'), )); $this->assertEquals('foo<br/ > foo<br/ >', $twig->render('html', array('foo' => 'foo
'))); $this->assertEquals('foo\x3Cbr\x2F\x20\x3E foo\x3Cbr\x2F\x20\x3E', $twig->render('js', array('bar' => 'foo
'))); } public function escapingStrategyCallback($filename) { return $filename; } public function testGlobals() { // globals can be added after calling getGlobals $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addGlobal('foo', 'foo'); $globals = $twig->getGlobals(); $twig->addGlobal('foo', 'bar'); $globals = $twig->getGlobals(); $this->assertEquals('bar', $globals['foo']); // globals can be modified after runtime init $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addGlobal('foo', 'foo'); $globals = $twig->getGlobals(); $twig->initRuntime(); $twig->addGlobal('foo', 'bar'); $globals = $twig->getGlobals(); $this->assertEquals('bar', $globals['foo']); // globals can be modified after extensions init $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addGlobal('foo', 'foo'); $globals = $twig->getGlobals(); $twig->getFunctions(); $twig->addGlobal('foo', 'bar'); $globals = $twig->getGlobals(); $this->assertEquals('bar', $globals['foo']); // globals can be modified after extensions and runtime init $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addGlobal('foo', 'foo'); $globals = $twig->getGlobals(); $twig->getFunctions(); $twig->initRuntime(); $twig->addGlobal('foo', 'bar'); $globals = $twig->getGlobals(); $this->assertEquals('bar', $globals['foo']); $twig = new Twig_Environment(new Twig_Loader_String()); $twig->getGlobals(); $twig->addGlobal('foo', 'bar'); $template = $twig->loadTemplate('{{foo}}'); $this->assertEquals('bar', $template->render(array())); /* to be uncomment in Twig 2.0 // globals cannot be added after runtime init $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addGlobal('foo', 'foo'); $globals = $twig->getGlobals(); $twig->initRuntime(); try { $twig->addGlobal('bar', 'bar'); $this->fail(); } catch (LogicException $e) { $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); } // globals cannot be added after extensions init $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addGlobal('foo', 'foo'); $globals = $twig->getGlobals(); $twig->getFunctions(); try { $twig->addGlobal('bar', 'bar'); $this->fail(); } catch (LogicException $e) { $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); } // globals cannot be added after extensions and runtime init $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addGlobal('foo', 'foo'); $globals = $twig->getGlobals(); $twig->getFunctions(); $twig->initRuntime(); try { $twig->addGlobal('bar', 'bar'); $this->fail(); } catch (LogicException $e) { $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); } // test adding globals after initRuntime without call to getGlobals $twig = new Twig_Environment(new Twig_Loader_String()); $twig->initRuntime(); try { $twig->addGlobal('bar', 'bar'); $this->fail(); } catch (LogicException $e) { $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); } */ } public function testExtensionsAreNotInitializedWhenRenderingACompiledTemplate() { $options = array('cache' => sys_get_temp_dir().'/twig', 'auto_reload' => false, 'debug' => false); // force compilation $twig = new Twig_Environment(new Twig_Loader_String(), $options); $cache = $twig->getCacheFilename('{{ foo }}'); if (!is_dir(dirname($cache))) { mkdir(dirname($cache), 0777, true); } file_put_contents($cache, $twig->compileSource('{{ foo }}', '{{ foo }}')); // check that extensions won't be initialized when rendering a template that is already in the cache $twig = $this ->getMockBuilder('Twig_Environment') ->setConstructorArgs(array(new Twig_Loader_String(), $options)) ->setMethods(array('initExtensions')) ->getMock() ; $twig->expects($this->never())->method('initExtensions'); // render template $output = $twig->render('{{ foo }}', array('foo' => 'bar')); $this->assertEquals('bar', $output); unlink($cache); } public function testAddExtension() { $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension()); $this->assertArrayHasKey('test', $twig->getTags()); $this->assertArrayHasKey('foo_filter', $twig->getFilters()); $this->assertArrayHasKey('foo_function', $twig->getFunctions()); $this->assertArrayHasKey('foo_test', $twig->getTests()); $this->assertArrayHasKey('foo_unary', $twig->getUnaryOperators()); $this->assertArrayHasKey('foo_binary', $twig->getBinaryOperators()); $this->assertArrayHasKey('foo_global', $twig->getGlobals()); $visitors = $twig->getNodeVisitors(); $this->assertEquals('Twig_Tests_EnvironmentTest_NodeVisitor', get_class($visitors[2])); } public function testRemoveExtension() { $twig = new Twig_Environment(new Twig_Loader_String()); $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension()); $twig->removeExtension('environment_test'); $this->assertFalse(array_key_exists('test', $twig->getTags())); $this->assertFalse(array_key_exists('foo_filter', $twig->getFilters())); $this->assertFalse(array_key_exists('foo_function', $twig->getFunctions())); $this->assertFalse(array_key_exists('foo_test', $twig->getTests())); $this->assertFalse(array_key_exists('foo_unary', $twig->getUnaryOperators())); $this->assertFalse(array_key_exists('foo_binary', $twig->getBinaryOperators())); $this->assertFalse(array_key_exists('foo_global', $twig->getGlobals())); $this->assertCount(2, $twig->getNodeVisitors()); } } class Twig_Tests_EnvironmentTest_Extension extends Twig_Extension { public function getTokenParsers() { return array( new Twig_Tests_EnvironmentTest_TokenParser(), ); } public function getNodeVisitors() { return array( new Twig_Tests_EnvironmentTest_NodeVisitor(), ); } public function getFilters() { return array( 'foo_filter' => new Twig_Filter_Function('foo_filter'), ); } public function getTests() { return array( 'foo_test' => new Twig_Test_Function('foo_test'), ); } public function getFunctions() { return array( 'foo_function' => new Twig_Function_Function('foo_function'), ); } public function getOperators() { return array( array('foo_unary' => array()), array('foo_binary' => array()), ); } public function getGlobals() { return array( 'foo_global' => 'foo_global', ); } public function getName() { return 'environment_test'; } } class Twig_Tests_EnvironmentTest_TokenParser extends Twig_TokenParser { public function parse(Twig_Token $token) { } public function getTag() { return 'test'; } } class Twig_Tests_EnvironmentTest_NodeVisitor implements Twig_NodeVisitorInterface { public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) { return $node; } public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env) { return $node; } public function getPriority() { return 0; } }