[OptionsParser] Added method replaceDefaults()

This commit is contained in:
Bernhard Schussek 2012-04-23 12:10:43 +02:00
parent b9d053edb2
commit 04522ca4ed
3 changed files with 50 additions and 6 deletions

View File

@ -72,6 +72,29 @@ class OptionsParser
}
}
/**
* Replaces default option values.
*
* Old defaults are erased, which means that closures passed here can't
* access the previous default value. This may be useful to improve
* performance if the previous default value is calculated by an expensive
* closure.
*
* @param array $options A list of option names as keys and default values
* as values. The option values may be closures
* of the following signature:
*
* - function (Options $options)
*/
public function replaceDefaults(array $defaultValues)
{
foreach ($defaultValues as $option => $value) {
unset($this->defaultOptions[$option]);
$this->defaultOptions[$option] = $value;
$this->knownOptions[$option] = true;
}
}
/**
* Sets optional options.
*

View File

@ -145,6 +145,27 @@ class OptionsParserTest extends \PHPUnit_Framework_TestCase
), $this->parser->parse($options));
}
public function testParseLazyReplaceDefaults()
{
$test = $this;
$this->parser->setDefaults(array(
'one' => function (Options $options) use ($test) {
$test->fail('Previous closure should not be executed');
},
));
$this->parser->replaceDefaults(array(
'one' => function (Options $options, $previousValue) {
return '1';
},
));
$this->assertEquals(array(
'one' => '1',
), $this->parser->parse(array()));
}
/**
* @expectedException Symfony\Component\OptionsParser\Exception\InvalidOptionsException
*/

View File

@ -80,7 +80,7 @@ class OptionsTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('dynamic', $this->options['foo']);
}
public function testLazyOptionWithEagerCurrentValue()
public function testLazyOptionWithEagerPreviousValue()
{
$test = $this;
@ -88,8 +88,8 @@ class OptionsTest extends \PHPUnit_Framework_TestCase
$this->options['foo'] = 'bar';
// defined by subclass
$this->options['foo'] = function (Options $options, $currentValue) use ($test) {
$test->assertEquals('bar', $currentValue);
$this->options['foo'] = function (Options $options, $previousValue) use ($test) {
$test->assertEquals('bar', $previousValue);
return 'dynamic';
};
@ -97,7 +97,7 @@ class OptionsTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('dynamic', $this->options['foo']);
}
public function testLazyOptionWithLazyCurrentValue()
public function testLazyOptionWithLazyPreviousValue()
{
$test = $this;
@ -107,8 +107,8 @@ class OptionsTest extends \PHPUnit_Framework_TestCase
};
// defined by subclass
$this->options['foo'] = function (Options $options, $currentValue) use ($test) {
$test->assertEquals('bar', $currentValue);
$this->options['foo'] = function (Options $options, $previousValue) use ($test) {
$test->assertEquals('bar', $previousValue);
return 'dynamic';
};