fixed functions

This commit is contained in:
Martin Hason
2011-02-02 12:46:49 +01:00
committed by Fabien Potencier
parent a9127329fb
commit 46eb49e7e5
2 changed files with 100 additions and 2 deletions
+8 -2
View File
@@ -24,15 +24,21 @@ class Twig_Node_Expression_Function extends Twig_Node_Expression
$compiler
->raw($function->compile().'(')
->raw($function->needsEnvironment() ? '$this->env, ' : '')
->raw($function->needsContext() ? '$context, ' : '')
->raw($function->needsEnvironment() ? '$this->env' : '')
;
if ($function->needsContext()) {
$compiler->raw($function->needsEnvironment() ? ', $context' : '$context');
}
$first = true;
foreach ($this->getNode('arguments') as $node) {
if (!$first) {
$compiler->raw(', ');
} else {
if ($function->needsEnvironment() || $function->needsContext()) {
$compiler->raw(', ');
}
$first = false;
}
$compiler->subcompile($node);
@@ -0,0 +1,92 @@
<?php
/*
* This file is part of Twig.
*
* (c) Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once dirname(__FILE__).'/../TestCase.php';
class Twig_Tests_Node_Expression_FunctionTest extends Twig_Tests_Node_TestCase
{
/**
* @covers Twig_Node_Expression_Function::__construct
*/
public function testConstructor()
{
$name = new Twig_Node_Expression_Name('function', 0);
$args = new Twig_Node();
$node = new Twig_Node_Expression_Function($name, $args, 0);
$this->assertEquals($name, $node->getNode('name'));
$this->assertEquals($args, $node->getNode('arguments'));
}
/**
* @covers Twig_Node_Expression_Function::compile
* @dataProvider getTests
*/
public function testCompile($node, $source, $environment = null)
{
parent::testCompile($node, $source, $environment);
}
public function testUnknownFunction()
{
$node = $this->createFunction('unknown', array());
try {
$node->compile($this->getCompiler());
$this->fail();
} catch (Exception $e) {
$this->assertEquals('Twig_Error_Syntax', get_class($e));
}
}
public function getTests()
{
$environment = new Twig_Environment();
$environment->addFunction('foo', new Twig_Function_Function('foo', array()));
$environment->addFunction('bar', new Twig_Function_Function('bar', array('needs_environment' => true)));
$environment->addFunction('foofoo', new Twig_Function_Function('foofoo', array('needs_context' => true)));
$environment->addFunction('foobar', new Twig_Function_Function('foobar', array('needs_environment' => true, 'needs_context' => true)));
$tests = array();
$node = $this->createFunction('foo');
$tests[] = array($node, 'foo()', $environment);
$node = $this->createFunction('foo', array(new Twig_Node_Expression_Constant('bar', 0), new Twig_Node_Expression_Constant('foobar', 0)));
$tests[] = array($node, 'foo("bar", "foobar")', $environment);
$node = $this->createFunction('bar');
$tests[] = array($node, 'bar($this->env)', $environment);
$node = $this->createFunction('bar', array(new Twig_Node_Expression_Constant('bar', 0)));
$tests[] = array($node, 'bar($this->env, "bar")', $environment);
$node = $this->createFunction('foofoo');
$tests[] = array($node, 'foofoo($context)', $environment);
$node = $this->createFunction('foofoo', array(new Twig_Node_Expression_Constant('bar', 0)));
$tests[] = array($node, 'foofoo($context, "bar")', $environment);
$node = $this->createFunction('foobar');
$tests[] = array($node, 'foobar($this->env, $context)', $environment);
$node = $this->createFunction('foobar', array(new Twig_Node_Expression_Constant('bar', 0)));
$tests[] = array($node, 'foobar($this->env, $context, "bar")', $environment);
return $tests;
}
protected function createFunction($name, array $arguments = array())
{
$name = new Twig_Node_Expression_Name($name, 0);
$arguments = new Twig_Node($arguments);
return new Twig_Node_Expression_Function($name, $arguments, 0);
}
}