[Form][Validator] All index items after children are to be considered grand-children when resolving ViolationPath (fixes #11458)

This commit is contained in:
Andrew Moore 2014-07-23 22:02:17 -04:00
parent 4dbe0e1c34
commit c64a75f7bb
3 changed files with 21 additions and 12 deletions

View File

@ -70,9 +70,17 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface
break;
}
$this->elements[] = $elements[$i];
$this->isIndex[] = true;
$this->mapsForm[] = true;
// All the following index items (regardless if .children is
// explicitly used) are children and grand-children
for (; $i < $l && $path->isIndex($i); ++$i) {
$this->elements[] = $elements[$i];
$this->isIndex[] = true;
$this->mapsForm[] = true;
}
// Rewind the pointer as the last element above didn't match
// (even if the pointer was moved forward)
--$i;
} elseif ('data' === $elements[$i] && $path->isProperty($i)) {
// Skip element "data"
++$i;

View File

@ -712,14 +712,14 @@ class ViolationMapperTest extends \PHPUnit_Framework_TestCase
array(self::LEVEL_2, 'address', '[address]', 'street', '[office][street]', 'data[address][office][street].prop'),
// Edge cases which must not occur
array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address][street]'),
array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address][street].prop'),
array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'children[address][street]'),
array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'children[address][street].prop'),
array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'children[address][street]'),
array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'children[address][street].prop'),
array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'children[address][street]'),
array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'children[address][street].prop'),
array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address][street]'),
array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address][street].prop'),
array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'children[address][street]'),
array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'children[address][street].prop'),
array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'children[address][street]'),
array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'children[address][street].prop'),
array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'children[address][street]'),
array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'children[address][street].prop'),
array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'children[person].children[address].children[street]'),
array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'children[person].children[address].data.street'),

View File

@ -30,7 +30,8 @@ class ViolationPathTest extends \PHPUnit_Framework_TestCase
)),
array('children[address][street]', array(
array('address', true, true),
), 'children[address]'),
array('street', true, true),
), 'children[address].children[street]'),
array('children[address].data', array(
array('address', true, true),
), 'children[address]'),