diff options
| -rw-r--r-- | .gitattributes | 2 | ||||
| -rw-r--r-- | HISTORY | 1 | ||||
| -rw-r--r-- | framework/Data/SqlMap/DataMapper/TPropertyAccess.php | 4 | ||||
| -rw-r--r-- | tests/unit/Data/SqlMap/AllTests.php | 2 | ||||
| -rw-r--r-- | tests/unit/Data/SqlMap/DataMapper/AllTests.php | 28 | ||||
| -rw-r--r-- | tests/unit/Data/SqlMap/DataMapper/TPropertyAccessTest.php | 269 | 
6 files changed, 306 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes index 223a642b..c88218fd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3457,6 +3457,8 @@ tests/unit/Collections/TStackTest.php -text  tests/unit/Data/DataGateway/AllTests.php -text  tests/unit/Data/DataGateway/TSqlCriteriaTest.php -text  tests/unit/Data/SqlMap/AllTests.php -text +tests/unit/Data/SqlMap/DataMapper/AllTests.php eol=lf +tests/unit/Data/SqlMap/DataMapper/TPropertyAccessTest.php eol=lf  tests/unit/Data/SqlMap/DynamicParameterTest.php -text  tests/unit/Data/SqlMap/DynamicParameterTestMap.xml -text  tests/unit/Data/SqlMap/fixtures/mysql5_reset.sql -text @@ -1,4 +1,5 @@  Version 3.1.5 (to be released) +BUG: Issue#55 - TPropertyAccess.get and has don't recognize magic getter __get (Yves)  BUG: Issue#68 - TSqlMapConfig::createSqlMapGateway(): assign current connection to cached TSqlMapManager to avoid loosing active transaction (Yves)  BUG: Issue#87 - TinyMCE : empty string disapears after encoding JS, that's a problem! (Christophe)  BUG: Issue#88 - SQLMap $Param$ re-evaluation bug (Yves) diff --git a/framework/Data/SqlMap/DataMapper/TPropertyAccess.php b/framework/Data/SqlMap/DataMapper/TPropertyAccess.php index a27cb50f..5dbd00eb 100644 --- a/framework/Data/SqlMap/DataMapper/TPropertyAccess.php +++ b/framework/Data/SqlMap/DataMapper/TPropertyAccess.php @@ -71,6 +71,8 @@ class TPropertyAccess  					$object = $object->{$getter}();
  				else if(in_array($prop, array_keys(get_object_vars($object))))
  					$object = $object->{$prop};
 +				elseif(method_exists($object, '__get') && is_callable(array($object, '__get')))
 +					$object = $object->{$prop};
  				else
  					throw new TInvalidPropertyException('sqlmap_invalid_property',$path);
  			}
 @@ -106,6 +108,8 @@ class TPropertyAccess  					$object = $object->{$getter}();
  				else if(in_array($prop, array_keys(get_object_vars($object))))
  					$object = $object->{$prop};
 +				elseif(method_exists($object, '__get') && is_callable(array($object, '__get')))
 +					$object = $object->{$prop};
  				else
  					return false;
  			}
 diff --git a/tests/unit/Data/SqlMap/AllTests.php b/tests/unit/Data/SqlMap/AllTests.php index 187be17f..735f1202 100644 --- a/tests/unit/Data/SqlMap/AllTests.php +++ b/tests/unit/Data/SqlMap/AllTests.php @@ -6,6 +6,7 @@ if(!defined('PHPUnit_MAIN_METHOD')) {  }
  require_once 'DynamicParameterTest.php';
 +require_once './DataMapper/AllTests.php';
  class Data_SqlMap_AllTests {
 @@ -17,6 +18,7 @@ class Data_SqlMap_AllTests {  		$suite = new PHPUnit_Framework_TestSuite('System.Data.SqlMap');
  		$suite->addTestSuite('DynamicParameterTest');
 +		$suite -> addTest( Data_SqlMap_DataMapper_AllTests::suite() );
  		return $suite;
  	}
 diff --git a/tests/unit/Data/SqlMap/DataMapper/AllTests.php b/tests/unit/Data/SqlMap/DataMapper/AllTests.php new file mode 100644 index 00000000..9e80e7c8 --- /dev/null +++ b/tests/unit/Data/SqlMap/DataMapper/AllTests.php @@ -0,0 +1,28 @@ +<?php +require_once dirname(__FILE__).'/../../../phpunit.php'; + +if(!defined('PHPUnit_MAIN_METHOD')) { +	define('PHPUnit_MAIN_METHOD', 'Data_SqlMap_DataMapper_AllTests::main'); +} + +require_once 'TPropertyAccessTest.php'; + +class Data_SqlMap_DataMapper_AllTests { + +	public static function main() { +		PHPUnit_TextUI_TestRunner::run(self::suite()); +	} + +	public static function suite() { +		$suite = new PHPUnit_Framework_TestSuite('System.Data.SqlMap.DataMapper'); + +		$suite->addTestSuite('TPropertyAccessTest'); + +		return $suite; +	} +} + +if(PHPUnit_MAIN_METHOD == 'Data_SqlMap_DataMapper_AllTests::main') { +	Data_SqlMap_DataMapper_AllTests::main(); +} +?>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/DataMapper/TPropertyAccessTest.php b/tests/unit/Data/SqlMap/DataMapper/TPropertyAccessTest.php new file mode 100644 index 00000000..b48363f1 --- /dev/null +++ b/tests/unit/Data/SqlMap/DataMapper/TPropertyAccessTest.php @@ -0,0 +1,269 @@ +<?php +require_once dirname(__FILE__).'/../../../phpunit.php'; + +Prado::using('System.Data.SqlMap.DataMapper.TSqlMapException'); +Prado::using('System.Data.SqlMap.DataMapper.TPropertyAccess'); + +/** + * @package System.Data.SqlMap.DataMapper + */ +class TPropertyAccessTest extends PHPUnit_Framework_TestCase +{ +	public function testHasPublicVar() +	{ +		$testobj = new _PropertyAccessTestHelperPublicVar(); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'a')); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'b')); +		self::assertEquals(false, TPropertyAccess::has($testobj, 'c')); + +		self::assertEquals(false, TPropertyAccess::has($testobj, 'A')); +		self::assertEquals(false, TPropertyAccess::has($testobj, 'B')); +		self::assertEquals(false, TPropertyAccess::has($testobj, 'C')); +	} + +	public function testGetPublicVar() +	{ +		$testobj = new _PropertyAccessTestHelperPublicVar(); + +		self::assertEquals(1, TPropertyAccess::get($testobj, 'a')); +		self::assertEquals(2, TPropertyAccess::get($testobj, 'b')); + +		self::setExpectedException('TInvalidPropertyException'); +		TPropertyAccess::get($testobj, 'c'); +	} + +	public function testSetPublicVar() +	{ +		$testobj = new _PropertyAccessTestHelperPublicVar(); + +		TPropertyAccess::set($testobj, 'a', 10); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'a')); + +		TPropertyAccess::set($testobj, 'b', 20); +		self::assertEquals(20, TPropertyAccess::get($testobj, 'b')); + +		TPropertyAccess::set($testobj, 'c', 30); +		self::assertEquals(30, TPropertyAccess::get($testobj, 'c')); +	} + + +	public function testHasStaticProperties() +	{ +		$testobj = new _PropertyAccessTestHelperStaticProperties(); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'a')); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'b')); +		self::assertEquals(false, TPropertyAccess::has($testobj, 'c')); + +		self::assertEquals(true, TPropertyAccess::has($testobj, 'A')); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'B')); +		self::assertEquals(false, TPropertyAccess::has($testobj, 'C')); +	} + +	public function testGetStaticProperties() +	{ +		$testobj = new _PropertyAccessTestHelperStaticProperties(); +		self::assertEquals(1, TPropertyAccess::get($testobj, 'a')); +		self::assertEquals(2, TPropertyAccess::get($testobj, 'b')); +		self::assertEquals(1, TPropertyAccess::get($testobj, 'A')); +		self::assertEquals(2, TPropertyAccess::get($testobj, 'B')); + +		self::setExpectedException('TInvalidPropertyException'); +		TPropertyAccess::get($testobj, 'c'); + +		self::setExpectedException('TInvalidPropertyException'); +		TPropertyAccess::get($testobj, 'C'); +	} + +	public function testSetStaticProperties() +	{ +		$testobj = new _PropertyAccessTestHelperStaticProperties(); +		TPropertyAccess::set($testobj, 'a', 10); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'a')); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'A')); + +		TPropertyAccess::set($testobj, 'A', 100); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'a')); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'A')); + +		TPropertyAccess::set($testobj, 'b', 10); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'b')); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'B')); + +		TPropertyAccess::set($testobj, 'B', 100); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'b')); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'B')); + +		TPropertyAccess::set($testobj, 'c', 30); +		self::assertEquals(30, TPropertyAccess::get($testobj, 'c')); + +		self::setExpectedException('TInvalidPropertyException'); +		TPropertyAccess::get($testobj, 'C'); +	} + + +	public function testHasDynamicProperties() +	{ +		$testobj = new _PropertyAccessTestHelperDynamicProperties(); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'a')); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'b')); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'c')); + +		self::assertEquals(true, TPropertyAccess::has($testobj, 'A')); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'B')); +		self::assertEquals(true, TPropertyAccess::has($testobj, 'C')); +	} + +	public function testGetDynamicProperties() +	{ +		$testobj = new _PropertyAccessTestHelperDynamicProperties(); +		self::assertEquals(1, TPropertyAccess::get($testobj, 'a')); +		self::assertEquals(2, TPropertyAccess::get($testobj, 'b')); +		self::assertEquals(1, TPropertyAccess::get($testobj, 'A')); +		self::assertEquals(2, TPropertyAccess::get($testobj, 'B')); + +		self::assertNull(TPropertyAccess::get($testobj, 'c')); +		self::assertNull(TPropertyAccess::get($testobj, 'C')); +	} + +	public function testSetDynamicProperties() +	{ +		$testobj = new _PropertyAccessTestHelperDynamicProperties(); +		TPropertyAccess::set($testobj, 'a', 10); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'a')); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'A')); + +		TPropertyAccess::set($testobj, 'A', 100); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'a')); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'A')); + +		TPropertyAccess::set($testobj, 'b', 10); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'b')); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'B')); + +		TPropertyAccess::set($testobj, 'B', 100); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'b')); +		self::assertEquals(100, TPropertyAccess::get($testobj, 'B')); + +		TPropertyAccess::set($testobj, 'c', 30); +		self::assertNull(TPropertyAccess::get($testobj, 'c')); +		self::assertNull(TPropertyAccess::get($testobj, 'C')); +	} + +	public function testArrayAccess() +	{ +		$thingamajig = array( +			'a'	=> 'foo', +			'b'	=> 'bar', +			'c' => new _PropertyAccessTestHelperPublicVar(), +			'd' => new _PropertyAccessTestHelperStaticProperties(), +			'e' => new _PropertyAccessTestHelperDynamicProperties(), +		); + +		$testobj = new _PropertyAccessTestHelperPublicVar(); +		TPropertyAccess::set($testobj, 'a', $thingamajig); + +		$tmp = TPropertyAccess::get($testobj, 'a'); +		self::assertTrue(is_array($tmp)); +		self::assertEquals($thingamajig, $tmp); + +		self::assertEquals('foo', TPropertyAccess::get($testobj, 'a.a')); +		self::assertEquals('bar', TPropertyAccess::get($testobj, 'a.b')); +		self::assertTrue(TPropertyAccess::get($testobj, 'a.c') instanceof _PropertyAccessTestHelperPublicVar); +		self::assertTrue(TPropertyAccess::get($testobj, 'a.d') instanceof _PropertyAccessTestHelperStaticProperties); +		self::assertTrue(TPropertyAccess::get($testobj, 'a.e') instanceof _PropertyAccessTestHelperDynamicProperties); + +		TPropertyAccess::set($testobj, 'a.c.a', 10); +		TPropertyAccess::set($testobj, 'a.d.a', 10); +		TPropertyAccess::set($testobj, 'a.e.a', 10); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'a.c.a')); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'a.d.a')); +		self::assertEquals(10, TPropertyAccess::get($testobj, 'a.e.a')); + +		TPropertyAccess::set($testobj, 'a.c.c', 30); +		TPropertyAccess::set($testobj, 'a.d.c', 30); +		TPropertyAccess::set($testobj, 'a.e.c', 30); + +		self::assertEquals(30, TPropertyAccess::get($testobj, 'a.c.c')); +		self::assertEquals(30, TPropertyAccess::get($testobj, 'a.d.c')); + +		self::assertNull(TPropertyAccess::get($testobj, 'a.e.c')); +		self::assertNull(TPropertyAccess::get($testobj, 'a.e.C')); + +		self::setExpectedException('TInvalidPropertyException'); +		TPropertyAccess::get($testobj, 'a.c.C'); + +		self::setExpectedException('TInvalidPropertyException'); +		TPropertyAccess::get($testobj, 'a.d.C'); +	} +} + + + +class _PropertyAccessTestHelperPublicVar +{ +	public $a = 1; +	public $b = 2; +} + +class _PropertyAccessTestHelperStaticProperties +{ +	private $_a = 1; +	private $_b = 2; + +	public function getA() +	{ +		return $this -> _a; +	} + +	public function setA($value) +	{ +		$this -> _a = $value; +	} + +	public function getB() +	{ +		return $this -> _b; +	} + +	public function setB($value) +	{ +		$this -> _b = $value; +	} +} + +class _PropertyAccessTestHelperDynamicProperties +{ +	private $_a = 1; +	private $_b = 2; + +	public function __set($name, $value) +	{ +		switch(strToLower($name)) +		{ +			case 'a': +				$this -> _a = $value; +			break; +			case 'b': +				$this -> _b = $value; +			break; +		} +	} + +	public function __get($name) +	{ +		switch(strToLower($name)) +		{ +			case 'a': +				return $this -> _a; +			break; +			case 'b': +				return $this -> _b; +			break; +			default: +				return null; +			break; +		} +	} +} + +?>
\ No newline at end of file  | 
