add a unit test for previous merge
authorFabien Potencier <fabien.potencier@gmail.com>
Tue, 24 Jan 2012 18:09:28 +0000 (19:09 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Tue, 24 Jan 2012 18:09:28 +0000 (19:09 +0100)
test/Twig/Tests/ParserTest.php

index 147a278..76f257a 100644 (file)
@@ -92,6 +92,29 @@ class Twig_Tests_ParserTest extends PHPUnit_Framework_TestCase
         $parser->filterBodyNodes(new Twig_Node_Text(chr(0xEF).chr(0xBB).chr(0xBF), 0));
     }
 
+    public function testParseIsReentrant()
+    {
+        $twig = new Twig_Environment(null, array(
+            'autoescape' => false,
+            'optimizations' => 0,
+        ));
+        $twig->addTokenParser(new TestTokenParser());
+
+        $parser = new Twig_Parser($twig);
+
+        $parser->parse(new Twig_TokenStream(array(
+            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 0),
+            new Twig_Token(Twig_Token::NAME_TYPE, 'test', 0),
+            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 0),
+            new Twig_Token(Twig_Token::VAR_START_TYPE, '', 0),
+            new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 0),
+            new Twig_Token(Twig_Token::VAR_END_TYPE, '', 0),
+            new Twig_Token(Twig_Token::EOF_TYPE, '', 0),
+        )));
+
+        $this->assertEquals(null, $parser->getParent());
+    }
+
     protected function getParserForFilterBodyNodes()
     {
         $parser = new TestParser(new Twig_Environment());
@@ -111,3 +134,27 @@ class TestParser extends Twig_Parser
         return parent::filterBodyNodes($node);
     }
 }
+
+class TestTokenParser extends Twig_TokenParser
+{
+    public function parse(Twig_Token $token)
+    {
+        // simulate the parsing of another template right in the middle of the parsing of the current template
+        $this->parser->parse(new Twig_TokenStream(array(
+            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 0),
+            new Twig_Token(Twig_Token::NAME_TYPE, 'extends', 0),
+            new Twig_Token(Twig_Token::STRING_TYPE, 'base', 0),
+            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 0),
+            new Twig_Token(Twig_Token::EOF_TYPE, '', 0),
+        )));
+
+        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+
+        return new Twig_Node(array());
+    }
+
+    public function getTag()
+    {
+        return 'test';
+    }
+}