[ExpressionLanguage] Registering functions after calling evaluate(), compile() or parse() is not supported

This commit is contained in:
Dany Maillard 2016-12-29 19:08:32 +01:00 committed by Fabien Potencier
parent b675d0518c
commit e305369f98
2 changed files with 61 additions and 0 deletions

View File

@ -110,10 +110,16 @@ class ExpressionLanguage
* @param callable $compiler A callable able to compile the function
* @param callable $evaluator A callable able to evaluate the function
*
* @throws \LogicException when registering a function after calling evaluate(), compile() or parse()
*
* @see ExpressionFunction
*/
public function register($name, $compiler, $evaluator)
{
if (null !== $this->parser) {
throw new \LogicException('Registering functions after calling evaluate(), compile() or parse() is not supported.');
}
$this->functions[$name] = array('compiler' => $compiler, 'evaluator' => $evaluator);
}

View File

@ -11,6 +11,7 @@
namespace Symfony\Component\ExpressionLanguage\Tests;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use PHPUnit\Framework\TestCase;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\ExpressionLanguage\Tests\Fixtures\TestProvider;
@ -139,4 +140,58 @@ class ExpressionLanguageTest extends TestCase
$expressionLanguage->compile($expression, array('a', 'B' => 'b'));
$expressionLanguage->compile($expression, array('B' => 'b', 'a'));
}
/**
* @dataProvider getRegisterCallbacks
* @expectedException \LogicException
*/
public function testRegisterAfterParse($registerCallback)
{
$el = new ExpressionLanguage();
$el->parse('1 + 1', array());
$registerCallback($el);
}
/**
* @dataProvider getRegisterCallbacks
* @expectedException \LogicException
*/
public function testRegisterAfterEval($registerCallback)
{
$el = new ExpressionLanguage();
$el->evaluate('1 + 1');
$registerCallback($el);
}
/**
* @dataProvider getRegisterCallbacks
* @expectedException \LogicException
*/
public function testRegisterAfterCompile($registerCallback)
{
$el = new ExpressionLanguage();
$el->compile('1 + 1');
$registerCallback($el);
}
public function getRegisterCallbacks()
{
return array(
array(
function (ExpressionLanguage $el) {
$el->register('fn', function () {}, function () {});
},
),
array(
function (ExpressionLanguage $el) {
$el->addFunction(new ExpressionFunction('fn', function () {}, function () {}));
},
),
array(
function (ExpressionLanguage $el) {
$el->registerProvider(new TestProvider());
},
),
);
}
}