[Form] Fixed index checks in PropertyPath classes

This commit is contained in:
Bernhard Schussek 2012-05-20 16:35:47 +02:00
parent ea5ff77121
commit bbffd1b00b
7 changed files with 318 additions and 0 deletions

View File

@ -174,6 +174,10 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface
*/
public function getElement($index)
{
if (!isset($this->elements[$index])) {
throw new \OutOfBoundsException('The index ' . $index . ' is not within the violation path');
}
return $this->elements[$index];
}
@ -182,6 +186,10 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface
*/
public function isProperty($index)
{
if (!isset($this->isIndex[$index])) {
throw new \OutOfBoundsException('The index ' . $index . ' is not within the violation path');
}
return !$this->isIndex[$index];
}
@ -190,6 +198,10 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface
*/
public function isIndex($index)
{
if (!isset($this->isIndex[$index])) {
throw new \OutOfBoundsException('The index ' . $index . ' is not within the violation path');
}
return $this->isIndex[$index];
}
@ -208,9 +220,15 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface
* @param integer $index The element index.
*
* @return Boolean Whether the element maps to a form.
*
* @throws \OutOfBoundsException If the offset is invalid.
*/
public function mapsForm($index)
{
if (!isset($this->mapsForm[$index])) {
throw new \OutOfBoundsException('The index ' . $index . ' is not within the violation path');
}
return $this->mapsForm[$index];
}

View File

@ -130,4 +130,117 @@ class ViolationPathTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($parent, $path->getParent());
}
public function testGetElement()
{
$path = new ViolationPath('children[address].data[street].name');
$this->assertEquals('street', $path->getElement(1));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testGetElementDoesNotAcceptInvalidIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->getElement(3);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testGetElementDoesNotAcceptNegativeIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->getElement(-1);
}
public function testIsProperty()
{
$path = new ViolationPath('children[address].data[street].name');
$this->assertFalse($path->isProperty(1));
$this->assertTrue($path->isProperty(2));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsPropertyDoesNotAcceptInvalidIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->isProperty(3);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsPropertyDoesNotAcceptNegativeIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->isProperty(-1);
}
public function testIsIndex()
{
$path = new ViolationPath('children[address].data[street].name');
$this->assertTrue($path->isIndex(1));
$this->assertFalse($path->isIndex(2));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsIndexDoesNotAcceptInvalidIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->isIndex(3);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsIndexDoesNotAcceptNegativeIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->isIndex(-1);
}
public function testMapsForm()
{
$path = new ViolationPath('children[address].data[street].name');
$this->assertTrue($path->mapsForm(0));
$this->assertFalse($path->mapsForm(1));
$this->assertFalse($path->mapsForm(2));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testMapsFormDoesNotAcceptInvalidIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->mapsForm(3);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testMapsFormDoesNotAcceptNegativeIndices()
{
$path = new ViolationPath('children[address].data[street].name');
$path->mapsForm(-1);
}
}

View File

@ -100,6 +100,22 @@ class PropertyPathBuilderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($path, $this->builder->getPropertyPath());
}
/**
* @expectedException \OutOfBoundsException
*/
public function testReplaceByIndexDoesNotAllowInvalidOffsets()
{
$this->builder->replaceByIndex(6, 'new1');
}
/**
* @expectedException \OutOfBoundsException
*/
public function testReplaceByIndexDoesNotAllowNegativeOffsets()
{
$this->builder->replaceByIndex(-1, 'new1');
}
public function testReplaceByProperty()
{
$this->builder->replaceByProperty(1, 'new1');
@ -109,6 +125,22 @@ class PropertyPathBuilderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($path, $this->builder->getPropertyPath());
}
/**
* @expectedException \OutOfBoundsException
*/
public function testReplaceByPropertyDoesNotAllowInvalidOffsets()
{
$this->builder->replaceByProperty(6, 'new1');
}
/**
* @expectedException \OutOfBoundsException
*/
public function testReplaceByPropertyDoesNotAllowNegativeOffsets()
{
$this->builder->replaceByProperty(-1, 'new1');
}
public function testReplace()
{
$this->builder->replace(1, 1, new PropertyPath('new1[new2].new3'));
@ -118,6 +150,22 @@ class PropertyPathBuilderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($path, $this->builder->getPropertyPath());
}
/**
* @expectedException \OutOfBoundsException
*/
public function testReplaceDoesNotAllowInvalidOffsets()
{
$this->builder->replace(6, 1, new PropertyPath('new1[new2].new3'));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testReplaceDoesNotAllowNegativeOffsets()
{
$this->builder->replace(-1, 1, new PropertyPath('new1[new2].new3'));
}
public function testReplaceWithLengthGreaterOne()
{
$this->builder->replace(0, 2, new PropertyPath('new1[new2].new3'));
@ -153,4 +201,20 @@ class PropertyPathBuilderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($path, $this->builder->getPropertyPath());
}
/**
* @expectedException \OutOfBoundsException
*/
public function testRemoveDoesNotAllowInvalidOffsets()
{
$this->builder->remove(6);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testRemoveDoesNotAllowNegativeOffsets()
{
$this->builder->remove(-1);
}
}

View File

@ -497,4 +497,87 @@ class PropertyPathTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($propertyPath, $copy);
}
public function testGetElement()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$this->assertEquals('child', $propertyPath->getElement(2));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testGetElementDoesNotAcceptInvalidIndices()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$propertyPath->getElement(3);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testGetElementDoesNotAcceptNegativeIndices()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$propertyPath->getElement(-1);
}
public function testIsProperty()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$this->assertTrue($propertyPath->isProperty(1));
$this->assertFalse($propertyPath->isProperty(2));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsPropertyDoesNotAcceptInvalidIndices()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$propertyPath->isProperty(3);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsPropertyDoesNotAcceptNegativeIndices()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$propertyPath->isProperty(-1);
}
public function testIsIndex()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$this->assertFalse($propertyPath->isIndex(1));
$this->assertTrue($propertyPath->isIndex(2));
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsIndexDoesNotAcceptInvalidIndices()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$propertyPath->isIndex(3);
}
/**
* @expectedException \OutOfBoundsException
*/
public function testIsIndexDoesNotAcceptNegativeIndices()
{
$propertyPath = new PropertyPath('grandpa.parent[child]');
$propertyPath->isIndex(-1);
}
}

View File

@ -212,6 +212,10 @@ class PropertyPath implements \IteratorAggregate, PropertyPathInterface
*/
public function getElement($index)
{
if (!isset($this->elements[$index])) {
throw new \OutOfBoundsException('The index ' . $index . ' is not within the property path');
}
return $this->elements[$index];
}
@ -220,6 +224,10 @@ class PropertyPath implements \IteratorAggregate, PropertyPathInterface
*/
public function isProperty($index)
{
if (!isset($this->isIndex[$index])) {
throw new \OutOfBoundsException('The index ' . $index . ' is not within the property path');
}
return !$this->isIndex[$index];
}
@ -228,6 +236,10 @@ class PropertyPath implements \IteratorAggregate, PropertyPathInterface
*/
public function isIndex($index)
{
if (!isset($this->isIndex[$index])) {
throw new \OutOfBoundsException('The index ' . $index . ' is not within the property path');
}
return $this->isIndex[$index];
}

View File

@ -92,6 +92,10 @@ class PropertyPathBuilder
*/
public function remove($offset, $length = 1)
{
if (!isset($this->elements[$offset])) {
throw new \OutOfBoundsException('The offset ' . $offset . ' is not within the property path');
}
$this->resize($offset, $length, 0);
}
@ -105,9 +109,15 @@ class PropertyPathBuilder
* starts in $path.
* @param integer $pathLength The length of the inserted piece.
* If 0, the full path is inserted.
*
* @throws \OutOfBoundsException If the offset is invalid.
*/
public function replace($offset, $length, PropertyPathInterface $path, $pathOffset = 0, $pathLength = 0)
{
if (!isset($this->elements[$offset])) {
throw new \OutOfBoundsException('The offset ' . $offset . ' is not within the property path');
}
if (0 === $pathLength) {
$pathLength = $path->getLength() - $pathOffset;
}
@ -125,9 +135,15 @@ class PropertyPathBuilder
*
* @param integer $offset The offset at which to replace.
* @param string $name The inserted index name.
*
* @throws \OutOfBoundsException If the offset is invalid.
*/
public function replaceByIndex($offset, $name)
{
if (!isset($this->elements[$offset])) {
throw new \OutOfBoundsException('The offset ' . $offset . ' is not within the property path');
}
$this->elements[$offset] = $name;
$this->isIndex[$offset] = true;
}
@ -137,9 +153,15 @@ class PropertyPathBuilder
*
* @param integer $offset The offset at which to replace.
* @param string $name The inserted property name.
*
* @throws \OutOfBoundsException If the offset is invalid.
*/
public function replaceByProperty($offset, $name)
{
if (!isset($this->elements[$offset])) {
throw new \OutOfBoundsException('The offset ' . $offset . ' is not within the property path');
}
$this->elements[$offset] = $name;
$this->isIndex[$offset] = false;
}

View File

@ -63,6 +63,8 @@ interface PropertyPathInterface extends \Traversable
* @param integer $index The index key
*
* @return string A property or index name
*
* @throws \OutOfBoundsException If the offset is invalid.
*/
function getElement($index);
@ -72,6 +74,8 @@ interface PropertyPathInterface extends \Traversable
* @param integer $index The index in the property path
*
* @return Boolean Whether the element at this index is a property
*
* @throws \OutOfBoundsException If the offset is invalid.
*/
function isProperty($index);
@ -81,6 +85,8 @@ interface PropertyPathInterface extends \Traversable
* @param integer $index The index in the property path
*
* @return Boolean Whether the element at this index is an array index
*
* @throws \OutOfBoundsException If the offset is invalid.
*/
function isIndex($index);
}