From c6904380ac34536c0f3d65d3c92deaa9fa532f4a Mon Sep 17 00:00:00 2001 From: "godzilla80@gmx.net" <> Date: Fri, 1 May 2009 08:30:05 +0000 Subject: Fixed Issue #55 - TPropertyAccess.get don't recognize magic getter __get --- .gitattributes | 2 + HISTORY | 1 + .../Data/SqlMap/DataMapper/TPropertyAccess.php | 4 + tests/unit/Data/SqlMap/AllTests.php | 2 + tests/unit/Data/SqlMap/DataMapper/AllTests.php | 28 +++ .../Data/SqlMap/DataMapper/TPropertyAccessTest.php | 269 +++++++++++++++++++++ 6 files changed, 306 insertions(+) create mode 100644 tests/unit/Data/SqlMap/DataMapper/AllTests.php create mode 100644 tests/unit/Data/SqlMap/DataMapper/TPropertyAccessTest.php 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 diff --git a/HISTORY b/HISTORY index 578ebd12..66f012bb 100644 --- a/HISTORY +++ b/HISTORY @@ -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 @@ +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 @@ + '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 -- cgit v1.2.3