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 |