| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\OptionsResolver\Tests;use PHPUnit\Framework\TestCase;use Symfony\Component\OptionsResolver\Options;use Symfony\Component\OptionsResolver\OptionsResolver;/** * @group legacy */class LegacyOptionsTest extends TestCase{    /**     * @var OptionsResolver     */    private $options;    protected function setUp()    {        $this->options = new OptionsResolver();    }    public function testSetLazyOption()    {        $test = $this;        $this->options->set('foo', function (Options $options) use ($test) {            return 'dynamic';        });        $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());    }    public function testOverloadKeepsPreviousValue()    {        $test = $this;        // defined by superclass        $this->options->set('foo', 'bar');        // defined by subclass        $this->options->overload('foo', function (Options $options, $previousValue) use ($test) {            /* @var TestCase $test */            $test->assertEquals('bar', $previousValue);            return 'dynamic';        });        $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());    }    public function testPreviousValueIsEvaluatedIfLazy()    {        $test = $this;        // defined by superclass        $this->options->set('foo', function (Options $options) {            return 'bar';        });        // defined by subclass        $this->options->overload('foo', function (Options $options, $previousValue) use ($test) {            /* @var TestCase $test */            $test->assertEquals('bar', $previousValue);            return 'dynamic';        });        $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());    }    public function testPreviousValueIsNotEvaluatedIfNoSecondArgument()    {        $test = $this;        // defined by superclass        $this->options->set('foo', function (Options $options) use ($test) {            $test->fail('Should not be called');        });        // defined by subclass, no $previousValue argument defined!        $this->options->overload('foo', function (Options $options) use ($test) {            return 'dynamic';        });        $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());    }    public function testLazyOptionCanAccessOtherOptions()    {        $test = $this;        $this->options->set('foo', 'bar');        $this->options->set('bam', function (Options $options) use ($test) {            /* @var TestCase $test */            $test->assertEquals('bar', $options->get('foo'));            return 'dynamic';        });        $this->assertEquals(array('foo' => 'bar', 'bam' => 'dynamic'), $this->options->resolve());    }    public function testLazyOptionCanAccessOtherLazyOptions()    {        $test = $this;        $this->options->set('foo', function (Options $options) {            return 'bar';        });        $this->options->set('bam', function (Options $options) use ($test) {            /* @var TestCase $test */            $test->assertEquals('bar', $options->get('foo'));            return 'dynamic';        });        $this->assertEquals(array('foo' => 'bar', 'bam' => 'dynamic'), $this->options->resolve());    }    public function testNormalizer()    {        $this->options->set('foo', 'bar');        $this->options->setNormalizer('foo', function () {            return 'normalized';        });        $this->assertEquals(array('foo' => 'normalized'), $this->options->resolve());    }    public function testNormalizerReceivesUnnormalizedValue()    {        $this->options->set('foo', 'bar');        $this->options->setNormalizer('foo', function (Options $options, $value) {            return 'normalized['.$value.']';        });        $this->assertEquals(array('foo' => 'normalized[bar]'), $this->options->resolve());    }    public function testNormalizerCanAccessOtherOptions()    {        $test = $this;        $this->options->set('foo', 'bar');        $this->options->set('bam', 'baz');        $this->options->setNormalizer('bam', function (Options $options) use ($test) {            /* @var TestCase $test */            $test->assertEquals('bar', $options->get('foo'));            return 'normalized';        });        $this->assertEquals(array('foo' => 'bar', 'bam' => 'normalized'), $this->options->resolve());    }    public function testNormalizerCanAccessOtherLazyOptions()    {        $test = $this;        $this->options->set('foo', function (Options $options) {            return 'bar';        });        $this->options->set('bam', 'baz');        $this->options->setNormalizer('bam', function (Options $options) use ($test) {            /* @var TestCase $test */            $test->assertEquals('bar', $options->get('foo'));            return 'normalized';        });        $this->assertEquals(array('foo' => 'bar', 'bam' => 'normalized'), $this->options->resolve());    }    /**     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException     */    public function testFailForCyclicDependencies()    {        $this->options->set('foo', function (Options $options) {            $options->get('bam');        });        $this->options->set('bam', function (Options $options) {            $options->get('foo');        });        $this->options->resolve();    }    /**     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException     */    public function testFailForCyclicDependenciesBetweenNormalizers()    {        $this->options->set('foo', 'bar');        $this->options->set('bam', 'baz');        $this->options->setNormalizer('foo', function (Options $options) {            $options->get('bam');        });        $this->options->setNormalizer('bam', function (Options $options) {            $options->get('foo');        });        $this->options->resolve();    }    /**     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException     */    public function testFailForCyclicDependenciesBetweenNormalizerAndLazyOption()    {        $this->options->set('foo', function (Options $options) {            $options->get('bam');        });        $this->options->set('bam', 'baz');        $this->options->setNormalizer('bam', function (Options $options) {            $options->get('foo');        });        $this->options->resolve();    }    public function testReplaceClearsAndSets()    {        $this->options->set('one', '1');        $this->options->replace(array(            'two' => '2',            'three' => function (Options $options) {                return '2' === $options['two'] ? '3' : 'foo';            },        ));        $this->assertEquals(array(            'two' => '2',            'three' => '3',        ), $this->options->resolve());    }    public function testClearRemovesAllOptions()    {        $this->options->set('one', 1);        $this->options->set('two', 2);        $this->options->clear();        $this->assertEmpty($this->options->resolve());    }    public function testOverloadCannotBeEvaluatedLazilyWithoutExpectedClosureParams()    {        $this->options->set('foo', 'bar');        $this->options->overload('foo', function () {            return 'test';        });        $resolved = $this->options->resolve();        $this->assertInternalType('callable', $resolved['foo']);    }    public function testOverloadCannotBeEvaluatedLazilyWithoutFirstParamTypeHint()    {        $this->options->set('foo', 'bar');        $this->options->overload('foo', function ($object) {            return 'test';        });        $resolved = $this->options->resolve();        $this->assertInternalType('callable', $resolved['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->resolve());    }    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->resolve());    }    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->resolve());    }}
 |