Skip to content

Commit

Permalink
[DependencyInjection] Being sure to remove XML-remapped singular opti…
Browse files Browse the repository at this point in the history
…ons and key attribute options after processing.

This prevents these keys from being validated as extra fields.
  • Loading branch information
weaverryan committed Feb 18, 2011
1 parent bd15ddd commit fd5cdfc
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/Symfony/Component/Config/Definition/ArrayNode.php
Expand Up @@ -358,6 +358,7 @@ protected function normalizeValue($value)
}

$value[$plural] = Extension::normalizeConfig($value, $singular, $plural);
unset($value[$singular]);
}

if (null !== $this->prototype) {
Expand All @@ -372,6 +373,7 @@ protected function normalizeValue($value)
));
} else if (isset($v[$this->keyAttribute])) {
$k = $v[$this->keyAttribute];
unset($v[$this->keyAttribute]);
}

if (array_key_exists($k, $normalized)) {
Expand Down
Expand Up @@ -3,6 +3,7 @@
namespace Symfony\Tests\Component\Config\Definition;

use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\ScalarNode;

class ArrayNodeTest extends \PHPUnit_Framework_TestCase
{
Expand Down Expand Up @@ -78,4 +79,52 @@ public function testNormalizeKeepsExtraArrayValues()
$normalized = $node->normalize(array('foo' => 'bar'));
$this->assertEquals(array('foo' => 'bar'), $normalized);
}
}

// a remapped key (e.g. "mapping" -> "mappings") should be unset after being used
public function testRemappedKeysAreUnset()
{
$node = new ArrayNode('root');

$remappings = array();
$remappings[] = array('mapping', 'mappings');
$node->setXmlRemappings($remappings);

$normalized = $node->normalize(array('mapping' => array('foo', 'bar')));
$this->assertEquals(array('mappings' => array('foo', 'bar')), $normalized);
}

/**
* Tests that when a key attribute is mapped, that key is removed from the array:
*
* <things>
* <option id="option1" value="foo">
* <option id="option2" value="bar">
* </things>
*
* The above should finally be mapped to an array that looks like this
* (because "id" is the key attribute).
*
* array(
* 'things' => array(
* 'option1' => 'foo',
* 'option2' => 'bar',
* )
* )
*/
public function testMappedAttributeKeyIsRemoved()
{
$node = new ArrayNode('root');
$node->setKeyAttribute('id');

$prototype = new ArrayNode(null);
$node->setPrototype($prototype);

$children = array();
$children[] = array('id' => 'item_name', 'foo' => 'bar');
$normalized = $node->normalize($children);

$expected = array();
$expected['item_name'] = array('foo' => 'bar');
$this->assertEquals($expected, $normalized);
}
}

0 comments on commit fd5cdfc

Please sign in to comment.