| Viewing file:  OptionsTest.php (14.8 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?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 Symfony\Component\OptionsResolver\Options;
 
 class OptionsTest extends \PHPUnit_Framework_TestCase
 {
 /**
 * @var Options
 */
 private $options;
 
 protected function setUp()
 {
 $this->options = new Options();
 }
 
 public function testArrayAccess()
 {
 $this->assertFalse(isset($this->options['foo']));
 $this->assertFalse(isset($this->options['bar']));
 
 $this->options['foo'] = 0;
 $this->options['bar'] = 1;
 
 $this->assertTrue(isset($this->options['foo']));
 $this->assertTrue(isset($this->options['bar']));
 
 unset($this->options['bar']);
 
 $this->assertTrue(isset($this->options['foo']));
 $this->assertFalse(isset($this->options['bar']));
 $this->assertEquals(0, $this->options['foo']);
 }
 
 public function testCountable()
 {
 $this->options->set('foo', 0);
 $this->options->set('bar', 1);
 
 $this->assertCount(2, $this->options);
 }
 
 /**
 * @expectedException \OutOfBoundsException
 */
 public function testGetNonExisting()
 {
 $this->options->get('foo');
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testSetNotSupportedAfterGet()
 {
 $this->options->set('foo', 'bar');
 $this->options->get('foo');
 $this->options->set('foo', 'baz');
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testRemoveNotSupportedAfterGet()
 {
 $this->options->set('foo', 'bar');
 $this->options->get('foo');
 $this->options->remove('foo');
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testSetNormalizerNotSupportedAfterGet()
 {
 $this->options->set('foo', 'bar');
 $this->options->get('foo');
 $this->options->setNormalizer('foo', function () {});
 }
 
 public function testSetLazyOption()
 {
 $test = $this;
 
 $this->options->set('foo', function (Options $options) use ($test) {
 return 'dynamic';
 });
 
 $this->assertEquals('dynamic', $this->options->get('foo'));
 }
 
 public function testSetDiscardsPreviousValue()
 {
 $test = $this;
 
 // defined by superclass
 $this->options->set('foo', 'bar');
 
 // defined by subclass
 $this->options->set('foo', function (Options $options, $previousValue) use ($test) {
 /* @var \PHPUnit_Framework_TestCase $test */
 $test->assertNull($previousValue);
 
 return 'dynamic';
 });
 
 $this->assertEquals('dynamic', $this->options->get('foo'));
 }
 
 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 \PHPUnit_Framework_TestCase $test */
 $test->assertEquals('bar', $previousValue);
 
 return 'dynamic';
 });
 
 $this->assertEquals('dynamic', $this->options->get('foo'));
 }
 
 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 \PHPUnit_Framework_TestCase $test */
 $test->assertEquals('bar', $previousValue);
 
 return 'dynamic';
 });
 
 $this->assertEquals('dynamic', $this->options->get('foo'));
 }
 
 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('dynamic', $this->options->get('foo'));
 }
 
 public function testLazyOptionCanAccessOtherOptions()
 {
 $test = $this;
 
 $this->options->set('foo', 'bar');
 
 $this->options->set('bam', function (Options $options) use ($test) {
 /* @var \PHPUnit_Framework_TestCase $test */
 $test->assertEquals('bar', $options->get('foo'));
 
 return 'dynamic';
 });
 
 $this->assertEquals('bar', $this->options->get('foo'));
 $this->assertEquals('dynamic', $this->options->get('bam'));
 }
 
 public function testLazyOptionCanAccessOtherLazyOptions()
 {
 $test = $this;
 
 $this->options->set('foo', function (Options $options) {
 return 'bar';
 });
 
 $this->options->set('bam', function (Options $options) use ($test) {
 /* @var \PHPUnit_Framework_TestCase $test */
 $test->assertEquals('bar', $options->get('foo'));
 
 return 'dynamic';
 });
 
 $this->assertEquals('bar', $this->options->get('foo'));
 $this->assertEquals('dynamic', $this->options->get('bam'));
 }
 
 public function testNormalizer()
 {
 $this->options->set('foo', 'bar');
 
 $this->options->setNormalizer('foo', function () {
 return 'normalized';
 });
 
 $this->assertEquals('normalized', $this->options->get('foo'));
 }
 
 public function testNormalizerReceivesUnnormalizedValue()
 {
 $this->options->set('foo', 'bar');
 
 $this->options->setNormalizer('foo', function (Options $options, $value) {
 return 'normalized['.$value.']';
 });
 
 $this->assertEquals('normalized[bar]', $this->options->get('foo'));
 }
 
 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 \PHPUnit_Framework_TestCase $test */
 $test->assertEquals('bar', $options->get('foo'));
 
 return 'normalized';
 });
 
 $this->assertEquals('bar', $this->options->get('foo'));
 $this->assertEquals('normalized', $this->options->get('bam'));
 }
 
 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 \PHPUnit_Framework_TestCase $test */
 $test->assertEquals('bar', $options->get('foo'));
 
 return 'normalized';
 });
 
 $this->assertEquals('bar', $this->options->get('foo'));
 $this->assertEquals('normalized', $this->options->get('bam'));
 }
 
 /**
 * @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->get('foo');
 }
 
 /**
 * @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->get('foo');
 }
 
 /**
 * @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->get('foo');
 }
 
 public function testAllInvokesEachLazyOptionOnlyOnce()
 {
 $test = $this;
 $i = 1;
 
 $this->options->set('foo', function (Options $options) use ($test, &$i) {
 $test->assertSame(1, $i);
 ++$i;
 
 // Implicitly invoke lazy option for "bam"
 $options->get('bam');
 });
 $this->options->set('bam', function (Options $options) use ($test, &$i) {
 $test->assertSame(2, $i);
 ++$i;
 });
 
 $this->options->all();
 }
 
 public function testAllInvokesEachNormalizerOnlyOnce()
 {
 $test = $this;
 $i = 1;
 
 $this->options->set('foo', 'bar');
 $this->options->set('bam', 'baz');
 
 $this->options->setNormalizer('foo', function (Options $options) use ($test, &$i) {
 $test->assertSame(1, $i);
 ++$i;
 
 // Implicitly invoke normalizer for "bam"
 $options->get('bam');
 });
 $this->options->setNormalizer('bam', function (Options $options) use ($test, &$i) {
 $test->assertSame(2, $i);
 ++$i;
 });
 
 $this->options->all();
 }
 
 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->all());
 }
 
 public function testClearRemovesAllOptions()
 {
 $this->options->set('one', 1);
 $this->options->set('two', 2);
 
 $this->options->clear();
 
 $this->assertEmpty($this->options->all());
 
 }
 
 /**
 * @covers Symfony\Component\OptionsResolver\Options::replace
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testCannotReplaceAfterOptionWasRead()
 {
 $this->options->set('one', 1);
 $this->options->all();
 
 $this->options->replace(array(
 'two' => '2',
 ));
 }
 
 /**
 * @covers Symfony\Component\OptionsResolver\Options::overload
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testCannotOverloadAfterOptionWasRead()
 {
 $this->options->set('one', 1);
 $this->options->all();
 
 $this->options->overload('one', 2);
 }
 
 /**
 * @covers Symfony\Component\OptionsResolver\Options::clear
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testCannotClearAfterOptionWasRead()
 {
 $this->options->set('one', 1);
 $this->options->all();
 
 $this->options->clear();
 }
 
 public function testOverloadCannotBeEvaluatedLazilyWithoutExpectedClosureParams()
 {
 $this->options->set('foo', 'bar');
 
 $this->options->overload('foo', function () {
 return 'test';
 });
 
 $this->assertNotEquals('test', $this->options->get('foo'));
 $this->assertTrue(is_callable($this->options->get('foo')));
 }
 
 public function testOverloadCannotBeEvaluatedLazilyWithoutFirstParamTypeHint()
 {
 $this->options->set('foo', 'bar');
 
 $this->options->overload('foo', function ($object) {
 return 'test';
 });
 
 $this->assertNotEquals('test', $this->options->get('foo'));
 $this->assertTrue(is_callable($this->options->get('foo')));
 }
 
 public function testOptionsIteration()
 {
 $this->options->set('foo', 'bar');
 $this->options->set('foo1', 'bar1');
 $expectedResult = array('foo' => 'bar', 'foo1' => 'bar1');
 
 $this->assertEquals($expectedResult, iterator_to_array($this->options, true));
 }
 
 public function testHasWithNullValue()
 {
 $this->options->set('foo', null);
 
 $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());
 }
 
 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());
 }
 }
 
 |