瀏覽代碼

Add more tests, fix a bug with block tags.

Justin Hileman 3 年之前
父節點
當前提交
af4f8f7c0e
共有 2 個文件被更改,包括 120 次插入1 次删除
  1. 6 1
      src/Mustache/Parser.php
  2. 114 0
      test/Mustache/Test/Functional/DynamicPartialsTest.php

+ 6 - 1
src/Mustache/Parser.php

@@ -127,7 +127,11 @@ class Mustache_Parser
                         throw new Mustache_Exception_SyntaxException($msg, $token);
                     }
 
-                    if ($token[Mustache_Tokenizer::NAME] !== $parent[Mustache_Tokenizer::NAME]) {
+                    $sameName = $token[Mustache_Tokenizer::NAME] !== $parent[Mustache_Tokenizer::NAME];
+                    $tokenDynamic = isset($token[Mustache_Tokenizer::DYNAMIC]) && $token[Mustache_Tokenizer::DYNAMIC];
+                    $parentDynamic = isset($parent[Mustache_Tokenizer::DYNAMIC]) && $parent[Mustache_Tokenizer::DYNAMIC];
+
+                    if ($sameName || ($tokenDynamic !== $parentDynamic)) {
                         $msg = sprintf(
                             'Nesting error: %s (on line %d) vs. %s (on line %d)',
                             $parent[Mustache_Tokenizer::NAME],
@@ -330,6 +334,7 @@ class Mustache_Parser
         switch ($token[Mustache_Tokenizer::TYPE]) {
             case Mustache_Tokenizer::T_PARTIAL:
             case Mustache_Tokenizer::T_PARENT:
+            case Mustache_Tokenizer::T_END_SECTION:
                 return;
         }
 

+ 114 - 0
test/Mustache/Test/Functional/DynamicPartialsTest.php

@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of Mustache.php.
+ *
+ * (c) 2010-2017 Justin Hileman
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @group dynamic-names
+ * @group functional
+ */
+class Mustache_Test_Functional_DynamicPartialsTest extends PHPUnit_Framework_TestCase
+{
+    private $mustache;
+
+    public function setUp()
+    {
+        $this->mustache = new Mustache_Engine(array(
+            'pragmas' => array(Mustache_Engine::PRAGMA_DYNAMIC_NAMES),
+        ));
+    }
+
+    public function getInvalidDynamicNamesExamples()
+    {
+        return array(
+            array('{{> **foo}}'),
+            array('{{> *foo.*bar}}'),
+            array('{{> foo.*bar}}'),
+            array('{{ *foo }}'),
+            array('{{{ *foo }}}'),
+            array('{{& *foo }}'),
+            array('{{# *foo }}{{/ *foo }}'),
+            array('{{^ *foo }}{{/ *foo }}'),
+            array('{{% FILTERS}}{{> *foo | *bar}}'),
+            array('{{% FILTERS}}{{> foo | *bar}}'),
+            array('{{% BLOCKS }}{{$ *foo }}{{/ *foo }}'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidDynamicNamesExamples
+     * @expectedException Mustache_Exception_SyntaxException
+     * @expectedExceptionMessage Invalid dynamic name:
+     */
+    public function testInvalidDynamicNamesExamples($template)
+    {
+        $this->mustache->render($template);
+    }
+
+
+    public function getValidDynamicNamesExamples()
+    {
+      // technically not all dynamic names, but also not invalid
+        return array(
+            array('{{>* foo }}'),
+            array('{{>* foo.bar.baz }}'),
+            array('{{=* *=}}'),
+            array('{{! *foo }}'),
+            array('{{! foo.*bar }}'),
+            array('{{% FILTERS }}{{! foo | *bar }}'),
+            array('{{% BLOCKS }}{{< *foo }}{{/ *foo }}'),
+        );
+    }
+
+    /**
+     * @dataProvider getValidDynamicNamesExamples
+     */
+    public function testLegalInheritanceExamples($template)
+    {
+        $this->assertSame('', $this->mustache->render($template));
+    }
+
+    public function getDynamicNameParseErrors()
+    {
+        return array(
+            array('{{# foo }}{{/ *foo }}'),
+            array('{{^ foo }}{{/ *foo }}'),
+            array('{{% BLOCKS }}{{< foo }}{{/ *foo }}'),
+            array('{{% BLOCKS }}{{$ foo }}{{/ *foo }}'),
+        );
+    }
+
+    /**
+     * @dataProvider getDynamicNameParseErrors
+     * @expectedException Mustache_Exception_SyntaxException
+     * @expectedExceptionMessage Nesting error:
+     */
+    public function testDynamicNameParseErrors($template)
+    {
+        $this->mustache->render($template);
+    }
+
+
+    public function testDynamicBlocks()
+    {
+        $tpl = '{{% BLOCKS }}{{< *partial }}{{$ bar }}{{ value }}{{/ bar }}{{/ *partial }}';
+
+        $this->mustache->setPartials(array(
+            'foobarbaz' => '{{% BLOCKS }}{{$ foo }}foo{{/ foo }}{{$ bar }}bar{{/ bar }}{{$ baz }}baz{{/ baz }}',
+            'qux' => 'qux',
+        ));
+
+        $result = $this->mustache->render($tpl, array(
+            'partial' => 'foobarbaz',
+            'value' => 'BAR',
+        ));
+
+        $this->assertSame($result, 'fooBARbaz');
+    }
+}