forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			220 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			220 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?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\Config\Tests\Definition;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use PHPUnit\Framework\TestCase;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\Config\Definition\ArrayNode;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\Config\Definition\ScalarNode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ArrayNodeTest extends TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidTypeException
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testNormalizeThrowsExceptionWhenFalseIsNotAllowed()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('root');
							 | 
						||
| 
								 | 
							
								        $node->normalize(false);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @expectedException        \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
							 | 
						||
| 
								 | 
							
								     * @expectedExceptionMessage Unrecognized option "foo" under "root"
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testExceptionThrownOnUnrecognizedChild()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('root');
							 | 
						||
| 
								 | 
							
								        $node->normalize(array('foo' => 'bar'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function ignoreAndRemoveMatrixProvider()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $unrecognizedOptionException = new InvalidConfigurationException('Unrecognized option "foo" under "root"');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return array(
							 | 
						||
| 
								 | 
							
								            array(true, true, array(), 'no exception is thrown for an unrecognized child if the ignoreExtraKeys option is set to true'),
							 | 
						||
| 
								 | 
							
								            array(true, false, array('foo' => 'bar'), 'extra keys are not removed when ignoreExtraKeys second option is set to false'),
							 | 
						||
| 
								 | 
							
								            array(false, true, $unrecognizedOptionException),
							 | 
						||
| 
								 | 
							
								            array(false, false, $unrecognizedOptionException),
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider ignoreAndRemoveMatrixProvider
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testIgnoreAndRemoveBehaviors($ignore, $remove, $expected, $message = '')
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($expected instanceof \Exception) {
							 | 
						||
| 
								 | 
							
								            if (method_exists($this, 'expectException')) {
							 | 
						||
| 
								 | 
							
								                $this->expectException(\get_class($expected));
							 | 
						||
| 
								 | 
							
								                $this->expectExceptionMessage($expected->getMessage());
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                $this->setExpectedException(\get_class($expected), $expected->getMessage());
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('root');
							 | 
						||
| 
								 | 
							
								        $node->setIgnoreExtraKeys($ignore, $remove);
							 | 
						||
| 
								 | 
							
								        $result = $node->normalize(array('foo' => 'bar'));
							 | 
						||
| 
								 | 
							
								        $this->assertSame($expected, $result, $message);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider getPreNormalizationTests
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testPreNormalize($denormalized, $normalized)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('foo');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $r = new \ReflectionMethod($node, 'preNormalize');
							 | 
						||
| 
								 | 
							
								        $r->setAccessible(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertSame($normalized, $r->invoke($node, $denormalized));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getPreNormalizationTests()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return array(
							 | 
						||
| 
								 | 
							
								            array(
							 | 
						||
| 
								 | 
							
								                array('foo-bar' => 'foo'),
							 | 
						||
| 
								 | 
							
								                array('foo_bar' => 'foo'),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								            array(
							 | 
						||
| 
								 | 
							
								                array('foo-bar_moo' => 'foo'),
							 | 
						||
| 
								 | 
							
								                array('foo-bar_moo' => 'foo'),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								            array(
							 | 
						||
| 
								 | 
							
								                array('anything-with-dash-and-no-underscore' => 'first', 'no_dash' => 'second'),
							 | 
						||
| 
								 | 
							
								                array('anything_with_dash_and_no_underscore' => 'first', 'no_dash' => 'second'),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								            array(
							 | 
						||
| 
								 | 
							
								                array('foo-bar' => null, 'foo_bar' => 'foo'),
							 | 
						||
| 
								 | 
							
								                array('foo-bar' => null, 'foo_bar' => 'foo'),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider getZeroNamedNodeExamplesData
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testNodeNameCanBeZero($denormalized, $normalized)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $zeroNode = new ArrayNode(0);
							 | 
						||
| 
								 | 
							
								        $zeroNode->addChild(new ScalarNode('name'));
							 | 
						||
| 
								 | 
							
								        $fiveNode = new ArrayNode(5);
							 | 
						||
| 
								 | 
							
								        $fiveNode->addChild(new ScalarNode(0));
							 | 
						||
| 
								 | 
							
								        $fiveNode->addChild(new ScalarNode('new_key'));
							 | 
						||
| 
								 | 
							
								        $rootNode = new ArrayNode('root');
							 | 
						||
| 
								 | 
							
								        $rootNode->addChild($zeroNode);
							 | 
						||
| 
								 | 
							
								        $rootNode->addChild($fiveNode);
							 | 
						||
| 
								 | 
							
								        $rootNode->addChild(new ScalarNode('string_key'));
							 | 
						||
| 
								 | 
							
								        $r = new \ReflectionMethod($rootNode, 'normalizeValue');
							 | 
						||
| 
								 | 
							
								        $r->setAccessible(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertSame($normalized, $r->invoke($rootNode, $denormalized));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getZeroNamedNodeExamplesData()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return array(
							 | 
						||
| 
								 | 
							
								            array(
							 | 
						||
| 
								 | 
							
								                array(
							 | 
						||
| 
								 | 
							
								                    0 => array(
							 | 
						||
| 
								 | 
							
								                        'name' => 'something',
							 | 
						||
| 
								 | 
							
								                    ),
							 | 
						||
| 
								 | 
							
								                    5 => array(
							 | 
						||
| 
								 | 
							
								                        0 => 'this won\'t work too',
							 | 
						||
| 
								 | 
							
								                        'new_key' => 'some other value',
							 | 
						||
| 
								 | 
							
								                    ),
							 | 
						||
| 
								 | 
							
								                    'string_key' => 'just value',
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								                array(
							 | 
						||
| 
								 | 
							
								                    0 => array(
							 | 
						||
| 
								 | 
							
								                        'name' => 'something',
							 | 
						||
| 
								 | 
							
								                    ),
							 | 
						||
| 
								 | 
							
								                    5 => array(
							 | 
						||
| 
								 | 
							
								                        0 => 'this won\'t work too',
							 | 
						||
| 
								 | 
							
								                        'new_key' => 'some other value',
							 | 
						||
| 
								 | 
							
								                    ),
							 | 
						||
| 
								 | 
							
								                    'string_key' => 'just value',
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider getPreNormalizedNormalizedOrderedData
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testChildrenOrderIsMaintainedOnNormalizeValue($prenormalized, $normalized)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $scalar1 = new ScalarNode('1');
							 | 
						||
| 
								 | 
							
								        $scalar2 = new ScalarNode('2');
							 | 
						||
| 
								 | 
							
								        $scalar3 = new ScalarNode('3');
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('foo');
							 | 
						||
| 
								 | 
							
								        $node->addChild($scalar1);
							 | 
						||
| 
								 | 
							
								        $node->addChild($scalar3);
							 | 
						||
| 
								 | 
							
								        $node->addChild($scalar2);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $r = new \ReflectionMethod($node, 'normalizeValue');
							 | 
						||
| 
								 | 
							
								        $r->setAccessible(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertSame($normalized, $r->invoke($node, $prenormalized));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getPreNormalizedNormalizedOrderedData()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return array(
							 | 
						||
| 
								 | 
							
								            array(
							 | 
						||
| 
								 | 
							
								                array('2' => 'two', '1' => 'one', '3' => 'three'),
							 | 
						||
| 
								 | 
							
								                array('2' => 'two', '1' => 'one', '3' => 'three'),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @expectedException \InvalidArgumentException
							 | 
						||
| 
								 | 
							
								     * @expectedExceptionMessage Child nodes must be named.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testAddChildEmptyName()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('root');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $childNode = new ArrayNode('');
							 | 
						||
| 
								 | 
							
								        $node->addChild($childNode);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @expectedException \InvalidArgumentException
							 | 
						||
| 
								 | 
							
								     * @expectedExceptionMessage A child node named "foo" already exists.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testAddChildNameAlreadyExists()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('root');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $childNode = new ArrayNode('foo');
							 | 
						||
| 
								 | 
							
								        $node->addChild($childNode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $childNodeWithSameName = new ArrayNode('foo');
							 | 
						||
| 
								 | 
							
								        $node->addChild($childNodeWithSameName);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @expectedException \RuntimeException
							 | 
						||
| 
								 | 
							
								     * @expectedExceptionMessage The node at path "foo" has no default value.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testGetDefaultValueWithoutDefaultValue()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $node = new ArrayNode('foo');
							 | 
						||
| 
								 | 
							
								        $node->getDefaultValue();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |