feature#9148 [PropertyAccessor] Throw exception on nonexistant "index" on read access (fabpot)
This PR was merged into the master branch.
Discussion
----------
[PropertyAccessor] Throw exception on nonexistant "index" on read access
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | a kind of?
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | 7881
| License | MIT
| Doc PR |
See discussion on issue #7881.
Commits
-------
e73742a
[PropertyAccess] Throw exception on nonexistant "index" on read access
This commit is contained in:
commit
96c5659028
@ -0,0 +1,21 @@
|
|||||||
|
<?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\PropertyAccess\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown when a property path is not available.
|
||||||
|
*
|
||||||
|
* @author Stéphane Escandell <stephane.escandell@gmail.com>
|
||||||
|
*/
|
||||||
|
class AccessException extends RuntimeException
|
||||||
|
{
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
<?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\PropertyAccess\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown when an index cannot be found.
|
||||||
|
*
|
||||||
|
* @author Stéphane Escandell <stephane.escandell@gmail.com>
|
||||||
|
*/
|
||||||
|
class NoSuchIndexException extends AccessException
|
||||||
|
{
|
||||||
|
}
|
@ -16,6 +16,6 @@ namespace Symfony\Component\PropertyAccess\Exception;
|
|||||||
*
|
*
|
||||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
*/
|
*/
|
||||||
class NoSuchPropertyException extends RuntimeException
|
class NoSuchPropertyException extends AccessException
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\PropertyAccess;
|
namespace Symfony\Component\PropertyAccess;
|
||||||
|
|
||||||
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
|
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
|
||||||
|
use Symfony\Component\PropertyAccess\Exception\NoSuchIndexException;
|
||||||
use Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException;
|
use Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -24,15 +25,24 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||||||
const VALUE = 0;
|
const VALUE = 0;
|
||||||
const IS_REF = 1;
|
const IS_REF = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Boolean
|
||||||
|
*/
|
||||||
private $magicCall;
|
private $magicCall;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Boolean
|
||||||
|
*/
|
||||||
|
private $throwExceptionOnInvalidIndex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should not be used by application code. Use
|
* Should not be used by application code. Use
|
||||||
* {@link PropertyAccess::createPropertyAccessor()} instead.
|
* {@link PropertyAccess::createPropertyAccessor()} instead.
|
||||||
*/
|
*/
|
||||||
public function __construct($magicCall = false)
|
public function __construct($magicCall = false, $throwExceptionOnInvalidIndex = false)
|
||||||
{
|
{
|
||||||
$this->magicCall = $magicCall;
|
$this->magicCall = $magicCall;
|
||||||
|
$this->throwExceptionOnInvalidIndex = $throwExceptionOnInvalidIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,7 +56,7 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||||||
throw new UnexpectedTypeException($propertyPath, 'string or Symfony\Component\PropertyAccess\PropertyPathInterface');
|
throw new UnexpectedTypeException($propertyPath, 'string or Symfony\Component\PropertyAccess\PropertyPathInterface');
|
||||||
}
|
}
|
||||||
|
|
||||||
$propertyValues =& $this->readPropertiesUntil($objectOrArray, $propertyPath, $propertyPath->getLength());
|
$propertyValues =& $this->readPropertiesUntil($objectOrArray, $propertyPath, $propertyPath->getLength(), $this->throwExceptionOnInvalidIndex);
|
||||||
|
|
||||||
return $propertyValues[count($propertyValues) - 1][self::VALUE];
|
return $propertyValues[count($propertyValues) - 1][self::VALUE];
|
||||||
}
|
}
|
||||||
@ -106,7 +116,7 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||||||
*
|
*
|
||||||
* @throws UnexpectedTypeException If a value within the path is neither object nor array.
|
* @throws UnexpectedTypeException If a value within the path is neither object nor array.
|
||||||
*/
|
*/
|
||||||
private function &readPropertiesUntil(&$objectOrArray, PropertyPathInterface $propertyPath, $lastIndex)
|
private function &readPropertiesUntil(&$objectOrArray, PropertyPathInterface $propertyPath, $lastIndex, $throwExceptionOnNonexistantIndex = false)
|
||||||
{
|
{
|
||||||
$propertyValues = array();
|
$propertyValues = array();
|
||||||
|
|
||||||
@ -121,6 +131,9 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||||||
|
|
||||||
// Create missing nested arrays on demand
|
// Create missing nested arrays on demand
|
||||||
if ($isIndex && $isArrayAccess && !isset($objectOrArray[$property])) {
|
if ($isIndex && $isArrayAccess && !isset($objectOrArray[$property])) {
|
||||||
|
if ($throwExceptionOnNonexistantIndex) {
|
||||||
|
throw new NoSuchIndexException(sprintf('Cannot read property "%s". Available properties are "%s"', $property, print_r(array_keys($objectOrArray), true)));
|
||||||
|
}
|
||||||
$objectOrArray[$property] = $i + 1 < $propertyPath->getLength() ? array() : null;
|
$objectOrArray[$property] = $i + 1 < $propertyPath->getLength() ? array() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,11 @@ class PropertyAccessorBuilder
|
|||||||
*/
|
*/
|
||||||
private $magicCall = false;
|
private $magicCall = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Boolean
|
||||||
|
*/
|
||||||
|
private $throwExceptionOnInvalidIndex = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables the use of "__call" by the PropertyAccessor.
|
* Enables the use of "__call" by the PropertyAccessor.
|
||||||
*
|
*
|
||||||
@ -48,13 +53,46 @@ class PropertyAccessorBuilder
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Boolean true if the use of "__call" by the ProperyAccessor is enabled
|
* @return Boolean true if the use of "__call" by the PropertyAccessor is enabled
|
||||||
*/
|
*/
|
||||||
public function isMagicCallEnabled()
|
public function isMagicCallEnabled()
|
||||||
{
|
{
|
||||||
return $this->magicCall;
|
return $this->magicCall;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables exceptions in read context for array by PropertyAccessor
|
||||||
|
*
|
||||||
|
* @return PropertyAccessorBuilder The builder object
|
||||||
|
*/
|
||||||
|
public function enableExceptionOnInvalidIndex()
|
||||||
|
{
|
||||||
|
$this->throwExceptionOnInvalidIndex = true;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables exceptions in read context for array by PropertyAccessor
|
||||||
|
*
|
||||||
|
* @return PropertyAccessorBuilder The builder object
|
||||||
|
*/
|
||||||
|
public function disableExceptionOnInvalidIndex()
|
||||||
|
{
|
||||||
|
$this->throwExceptionOnInvalidIndex = false;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Boolean true is exceptions in read context for array is enabled
|
||||||
|
*/
|
||||||
|
public function isExceptionOnInvalidIndexEnabled()
|
||||||
|
{
|
||||||
|
return $this->throwExceptionOnInvalidIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds and returns a new propertyAccessor object.
|
* Builds and returns a new propertyAccessor object.
|
||||||
*
|
*
|
||||||
@ -62,6 +100,6 @@ class PropertyAccessorBuilder
|
|||||||
*/
|
*/
|
||||||
public function getPropertyAccessor()
|
public function getPropertyAccessor()
|
||||||
{
|
{
|
||||||
return new PropertyAccessor($this->magicCall);
|
return new PropertyAccessor($this->magicCall, $this->throwExceptionOnInvalidIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,24 +15,49 @@ use Symfony\Component\PropertyAccess\PropertyAccessor;
|
|||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\Author;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\Author;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\Magician;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\Magician;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\MagicianCall;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\MagicianCall;
|
||||||
|
use Symfony\Component\PropertyAccess\PropertyAccessorBuilder;
|
||||||
|
|
||||||
class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var PropertyAccessor
|
* @var PropertyAccessorBuilder
|
||||||
*/
|
*/
|
||||||
private $propertyAccessor;
|
private $propertyAccessorBuilder;
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor = new PropertyAccessor();
|
$this->propertyAccessorBuilder = new PropertyAccessorBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get PropertyAccessor configured
|
||||||
|
*
|
||||||
|
* @param string $withMagicCall
|
||||||
|
* @param string $throwExceptionOnInvalidIndex
|
||||||
|
* @return PropertyAccessorInterface
|
||||||
|
*/
|
||||||
|
protected function getPropertyAccessor($withMagicCall = false, $throwExceptionOnInvalidIndex = false)
|
||||||
|
{
|
||||||
|
if ($withMagicCall) {
|
||||||
|
$this->propertyAccessorBuilder->enableMagicCall();
|
||||||
|
} else {
|
||||||
|
$this->propertyAccessorBuilder->disableMagicCall();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($throwExceptionOnInvalidIndex) {
|
||||||
|
$this->propertyAccessorBuilder->enableExceptionOnInvalidIndex();
|
||||||
|
} else {
|
||||||
|
$this->propertyAccessorBuilder->disableExceptionOnInvalidIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->propertyAccessorBuilder->getPropertyAccessor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsArray()
|
public function testGetValueReadsArray()
|
||||||
{
|
{
|
||||||
$array = array('firstName' => 'Bernhard');
|
$array = array('firstName' => 'Bernhard');
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($array, '[firstName]'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($array, '[firstName]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,42 +67,50 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$array = array('firstName' => 'Bernhard');
|
$array = array('firstName' => 'Bernhard');
|
||||||
|
|
||||||
$this->propertyAccessor->getValue($array, 'firstName');
|
$this->getPropertyAccessor()->getValue($array, 'firstName');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsZeroIndex()
|
public function testGetValueReadsZeroIndex()
|
||||||
{
|
{
|
||||||
$array = array('Bernhard');
|
$array = array('Bernhard');
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($array, '[0]'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($array, '[0]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsIndexWithSpecialChars()
|
public function testGetValueReadsIndexWithSpecialChars()
|
||||||
{
|
{
|
||||||
$array = array('%!@$§.' => 'Bernhard');
|
$array = array('%!@$§.' => 'Bernhard');
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($array, '[%!@$§.]'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($array, '[%!@$§.]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsNestedIndexWithSpecialChars()
|
public function testGetValueReadsNestedIndexWithSpecialChars()
|
||||||
{
|
{
|
||||||
$array = array('root' => array('%!@$§.' => 'Bernhard'));
|
$array = array('root' => array('%!@$§.' => 'Bernhard'));
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($array, '[root][%!@$§.]'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($array, '[root][%!@$§.]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsArrayWithCustomPropertyPath()
|
public function testGetValueReadsArrayWithCustomPropertyPath()
|
||||||
{
|
{
|
||||||
$array = array('child' => array('index' => array('firstName' => 'Bernhard')));
|
$array = array('child' => array('index' => array('firstName' => 'Bernhard')));
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($array, '[child][index][firstName]'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($array, '[child][index][firstName]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsArrayWithMissingIndexForCustomPropertyPath()
|
public function testGetValueReadsArrayWithMissingIndexForCustomPropertyPath()
|
||||||
{
|
{
|
||||||
$array = array('child' => array('index' => array()));
|
$array = array('child' => array('index' => array()));
|
||||||
|
|
||||||
$this->assertNull($this->propertyAccessor->getValue($array, '[child][index][firstName]'));
|
// No BC break
|
||||||
|
$this->assertNull($this->getPropertyAccessor()->getValue($array, '[child][index][firstName]'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->getPropertyAccessor(false, true)->getValue($array, '[child][index][firstName]');
|
||||||
|
$this->fail('Getting value on a nonexistent path from array should throw a Symfony\Component\PropertyAccess\Exception\NoSuchIndexException exception');
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->assertInstanceof('Symfony\Component\PropertyAccess\Exception\NoSuchIndexException', $e, 'Getting value on a nonexistent path from array should throw a Symfony\Component\PropertyAccess\Exception\NoSuchIndexException exception');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsProperty()
|
public function testGetValueReadsProperty()
|
||||||
@ -85,7 +118,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object = new Author();
|
$object = new Author();
|
||||||
$object->firstName = 'Bernhard';
|
$object->firstName = 'Bernhard';
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($object, 'firstName'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($object, 'firstName'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueIgnoresSingular()
|
public function testGetValueIgnoresSingular()
|
||||||
@ -94,14 +127,14 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$object = (object) array('children' => 'Many');
|
$object = (object) array('children' => 'Many');
|
||||||
|
|
||||||
$this->assertEquals('Many', $this->propertyAccessor->getValue($object, 'children|child'));
|
$this->assertEquals('Many', $this->getPropertyAccessor()->getValue($object, 'children|child'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsPropertyWithSpecialCharsExceptDot()
|
public function testGetValueReadsPropertyWithSpecialCharsExceptDot()
|
||||||
{
|
{
|
||||||
$array = (object) array('%!@$§' => 'Bernhard');
|
$array = (object) array('%!@$§' => 'Bernhard');
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($array, '%!@$§'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($array, '%!@$§'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsPropertyWithCustomPropertyPath()
|
public function testGetValueReadsPropertyWithCustomPropertyPath()
|
||||||
@ -111,7 +144,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object->child['index'] = new Author();
|
$object->child['index'] = new Author();
|
||||||
$object->child['index']->firstName = 'Bernhard';
|
$object->child['index']->firstName = 'Bernhard';
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $this->propertyAccessor->getValue($object, 'child[index].firstName'));
|
$this->assertEquals('Bernhard', $this->getPropertyAccessor()->getValue($object, 'child[index].firstName'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,7 +152,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetValueThrowsExceptionIfPropertyIsNotPublic()
|
public function testGetValueThrowsExceptionIfPropertyIsNotPublic()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->getValue(new Author(), 'privateProperty');
|
$this->getPropertyAccessor()->getValue(new Author(), 'privateProperty');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsGetters()
|
public function testGetValueReadsGetters()
|
||||||
@ -127,7 +160,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object = new Author();
|
$object = new Author();
|
||||||
$object->setLastName('Schussek');
|
$object->setLastName('Schussek');
|
||||||
|
|
||||||
$this->assertEquals('Schussek', $this->propertyAccessor->getValue($object, 'lastName'));
|
$this->assertEquals('Schussek', $this->getPropertyAccessor()->getValue($object, 'lastName'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueCamelizesGetterNames()
|
public function testGetValueCamelizesGetterNames()
|
||||||
@ -135,7 +168,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object = new Author();
|
$object = new Author();
|
||||||
$object->setLastName('Schussek');
|
$object->setLastName('Schussek');
|
||||||
|
|
||||||
$this->assertEquals('Schussek', $this->propertyAccessor->getValue($object, 'last_name'));
|
$this->assertEquals('Schussek', $this->getPropertyAccessor()->getValue($object, 'last_name'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -143,7 +176,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetValueThrowsExceptionIfGetterIsNotPublic()
|
public function testGetValueThrowsExceptionIfGetterIsNotPublic()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->getValue(new Author(), 'privateGetter');
|
$this->getPropertyAccessor()->getValue(new Author(), 'privateGetter');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsIssers()
|
public function testGetValueReadsIssers()
|
||||||
@ -151,7 +184,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object = new Author();
|
$object = new Author();
|
||||||
$object->setAustralian(false);
|
$object->setAustralian(false);
|
||||||
|
|
||||||
$this->assertFalse($this->propertyAccessor->getValue($object, 'australian'));
|
$this->assertFalse($this->getPropertyAccessor()->getValue($object, 'australian'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadHassers()
|
public function testGetValueReadHassers()
|
||||||
@ -159,7 +192,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object = new Author();
|
$object = new Author();
|
||||||
$object->setReadPermissions(true);
|
$object->setReadPermissions(true);
|
||||||
|
|
||||||
$this->assertTrue($this->propertyAccessor->getValue($object, 'read_permissions'));
|
$this->assertTrue($this->getPropertyAccessor()->getValue($object, 'read_permissions'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsMagicGet()
|
public function testGetValueReadsMagicGet()
|
||||||
@ -167,7 +200,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object = new Magician();
|
$object = new Magician();
|
||||||
$object->__set('magicProperty', 'foobar');
|
$object->__set('magicProperty', 'foobar');
|
||||||
|
|
||||||
$this->assertSame('foobar', $this->propertyAccessor->getValue($object, 'magicProperty'));
|
$this->assertSame('foobar', $this->getPropertyAccessor()->getValue($object, 'magicProperty'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -177,7 +210,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$object = new Magician();
|
$object = new Magician();
|
||||||
|
|
||||||
$this->assertNull($this->propertyAccessor->getValue($object, 'magicProperty'));
|
$this->assertNull($this->getPropertyAccessor()->getValue($object, 'magicProperty'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -185,7 +218,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetValueThrowsExceptionIfIsserIsNotPublic()
|
public function testGetValueThrowsExceptionIfIsserIsNotPublic()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->getValue(new Author(), 'privateIsser');
|
$this->getPropertyAccessor()->getValue(new Author(), 'privateIsser');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -193,7 +226,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetValueThrowsExceptionIfPropertyDoesNotExist()
|
public function testGetValueThrowsExceptionIfPropertyDoesNotExist()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->getValue(new Author(), 'foobar');
|
$this->getPropertyAccessor()->getValue(new Author(), 'foobar');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -201,7 +234,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetValueThrowsExceptionIfNotObjectOrArray()
|
public function testGetValueThrowsExceptionIfNotObjectOrArray()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->getValue('baz', 'foobar');
|
$this->getPropertyAccessor()->getValue('baz', 'foobar');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -209,7 +242,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetValueThrowsExceptionIfNull()
|
public function testGetValueThrowsExceptionIfNull()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->getValue(null, 'foobar');
|
$this->getPropertyAccessor()->getValue(null, 'foobar');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -217,14 +250,14 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetValueThrowsExceptionIfEmpty()
|
public function testGetValueThrowsExceptionIfEmpty()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->getValue('', 'foobar');
|
$this->getPropertyAccessor()->getValue('', 'foobar');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetValueUpdatesArrays()
|
public function testSetValueUpdatesArrays()
|
||||||
{
|
{
|
||||||
$array = array();
|
$array = array();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($array, '[firstName]', 'Bernhard');
|
$this->getPropertyAccessor()->setValue($array, '[firstName]', 'Bernhard');
|
||||||
|
|
||||||
$this->assertEquals(array('firstName' => 'Bernhard'), $array);
|
$this->assertEquals(array('firstName' => 'Bernhard'), $array);
|
||||||
}
|
}
|
||||||
@ -236,14 +269,14 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$array = array();
|
$array = array();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($array, 'firstName', 'Bernhard');
|
$this->getPropertyAccessor()->setValue($array, 'firstName', 'Bernhard');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetValueUpdatesArraysWithCustomPropertyPath()
|
public function testSetValueUpdatesArraysWithCustomPropertyPath()
|
||||||
{
|
{
|
||||||
$array = array();
|
$array = array();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($array, '[child][index][firstName]', 'Bernhard');
|
$this->getPropertyAccessor()->setValue($array, '[child][index][firstName]', 'Bernhard');
|
||||||
|
|
||||||
$this->assertEquals(array('child' => array('index' => array('firstName' => 'Bernhard'))), $array);
|
$this->assertEquals(array('child' => array('index' => array('firstName' => 'Bernhard'))), $array);
|
||||||
}
|
}
|
||||||
@ -252,7 +285,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$object = new Author();
|
$object = new Author();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($object, 'firstName', 'Bernhard');
|
$this->getPropertyAccessor()->setValue($object, 'firstName', 'Bernhard');
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $object->firstName);
|
$this->assertEquals('Bernhard', $object->firstName);
|
||||||
}
|
}
|
||||||
@ -263,7 +296,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$object->child = array();
|
$object->child = array();
|
||||||
$object->child['index'] = new Author();
|
$object->child['index'] = new Author();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($object, 'child[index].firstName', 'Bernhard');
|
$this->getPropertyAccessor()->setValue($object, 'child[index].firstName', 'Bernhard');
|
||||||
|
|
||||||
$this->assertEquals('Bernhard', $object->child['index']->firstName);
|
$this->assertEquals('Bernhard', $object->child['index']->firstName);
|
||||||
}
|
}
|
||||||
@ -272,7 +305,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$object = new Magician();
|
$object = new Magician();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($object, 'magicProperty', 'foobar');
|
$this->getPropertyAccessor()->setValue($object, 'magicProperty', 'foobar');
|
||||||
|
|
||||||
$this->assertEquals('foobar', $object->__get('magicProperty'));
|
$this->assertEquals('foobar', $object->__get('magicProperty'));
|
||||||
}
|
}
|
||||||
@ -281,7 +314,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$object = new Author();
|
$object = new Author();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($object, 'lastName', 'Schussek');
|
$this->getPropertyAccessor()->setValue($object, 'lastName', 'Schussek');
|
||||||
|
|
||||||
$this->assertEquals('Schussek', $object->getLastName());
|
$this->assertEquals('Schussek', $object->getLastName());
|
||||||
}
|
}
|
||||||
@ -290,7 +323,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$object = new Author();
|
$object = new Author();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($object, 'last_name', 'Schussek');
|
$this->getPropertyAccessor()->setValue($object, 'last_name', 'Schussek');
|
||||||
|
|
||||||
$this->assertEquals('Schussek', $object->getLastName());
|
$this->assertEquals('Schussek', $object->getLastName());
|
||||||
}
|
}
|
||||||
@ -300,7 +333,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public function testSetValueThrowsExceptionIfGetterIsNotPublic()
|
public function testSetValueThrowsExceptionIfGetterIsNotPublic()
|
||||||
{
|
{
|
||||||
$this->propertyAccessor->setValue(new Author(), 'privateSetter', 'foobar');
|
$this->getPropertyAccessor()->setValue(new Author(), 'privateSetter', 'foobar');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -310,7 +343,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$value = 'baz';
|
$value = 'baz';
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($value, 'foobar', 'bam');
|
$this->getPropertyAccessor()->setValue($value, 'foobar', 'bam');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -320,7 +353,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$value = null;
|
$value = null;
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($value, 'foobar', 'bam');
|
$this->getPropertyAccessor()->setValue($value, 'foobar', 'bam');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -330,7 +363,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$value = '';
|
$value = '';
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($value, 'foobar', 'bam');
|
$this->getPropertyAccessor()->setValue($value, 'foobar', 'bam');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -340,7 +373,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$value = new MagicianCall();
|
$value = new MagicianCall();
|
||||||
|
|
||||||
$this->propertyAccessor->setValue($value, 'foobar', 'bam');
|
$this->getPropertyAccessor()->setValue($value, 'foobar', 'bam');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -350,7 +383,7 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$value = new MagicianCall();
|
$value = new MagicianCall();
|
||||||
|
|
||||||
$this->propertyAccessor->getValue($value, 'foobar', 'bam');
|
$this->getPropertyAccessor()->getValue($value, 'foobar', 'bam');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetValueReadsMagicCall()
|
public function testGetValueReadsMagicCall()
|
||||||
|
Reference in New Issue
Block a user