4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Form\Tests\Extension\Validator\ViolationMapper
;
14 use Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationPath
;
17 * @author Bernhard Schussek <bschussek@gmail.com>
19 class ViolationPathTest
extends \PHPUnit_Framework_TestCase
21 public function providePaths()
24 array('children[address]', array(
25 array('address', true, true),
27 array('children[address].children[street]', array(
28 array('address', true, true),
29 array('street', true, true),
31 array('children[address][street]', array(
32 array('address', true, true),
33 ), 'children[address]'),
34 array('children[address].data', array(
35 array('address', true, true),
36 ), 'children[address]'),
37 array('children[address].data.street', array(
38 array('address', true, true),
39 array('street', false, false),
41 array('children[address].data[street]', array(
42 array('address', true, true),
43 array('street', false, true),
45 array('children[address].children[street].data.name', array(
46 array('address', true, true),
47 array('street', true, true),
48 array('name', false, false),
50 array('children[address].children[street].data[name]', array(
51 array('address', true, true),
52 array('street', true, true),
53 array('name', false, true),
55 array('data.address', array(
56 array('address', false, false),
58 array('data[address]', array(
59 array('address', false, true),
61 array('data.address.street', array(
62 array('address', false, false),
63 array('street', false, false),
65 array('data[address].street', array(
66 array('address', false, true),
67 array('street', false, false),
69 array('data.address[street]', array(
70 array('address', false, false),
71 array('street', false, true),
73 array('data[address][street]', array(
74 array('address', false, true),
75 array('street', false, true),
77 // A few invalid examples
78 array('data', array(), ''),
79 array('children', array(), ''),
80 array('children.address', array(), ''),
81 array('children.address[street]', array(), ''),
86 * @dataProvider providePaths
88 public function testCreatePath($string, $entries, $slicedPath = null)
90 if (null === $slicedPath) {
91 $slicedPath = $string;
94 $path = new ViolationPath($string);
96 $this->assertSame($slicedPath, $path->__toString());
97 $this->assertSame(count($entries), count($path->getElements()));
98 $this->assertSame(count($entries), $path->getLength());
100 foreach ($entries as $index => $entry) {
101 $this->assertEquals($entry[0], $path->getElement($index));
102 $this->assertSame($entry[1], $path->mapsForm($index));
103 $this->assertSame($entry[2], $path->isIndex($index));
104 $this->assertSame(!$entry[2], $path->isProperty($index));
108 public function provideParents()
111 array('children[address]', null),
112 array('children[address].children[street]', 'children[address]'),
113 array('children[address].data.street', 'children[address]'),
114 array('children[address].data[street]', 'children[address]'),
115 array('data.address', null),
116 array('data.address.street', 'data.address'),
117 array('data.address[street]', 'data.address'),
118 array('data[address].street', 'data[address]'),
119 array('data[address][street]', 'data[address]'),
124 * @dataProvider provideParents
126 public function testGetParent($violationPath, $parentPath)
128 $path = new ViolationPath($violationPath);
129 $parent = $parentPath === null ? null : new ViolationPath($parentPath);
131 $this->assertEquals($parent, $path->getParent());
134 public function testGetElement()
136 $path = new ViolationPath('children[address].data[street].name');
138 $this->assertEquals('street', $path->getElement(1));
142 * @expectedException \OutOfBoundsException
144 public function testGetElementDoesNotAcceptInvalidIndices()
146 $path = new ViolationPath('children[address].data[street].name');
148 $path->getElement(3);
152 * @expectedException \OutOfBoundsException
154 public function testGetElementDoesNotAcceptNegativeIndices()
156 $path = new ViolationPath('children[address].data[street].name');
158 $path->getElement(-1);
161 public function testIsProperty()
163 $path = new ViolationPath('children[address].data[street].name');
165 $this->assertFalse($path->isProperty(1));
166 $this->assertTrue($path->isProperty(2));
170 * @expectedException \OutOfBoundsException
172 public function testIsPropertyDoesNotAcceptInvalidIndices()
174 $path = new ViolationPath('children[address].data[street].name');
176 $path->isProperty(3);
180 * @expectedException \OutOfBoundsException
182 public function testIsPropertyDoesNotAcceptNegativeIndices()
184 $path = new ViolationPath('children[address].data[street].name');
186 $path->isProperty(-1);
189 public function testIsIndex()
191 $path = new ViolationPath('children[address].data[street].name');
193 $this->assertTrue($path->isIndex(1));
194 $this->assertFalse($path->isIndex(2));
198 * @expectedException \OutOfBoundsException
200 public function testIsIndexDoesNotAcceptInvalidIndices()
202 $path = new ViolationPath('children[address].data[street].name');
208 * @expectedException \OutOfBoundsException
210 public function testIsIndexDoesNotAcceptNegativeIndices()
212 $path = new ViolationPath('children[address].data[street].name');
217 public function testMapsForm()
219 $path = new ViolationPath('children[address].data[street].name');
221 $this->assertTrue($path->mapsForm(0));
222 $this->assertFalse($path->mapsForm(1));
223 $this->assertFalse($path->mapsForm(2));
227 * @expectedException \OutOfBoundsException
229 public function testMapsFormDoesNotAcceptInvalidIndices()
231 $path = new ViolationPath('children[address].data[street].name');
237 * @expectedException \OutOfBoundsException
239 public function testMapsFormDoesNotAcceptNegativeIndices()
241 $path = new ViolationPath('children[address].data[street].name');