summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgodzilla80@gmx.net <>2009-05-01 08:30:05 +0000
committergodzilla80@gmx.net <>2009-05-01 08:30:05 +0000
commitc6904380ac34536c0f3d65d3c92deaa9fa532f4a (patch)
tree7183cfc195539b55942abd77c3422025a880b865
parentc5b32bfae9b60b59e81276abd8af2b451b92080a (diff)
Fixed Issue #55 - TPropertyAccess.get don't recognize magic getter __get
-rw-r--r--.gitattributes2
-rw-r--r--HISTORY1
-rw-r--r--framework/Data/SqlMap/DataMapper/TPropertyAccess.php4
-rw-r--r--tests/unit/Data/SqlMap/AllTests.php2
-rw-r--r--tests/unit/Data/SqlMap/DataMapper/AllTests.php28
-rw-r--r--tests/unit/Data/SqlMap/DataMapper/TPropertyAccessTest.php269
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
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 @@
+<?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