| Viewing file:  OptionsResolverTest.php (16.39 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\OptionsResolver;
 use Symfony\Component\OptionsResolver\Options;
 
 class OptionsResolverTest extends \PHPUnit_Framework_TestCase
 {
 /**
 * @var OptionsResolver
 */
 private $resolver;
 
 protected function setUp()
 {
 $this->resolver = new OptionsResolver();
 }
 
 public function testResolve()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 'two' => '2',
 ));
 
 $options = array(
 'two' => '20',
 );
 
 $this->assertEquals(array(
 'one' => '1',
 'two' => '20',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveLazy()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 'two' => function (Options $options) {
 return '20';
 },
 ));
 
 $this->assertEquals(array(
 'one' => '1',
 'two' => '20',
 ), $this->resolver->resolve(array()));
 }
 
 public function testResolveLazyDependencyOnOptional()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 'two' => function (Options $options) {
 return $options['one'].'2';
 },
 ));
 
 $options = array(
 'one' => '10',
 );
 
 $this->assertEquals(array(
 'one' => '10',
 'two' => '102',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveLazyDependencyOnMissingOptionalWithoutDefault()
 {
 $test = $this;
 
 $this->resolver->setOptional(array(
 'one',
 ));
 
 $this->resolver->setDefaults(array(
 'two' => function (Options $options) use ($test) {
 /* @var \PHPUnit_Framework_TestCase $test */
 $test->assertFalse(isset($options['one']));
 
 return '2';
 },
 ));
 
 $options = array(
 );
 
 $this->assertEquals(array(
 'two' => '2',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveLazyDependencyOnOptionalWithoutDefault()
 {
 $test = $this;
 
 $this->resolver->setOptional(array(
 'one',
 ));
 
 $this->resolver->setDefaults(array(
 'two' => function (Options $options) use ($test) {
 /* @var \PHPUnit_Framework_TestCase $test */
 $test->assertTrue(isset($options['one']));
 
 return $options['one'].'2';
 },
 ));
 
 $options = array(
 'one' => '10',
 );
 
 $this->assertEquals(array(
 'one' => '10',
 'two' => '102',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveLazyDependencyOnRequired()
 {
 $this->resolver->setRequired(array(
 'one',
 ));
 $this->resolver->setDefaults(array(
 'two' => function (Options $options) {
 return $options['one'].'2';
 },
 ));
 
 $options = array(
 'one' => '10',
 );
 
 $this->assertEquals(array(
 'one' => '10',
 'two' => '102',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveLazyReplaceDefaults()
 {
 $test = $this;
 
 $this->resolver->setDefaults(array(
 'one' => function (Options $options) use ($test) {
 /* @var \PHPUnit_Framework_TestCase $test */
 $test->fail('Previous closure should not be executed');
 },
 ));
 
 $this->resolver->replaceDefaults(array(
 'one' => function (Options $options, $previousValue) {
 return '1';
 },
 ));
 
 $this->assertEquals(array(
 'one' => '1',
 ), $this->resolver->resolve(array()));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
 */
 public function testResolveFailsIfNonExistingOption()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setRequired(array(
 'two',
 ));
 
 $this->resolver->setOptional(array(
 'three',
 ));
 
 $this->resolver->resolve(array(
 'foo' => 'bar',
 ));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\MissingOptionsException
 */
 public function testResolveFailsIfMissingRequiredOption()
 {
 $this->resolver->setRequired(array(
 'one',
 ));
 
 $this->resolver->setDefaults(array(
 'two' => '2',
 ));
 
 $this->resolver->resolve(array(
 'two' => '20',
 ));
 }
 
 public function testResolveSucceedsIfOptionValueAllowed()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedValues(array(
 'one' => array('1', 'one'),
 ));
 
 $options = array(
 'one' => 'one',
 );
 
 $this->assertEquals(array(
 'one' => 'one',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveSucceedsIfOptionValueAllowed2()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 'two' => '2',
 ));
 
 $this->resolver->setAllowedValues(array(
 'one' => '1',
 'two' => '2',
 ));
 $this->resolver->addAllowedValues(array(
 'one' => 'one',
 'two' => 'two',
 ));
 
 $options = array(
 'one' => '1',
 'two' => 'two',
 );
 
 $this->assertEquals(array(
 'one' => '1',
 'two' => 'two',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveSucceedsIfOptionalWithAllowedValuesNotSet()
 {
 $this->resolver->setRequired(array(
 'one',
 ));
 
 $this->resolver->setOptional(array(
 'two',
 ));
 
 $this->resolver->setAllowedValues(array(
 'one' => array('1', 'one'),
 'two' => array('2', 'two'),
 ));
 
 $options = array(
 'one' => '1',
 );
 
 $this->assertEquals(array(
 'one' => '1',
 ), $this->resolver->resolve($options));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
 */
 public function testResolveFailsIfOptionValueNotAllowed()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedValues(array(
 'one' => array('1', 'one'),
 ));
 
 $this->resolver->resolve(array(
 'one' => '2',
 ));
 }
 
 public function testResolveSucceedsIfOptionTypeAllowed()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => 'string',
 ));
 
 $options = array(
 'one' => 'one',
 );
 
 $this->assertEquals(array(
 'one' => 'one',
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveSucceedsIfOptionTypeAllowedPassArray()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => array('string', 'bool'),
 ));
 
 $options = array(
 'one' => true,
 );
 
 $this->assertEquals(array(
 'one' => true,
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveSucceedsIfOptionTypeAllowedPassObject()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => 'object',
 ));
 
 $object = new \stdClass();
 $options = array(
 'one' => $object,
 );
 
 $this->assertEquals(array(
 'one' => $object,
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveSucceedsIfOptionTypeAllowedPassClass()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => '\stdClass',
 ));
 
 $object = new \stdClass();
 $options = array(
 'one' => $object,
 );
 
 $this->assertEquals(array(
 'one' => $object,
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveSucceedsIfOptionTypeAllowedAddTypes()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 'two' => '2',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => 'string',
 'two' => 'bool',
 ));
 $this->resolver->addAllowedTypes(array(
 'one' => 'float',
 'two' => 'integer',
 ));
 
 $options = array(
 'one' => 1.23,
 'two' => false,
 );
 
 $this->assertEquals(array(
 'one' => 1.23,
 'two' => false,
 ), $this->resolver->resolve($options));
 }
 
 public function testResolveSucceedsIfOptionalWithTypeAndWithoutValue()
 {
 $this->resolver->setOptional(array(
 'one',
 'two',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => 'string',
 'two' => 'int',
 ));
 
 $options = array(
 'two' => 1,
 );
 
 $this->assertEquals(array(
 'two' => 1,
 ), $this->resolver->resolve($options));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
 */
 public function testResolveFailsIfOptionTypeNotAllowed()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => array('string', 'bool'),
 ));
 
 $this->resolver->resolve(array(
 'one' => 1.23,
 ));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
 */
 public function testResolveFailsIfOptionTypeNotAllowedMultipleOptions()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 'two' => '2',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => 'string',
 'two' => 'bool',
 ));
 
 $this->resolver->resolve(array(
 'one' => 'foo',
 'two' => 1.23,
 ));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
 */
 public function testResolveFailsIfOptionTypeNotAllowedAddTypes()
 {
 $this->resolver->setDefaults(array(
 'one' => '1',
 ));
 
 $this->resolver->setAllowedTypes(array(
 'one' => 'string',
 ));
 $this->resolver->addAllowedTypes(array(
 'one' => 'bool',
 ));
 
 $this->resolver->resolve(array(
 'one' => 1.23,
 ));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testSetRequiredFailsIfDefaultIsPassed()
 {
 $this->resolver->setRequired(array(
 'one' => '1',
 ));
 }
 
 /**
 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
 */
 public function testSetOptionalFailsIfDefaultIsPassed()
 {
 $this->resolver->setOptional(array(
 'one' => '1',
 ));
 }
 
 public function testFluidInterface()
 {
 $this->resolver->setDefaults(array('one' => '1'))
 ->replaceDefaults(array('one' => '2'))
 ->setAllowedValues(array('one' => array('1', '2')))
 ->addAllowedValues(array('one' => array('3')))
 ->setRequired(array('two'))
 ->setOptional(array('three'));
 
 $options = array(
 'two' => '2',
 );
 
 $this->assertEquals(array(
 'one' => '2',
 'two' => '2',
 ), $this->resolver->resolve($options));
 }
 
 public function testKnownIfDefaultWasSet()
 {
 $this->assertFalse($this->resolver->isKnown('foo'));
 
 $this->resolver->setDefaults(array(
 'foo' => 'bar',
 ));
 
 $this->assertTrue($this->resolver->isKnown('foo'));
 }
 
 public function testKnownIfRequired()
 {
 $this->assertFalse($this->resolver->isKnown('foo'));
 
 $this->resolver->setRequired(array(
 'foo',
 ));
 
 $this->assertTrue($this->resolver->isKnown('foo'));
 }
 
 public function testKnownIfOptional()
 {
 $this->assertFalse($this->resolver->isKnown('foo'));
 
 $this->resolver->setOptional(array(
 'foo',
 ));
 
 $this->assertTrue($this->resolver->isKnown('foo'));
 }
 
 public function testRequiredIfRequired()
 {
 $this->assertFalse($this->resolver->isRequired('foo'));
 
 $this->resolver->setRequired(array(
 'foo',
 ));
 
 $this->assertTrue($this->resolver->isRequired('foo'));
 }
 
 public function testNotRequiredIfRequiredAndDefaultValue()
 {
 $this->assertFalse($this->resolver->isRequired('foo'));
 
 $this->resolver->setRequired(array(
 'foo',
 ));
 $this->resolver->setDefaults(array(
 'foo' => 'bar',
 ));
 
 $this->assertFalse($this->resolver->isRequired('foo'));
 }
 
 public function testNormalizersTransformFinalOptions()
 {
 $this->resolver->setDefaults(array(
 'foo' => 'bar',
 'bam' => 'baz',
 ));
 $this->resolver->setNormalizers(array(
 'foo' => function (Options $options, $value) {
 return $options['bam'].'['.$value.']';
 },
 ));
 
 $expected = array(
 'foo' => 'baz[bar]',
 'bam' => 'baz',
 );
 
 $this->assertEquals($expected, $this->resolver->resolve(array()));
 
 $expected = array(
 'foo' => 'boo[custom]',
 'bam' => 'boo',
 );
 
 $this->assertEquals($expected, $this->resolver->resolve(array(
 'foo' => 'custom',
 'bam' => 'boo',
 )));
 }
 
 public function testResolveWithoutOptionSucceedsIfRequiredAndDefaultValue()
 {
 $this->resolver->setRequired(array(
 'foo',
 ));
 $this->resolver->setDefaults(array(
 'foo' => 'bar',
 ));
 
 $this->assertEquals(array(
 'foo' => 'bar'
 ), $this->resolver->resolve(array()));
 }
 
 public function testResolveWithoutOptionSucceedsIfDefaultValueAndRequired()
 {
 $this->resolver->setDefaults(array(
 'foo' => 'bar',
 ));
 $this->resolver->setRequired(array(
 'foo',
 ));
 
 $this->assertEquals(array(
 'foo' => 'bar'
 ), $this->resolver->resolve(array()));
 }
 
 public function testResolveSucceedsIfOptionRequiredAndValueAllowed()
 {
 $this->resolver->setRequired(array(
 'one', 'two',
 ));
 $this->resolver->setAllowedValues(array(
 'two' => array('2'),
 ));
 
 $options = array(
 'one' => '1',
 'two' => '2'
 );
 
 $this->assertEquals($options, $this->resolver->resolve($options));
 }
 
 public function testClone()
 {
 $this->resolver->setDefaults(array('one' => '1'));
 
 $clone = clone $this->resolver;
 
 // Changes after cloning don't affect each other
 $this->resolver->setDefaults(array('two' => '2'));
 $clone->setDefaults(array('three' => '3'));
 
 $this->assertEquals(array(
 'one' => '1',
 'two' => '2',
 ), $this->resolver->resolve());
 
 $this->assertEquals(array(
 'one' => '1',
 'three' => '3',
 ), $clone->resolve());
 }
 }
 
 |