From 5a53821ca34ea3f71c74be9985a24467bcdc77a6 Mon Sep 17 00:00:00 2001 From: Tobias Schultze Date: Sun, 29 Jul 2012 18:01:50 +0300 Subject: [PATCH 1/2] [OptionsResolver] fix removing normalizers --- .../Component/OptionsResolver/Options.php | 1 + .../OptionsResolver/Tests/OptionsTest.php | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/Symfony/Component/OptionsResolver/Options.php b/src/Symfony/Component/OptionsResolver/Options.php index ef10a19427..5a2b0f7f38 100644 --- a/src/Symfony/Component/OptionsResolver/Options.php +++ b/src/Symfony/Component/OptionsResolver/Options.php @@ -143,6 +143,7 @@ class Options implements \ArrayAccess, \Iterator, \Countable $this->options = array(); $this->lazy = array(); + $this->normalizers = array(); foreach ($options as $option => $value) { $this->overload($option, $value); diff --git a/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php b/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php index e151051611..66f9e399a4 100644 --- a/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php +++ b/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php @@ -469,4 +469,49 @@ class OptionsTest extends \PHPUnit_Framework_TestCase $this->assertTrue($this->options->has('foo')); } + + public function testRemoveOptionAndNormalizer() + { + $this->options->set('foo1', 'bar'); + $this->options->setNormalizer('foo1', function (Options $options) { + return ''; + }); + $this->options->set('foo2', 'bar'); + $this->options->setNormalizer('foo2', function (Options $options) { + return ''; + }); + + $this->options->remove('foo2'); + $this->assertEquals(array('foo1' => ''), $this->options->all()); + } + + public function testReplaceOptionAndNormalizer() + { + $this->options->set('foo1', 'bar'); + $this->options->setNormalizer('foo1', function (Options $options) { + return ''; + }); + $this->options->set('foo2', 'bar'); + $this->options->setNormalizer('foo2', function (Options $options) { + return ''; + }); + + $this->options->replace(array('foo1' => 'new')); + $this->assertEquals(array('foo1' => 'new'), $this->options->all()); + } + + public function testClearOptionAndNormalizer() + { + $this->options->set('foo1', 'bar'); + $this->options->setNormalizer('foo1', function (Options $options) { + return ''; + }); + $this->options->set('foo2', 'bar'); + $this->options->setNormalizer('foo2', function (Options $options) { + return ''; + }); + + $this->options->clear(); + $this->assertEmpty($this->options->all()); + } } From e2a50ef4bc05c0c719d00d1cbbf680a3e8c1bb4a Mon Sep 17 00:00:00 2001 From: Tobias Schultze Date: Mon, 30 Jul 2012 23:35:43 +0200 Subject: [PATCH 2/2] [OptionsResolver] fix normalizer without corresponding option --- src/Symfony/Component/OptionsResolver/Options.php | 2 +- .../Component/OptionsResolver/Tests/OptionsTest.php | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/OptionsResolver/Options.php b/src/Symfony/Component/OptionsResolver/Options.php index 5a2b0f7f38..3c1129c921 100644 --- a/src/Symfony/Component/OptionsResolver/Options.php +++ b/src/Symfony/Component/OptionsResolver/Options.php @@ -504,7 +504,7 @@ class Options implements \ArrayAccess, \Iterator, \Countable $normalizer = $this->normalizers[$option]; $this->lock[$option] = true; - $this->options[$option] = $normalizer($this, $this->options[$option]); + $this->options[$option] = $normalizer($this, array_key_exists($option, $this->options) ? $this->options[$option] : null); unset($this->lock[$option]); // The option is now normalized diff --git a/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php b/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php index 66f9e399a4..f739c911a1 100644 --- a/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php +++ b/src/Symfony/Component/OptionsResolver/Tests/OptionsTest.php @@ -514,4 +514,15 @@ class OptionsTest extends \PHPUnit_Framework_TestCase $this->options->clear(); $this->assertEmpty($this->options->all()); } + + public function testNormalizerWithoutCorrespondingOption() + { + $test = $this; + + $this->options->setNormalizer('foo', function (Options $options, $previousValue) use ($test) { + $test->assertNull($previousValue); + return ''; + }); + $this->assertEquals(array('foo' => ''), $this->options->all()); + } }