Add more tests, fix a bug with block tags.

This commit is contained in:
Justin Hileman
2022-08-23 09:11:52 -04:00
parent 53944831cf
commit af4f8f7c0e
2 changed files with 120 additions and 1 deletions
+6 -1
View File
@@ -127,7 +127,11 @@ class Mustache_Parser
throw new Mustache_Exception_SyntaxException($msg, $token); 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( $msg = sprintf(
'Nesting error: %s (on line %d) vs. %s (on line %d)', 'Nesting error: %s (on line %d) vs. %s (on line %d)',
$parent[Mustache_Tokenizer::NAME], $parent[Mustache_Tokenizer::NAME],
@@ -330,6 +334,7 @@ class Mustache_Parser
switch ($token[Mustache_Tokenizer::TYPE]) { switch ($token[Mustache_Tokenizer::TYPE]) {
case Mustache_Tokenizer::T_PARTIAL: case Mustache_Tokenizer::T_PARTIAL:
case Mustache_Tokenizer::T_PARENT: case Mustache_Tokenizer::T_PARENT:
case Mustache_Tokenizer::T_END_SECTION:
return; return;
} }
@@ -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');
}
}