parent
							
								
									cf574fcba8
								
							
						
					
					
						commit
						b98243d193
					
				@ -0,0 +1 @@ | 
				
			|||||||
 | 
					../doctrine/dbal/bin/doctrine-dbal | 
				
			||||||
@ -0,0 +1,10 @@ | 
				
			|||||||
 | 
					build/ | 
				
			||||||
 | 
					logs/ | 
				
			||||||
 | 
					reports/ | 
				
			||||||
 | 
					dist/ | 
				
			||||||
 | 
					tests/Doctrine/Tests/Common/Proxy/generated/ | 
				
			||||||
 | 
					vendor/ | 
				
			||||||
 | 
					.idea | 
				
			||||||
 | 
					composer.lock | 
				
			||||||
 | 
					doctrine-common-*.tar | 
				
			||||||
 | 
					doctrine-common-*.tar.gz | 
				
			||||||
@ -0,0 +1,3 @@ | 
				
			|||||||
 | 
					[submodule "lib/vendor/doctrine-build-common"] | 
				
			||||||
 | 
						path = lib/vendor/doctrine-build-common | 
				
			||||||
 | 
						url = git://github.com/doctrine/doctrine-build-common.git | 
				
			||||||
@ -0,0 +1,26 @@ | 
				
			|||||||
 | 
					language: php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sudo: false | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cache: | 
				
			||||||
 | 
					  directory: | 
				
			||||||
 | 
					    - $HOME/.composer/cache | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					php: | 
				
			||||||
 | 
					  - 5.3.3 | 
				
			||||||
 | 
					  - 5.3 | 
				
			||||||
 | 
					  - 5.4 | 
				
			||||||
 | 
					  - 5.5 | 
				
			||||||
 | 
					  - 5.6 | 
				
			||||||
 | 
					  - 7.0 | 
				
			||||||
 | 
					  - hhvm | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					before_script: | 
				
			||||||
 | 
					  - composer --prefer-source install | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					script: | 
				
			||||||
 | 
					  - ./vendor/bin/phpunit | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					matrix: | 
				
			||||||
 | 
					  allow_failures: | 
				
			||||||
 | 
					    - php: 7.0 | 
				
			||||||
@ -0,0 +1,3 @@ | 
				
			|||||||
 | 
					# Version class and file | 
				
			||||||
 | 
					project.version_class = Doctrine\\Common\\Version | 
				
			||||||
 | 
					project.version_file = lib/Doctrine/Common/Version.php | 
				
			||||||
@ -0,0 +1,101 @@ | 
				
			|||||||
 | 
					<?xml version="1.0"?> | 
				
			||||||
 | 
					<project name="DoctrineCommon" default="build" basedir="."> | 
				
			||||||
 | 
					    <property file="build.properties" /> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="php"> | 
				
			||||||
 | 
					        <exec executable="which" outputproperty="php_executable"> | 
				
			||||||
 | 
					            <arg value="php" /> | 
				
			||||||
 | 
					        </exec> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="prepare"> | 
				
			||||||
 | 
					        <mkdir dir="build" /> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="build" depends="check-git-checkout-clean,prepare,php,composer"> | 
				
			||||||
 | 
					        <exec executable="${php_executable}"> | 
				
			||||||
 | 
					            <arg value="build/composer.phar" /> | 
				
			||||||
 | 
					            <arg value="archive" /> | 
				
			||||||
 | 
					            <arg value="--dir=build" /> | 
				
			||||||
 | 
					        </exec> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="composer" depends="php,composer-check,composer-download"> | 
				
			||||||
 | 
					        <exec executable="${php_executable}"> | 
				
			||||||
 | 
					            <arg value="build/composer.phar" /> | 
				
			||||||
 | 
					            <arg value="install" /> | 
				
			||||||
 | 
					        </exec> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="composer-check" depends="prepare"> | 
				
			||||||
 | 
					        <available file="build/composer.phar" property="composer.present"/> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="composer-download" unless="composer.present"> | 
				
			||||||
 | 
					        <exec executable="wget"> | 
				
			||||||
 | 
					            <arg value="-Obuild/composer.phar" /> | 
				
			||||||
 | 
					            <arg value="http://getcomposer.org/composer.phar" /> | 
				
			||||||
 | 
					        </exec> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="make-release" depends="check-git-checkout-clean,prepare,php"> | 
				
			||||||
 | 
					        <replace file="${project.version_file}" token="-DEV" value="" failOnNoReplacements="true" /> | 
				
			||||||
 | 
					        <exec executable="${php_executable}" outputproperty="doctrine.current_version" failonerror="true"> | 
				
			||||||
 | 
					            <arg value="-r" /> | 
				
			||||||
 | 
					            <arg value="require_once '${project.version_file}';echo ${project.version_class}::VERSION;" /> | 
				
			||||||
 | 
					        </exec> | 
				
			||||||
 | 
					        <exec executable="${php_executable}" outputproperty="doctrine.next_version" failonerror="true"> | 
				
			||||||
 | 
					            <arg value="-r" /> | 
				
			||||||
 | 
					            <arg value="$parts = explode('.', str_ireplace(array('-DEV', '-ALPHA', '-BETA'), '', '${doctrine.current_version}')); | 
				
			||||||
 | 
					                if (count($parts) != 3) { | 
				
			||||||
 | 
					                    throw new \InvalidArgumentException('Version is assumed in format x.y.z, ${doctrine.current_version} given'); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					                $parts[2]++; | 
				
			||||||
 | 
					                echo implode('.', $parts); | 
				
			||||||
 | 
					            " /> | 
				
			||||||
 | 
					        </exec> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <git-commit file="${project.version_file}" message="Release ${doctrine.current_version}" /> | 
				
			||||||
 | 
					        <git-tag version="${doctrine.current_version}" /> | 
				
			||||||
 | 
					        <replace file="${project.version_file}" token="${doctrine.current_version}" value="${doctrine.next_version}-DEV" /> | 
				
			||||||
 | 
					        <git-commit file="${project.version_file}" message="Bump version to ${doctrine.next_version}" /> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <target name="check-git-checkout-clean"> | 
				
			||||||
 | 
					        <exec executable="git" failonerror="true"> | 
				
			||||||
 | 
					            <arg value="diff-index" /> | 
				
			||||||
 | 
					            <arg value="--quiet" /> | 
				
			||||||
 | 
					            <arg value="HEAD" /> | 
				
			||||||
 | 
					        </exec> | 
				
			||||||
 | 
					    </target> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <macrodef name="git-commit"> | 
				
			||||||
 | 
					        <attribute name="file" default="NOT SET"/> | 
				
			||||||
 | 
					        <attribute name="message" default="NOT SET"/> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <sequential> | 
				
			||||||
 | 
					            <exec executable="git"> | 
				
			||||||
 | 
					                <arg value="add" /> | 
				
			||||||
 | 
					                <arg value="@{file}" /> | 
				
			||||||
 | 
					            </exec> | 
				
			||||||
 | 
					            <exec executable="git"> | 
				
			||||||
 | 
					                <arg value="commit" /> | 
				
			||||||
 | 
					                <arg value="-m" /> | 
				
			||||||
 | 
					                <arg value="@{message}" /> | 
				
			||||||
 | 
					            </exec> | 
				
			||||||
 | 
					        </sequential> | 
				
			||||||
 | 
					    </macrodef> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <macrodef name="git-tag"> | 
				
			||||||
 | 
					        <attribute name="version" default="NOT SET" /> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <sequential> | 
				
			||||||
 | 
					            <exec executable="git"> | 
				
			||||||
 | 
					                <arg value="tag" /> | 
				
			||||||
 | 
					                <arg value="-m" /> | 
				
			||||||
 | 
					                <arg value="v@{version}" /> | 
				
			||||||
 | 
					                <arg value="v@{version}" /> | 
				
			||||||
 | 
					            </exec> | 
				
			||||||
 | 
					        </sequential> | 
				
			||||||
 | 
					    </macrodef> | 
				
			||||||
 | 
					</project> | 
				
			||||||
@ -0,0 +1,25 @@ | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<phpunit backupGlobals="false" | 
				
			||||||
 | 
					         backupStaticAttributes="false" | 
				
			||||||
 | 
					         colors="true" | 
				
			||||||
 | 
					         convertErrorsToExceptions="true" | 
				
			||||||
 | 
					         convertNoticesToExceptions="true" | 
				
			||||||
 | 
					         convertWarningsToExceptions="true" | 
				
			||||||
 | 
					         processIsolation="false" | 
				
			||||||
 | 
					         stopOnFailure="false" | 
				
			||||||
 | 
					         syntaxCheck="false" | 
				
			||||||
 | 
					         bootstrap="./tests/Doctrine/Tests/TestInit.php" | 
				
			||||||
 | 
					> | 
				
			||||||
 | 
					    <testsuites> | 
				
			||||||
 | 
					        <testsuite name="Doctrine Common Test Suite"> | 
				
			||||||
 | 
					            <directory>./tests/Doctrine/</directory> | 
				
			||||||
 | 
					        </testsuite> | 
				
			||||||
 | 
					    </testsuites> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <filter> | 
				
			||||||
 | 
					        <whitelist> | 
				
			||||||
 | 
					            <directory>./lib/Doctrine/</directory> | 
				
			||||||
 | 
					        </whitelist> | 
				
			||||||
 | 
					    </filter> | 
				
			||||||
 | 
					</phpunit> | 
				
			||||||
@ -0,0 +1,3 @@ | 
				
			|||||||
 | 
					Doctrine/Tests/Proxies/ | 
				
			||||||
 | 
					Doctrine/Tests/ORM/Proxy/generated/ | 
				
			||||||
 | 
					Doctrine/Tests/ORM/Tools/Export/export | 
				
			||||||
@ -0,0 +1,133 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\ClassLoader; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ClassLoaderTest extends \Doctrine\Tests\DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testClassLoader() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classLoader = new ClassLoader('ClassLoaderTest'); | 
				
			||||||
 | 
					        $classLoader->setIncludePath(__DIR__); | 
				
			||||||
 | 
					        $classLoader->setFileExtension('.class.php'); | 
				
			||||||
 | 
					        $classLoader->setNamespaceSeparator('_'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); | 
				
			||||||
 | 
					        $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); | 
				
			||||||
 | 
					        $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); | 
				
			||||||
 | 
					        $this->assertFalse($classLoader->canLoadClass('OtherClass')); | 
				
			||||||
 | 
					        $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); | 
				
			||||||
 | 
					        $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); | 
				
			||||||
 | 
					        $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassExists() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); | 
				
			||||||
 | 
					        $badLoader = function($className) { | 
				
			||||||
 | 
					            require __DIR__ . '/ClassLoaderTest/ClassD.php'; | 
				
			||||||
 | 
					            return true; | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					        spl_autoload_register($badLoader); | 
				
			||||||
 | 
					        $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); | 
				
			||||||
 | 
					        spl_autoload_unregister($badLoader); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetClassLoader() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $cl = new ClassLoader('ClassLoaderTest', __DIR__); | 
				
			||||||
 | 
					        $cl->register(); | 
				
			||||||
 | 
					        $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); | 
				
			||||||
 | 
					        $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); | 
				
			||||||
 | 
					        $cl->unregister(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassExistsWithSilentAutoloader() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $silentLoader = function ($className) use ($test) { | 
				
			||||||
 | 
					            $test->assertSame('ClassLoaderTest\ClassE', $className); | 
				
			||||||
 | 
					            require __DIR__ . '/ClassLoaderTest/ClassE.php'; | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					        $additionalLoader = function () use ($test) { | 
				
			||||||
 | 
					            $test->fail('Should not call this loader, class was already loaded'); | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassE')); | 
				
			||||||
 | 
					        spl_autoload_register($silentLoader); | 
				
			||||||
 | 
					        spl_autoload_register($additionalLoader); | 
				
			||||||
 | 
					        $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassE')); | 
				
			||||||
 | 
					        spl_autoload_unregister($additionalLoader); | 
				
			||||||
 | 
					        spl_autoload_unregister($silentLoader); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassExistsWhenLoaderIsProtected() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        require_once __DIR__ . '/ClassLoaderTest/ExternalLoader.php'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Test static call | 
				
			||||||
 | 
					        \ClassLoaderTest\ExternalLoader::registerStatic(); | 
				
			||||||
 | 
					        $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\Class\That\Does\Not\Exist')); | 
				
			||||||
 | 
					        \ClassLoaderTest\ExternalLoader::unregisterStatic(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Test object | 
				
			||||||
 | 
					        $loader = new \ClassLoaderTest\ExternalLoader(); | 
				
			||||||
 | 
					        $loader->register(); | 
				
			||||||
 | 
					        $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\Class\That\Does\Not\Exist')); | 
				
			||||||
 | 
					        $loader->unregister(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testLoadNonExistingClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classLoader = new ClassLoader('ClassLoaderTest', __DIR__); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse($classLoader->loadClass('ClassLoaderTest\Non\Existing\ClassName')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testLoadFileNotContainingClassClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classLoader = new ClassLoader('ClassLoaderTest', __DIR__); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classLoader->setFileExtension('.class.php'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse($classLoader->loadClass('ClassLoaderTest\EmptyFile')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSupportsInterfaceAutoloading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classLoader = new ClassLoader(); | 
				
			||||||
 | 
					        $classLoader->setIncludePath(__DIR__); | 
				
			||||||
 | 
					        $classLoader->setFileExtension('.class.php'); | 
				
			||||||
 | 
					        $classLoader->setNamespaceSeparator('_'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($classLoader->loadClass('ClassLoaderTest_InterfaceA')); | 
				
			||||||
 | 
					        $this->assertTrue(interface_exists('ClassLoaderTest_InterfaceA', false)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSupportsTraitAutoloading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (! function_exists('trait_exists')) { | 
				
			||||||
 | 
					            $this->markTestSkipped('You need a PHP version that supports traits in order to run this test'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classLoader = new ClassLoader(); | 
				
			||||||
 | 
					        $classLoader->setIncludePath(__DIR__); | 
				
			||||||
 | 
					        $classLoader->setFileExtension('.class.php'); | 
				
			||||||
 | 
					        $classLoader->setNamespaceSeparator('_'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($classLoader->loadClass('ClassLoaderTest_TraitA')); | 
				
			||||||
 | 
					        $this->assertTrue(trait_exists('ClassLoaderTest_TraitA', false)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testMultipleAutoloadRequestsWillProduceSameResult() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classLoader = new ClassLoader(); | 
				
			||||||
 | 
					        $classLoader->setIncludePath(__DIR__); | 
				
			||||||
 | 
					        $classLoader->setFileExtension('.class.php'); | 
				
			||||||
 | 
					        $classLoader->setNamespaceSeparator('_'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($classLoader->loadClass('ClassLoaderTest_ClassA')); | 
				
			||||||
 | 
					        $this->assertTrue($classLoader->loadClass('ClassLoaderTest_ClassA')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,6 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ClassLoaderTest_ClassA | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,6 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ClassLoaderTest_ClassB | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,6 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ClassLoaderTest_ClassC | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,5 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace ClassLoaderTest; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ClassD {} | 
				
			||||||
@ -0,0 +1,5 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace ClassLoaderTest; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ClassE {} | 
				
			||||||
@ -0,0 +1,38 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace ClassLoaderTest; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ExternalLoader | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public static function registerStatic() { | 
				
			||||||
 | 
					        spl_autoload_register(array('ClassLoaderTest\ExternalLoader', 'load1')); | 
				
			||||||
 | 
					        spl_autoload_register(array('ClassLoaderTest\ExternalLoader', 'load2')); | 
				
			||||||
 | 
					        spl_autoload_register('ClassLoaderTest\ExternalLoader::load3'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function unregisterStatic() { | 
				
			||||||
 | 
					        spl_autoload_unregister(array('ClassLoaderTest\ExternalLoader', 'load1')); | 
				
			||||||
 | 
					        spl_autoload_unregister(array('ClassLoaderTest\ExternalLoader', 'load2')); | 
				
			||||||
 | 
					        spl_autoload_unregister('ClassLoaderTest\ExternalLoader::load3'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function load1() {} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected static function load2() {} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected static function load3() {} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function register() { | 
				
			||||||
 | 
					        spl_autoload_register(array($this, 'load4')); | 
				
			||||||
 | 
					        spl_autoload_register(array($this, 'load5')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function unregister() { | 
				
			||||||
 | 
					        spl_autoload_unregister(array($this, 'load4')); | 
				
			||||||
 | 
					        spl_autoload_unregister(array($this, 'load5')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function load4() {} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function load5() {} | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,5 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface ClassLoaderTest_InterfaceA | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,5 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					trait ClassLoaderTest_TraitA | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,88 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\EventManager; | 
				
			||||||
 | 
					use Doctrine\Common\EventArgs; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EventManagerTest extends \Doctrine\Tests\DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /* Some pseudo events */ | 
				
			||||||
 | 
					    const preFoo = 'preFoo'; | 
				
			||||||
 | 
					    const postFoo = 'postFoo'; | 
				
			||||||
 | 
					    const preBar = 'preBar'; | 
				
			||||||
 | 
					    const postBar = 'postBar'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private $_preFooInvoked = false; | 
				
			||||||
 | 
					    private $_postFooInvoked = false; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private $_eventManager; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->_eventManager = new EventManager; | 
				
			||||||
 | 
					        $this->_preFooInvoked = false; | 
				
			||||||
 | 
					        $this->_postFooInvoked = false; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInitialState() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertEquals(array(), $this->_eventManager->getListeners()); | 
				
			||||||
 | 
					        $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); | 
				
			||||||
 | 
					        $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testAddEventListener() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); | 
				
			||||||
 | 
					        $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); | 
				
			||||||
 | 
					        $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); | 
				
			||||||
 | 
					        $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); | 
				
			||||||
 | 
					        $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); | 
				
			||||||
 | 
					        $this->assertEquals(2, count($this->_eventManager->getListeners())); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testDispatchEvent() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); | 
				
			||||||
 | 
					        $this->_eventManager->dispatchEvent(self::preFoo); | 
				
			||||||
 | 
					        $this->assertTrue($this->_preFooInvoked); | 
				
			||||||
 | 
					        $this->assertFalse($this->_postFooInvoked); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testRemoveEventListener() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->_eventManager->addEventListener(array('preBar'), $this); | 
				
			||||||
 | 
					        $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); | 
				
			||||||
 | 
					        $this->_eventManager->removeEventListener(array('preBar'), $this); | 
				
			||||||
 | 
					        $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testAddEventSubscriber() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $eventSubscriber = new TestEventSubscriber(); | 
				
			||||||
 | 
					        $this->_eventManager->addEventSubscriber($eventSubscriber); | 
				
			||||||
 | 
					        $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); | 
				
			||||||
 | 
					        $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Listener methods */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function preFoo(EventArgs $e) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->_preFooInvoked = true; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function postFoo(EventArgs $e) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->_postFooInvoked = true; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestEventSubscriber implements \Doctrine\Common\EventSubscriber | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function getSubscribedEvents() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array('preFoo', 'postFoo'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,102 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\AbstractManagerRegistry; | 
				
			||||||
 | 
					use Doctrine\Tests\Common\Persistence\Mapping\TestClassMetadataFactory; | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use PHPUnit_Framework_TestCase; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @groups DCOM-270 | 
				
			||||||
 | 
					 * @uses Doctrine\Tests\Common\Persistence\TestObject | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class ManagerRegistryTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var TestManagerRegistry | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private $mr; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritdoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->mr = new TestManagerRegistry( | 
				
			||||||
 | 
					            'ORM', | 
				
			||||||
 | 
					            array('default_connection'), | 
				
			||||||
 | 
					            array('default_manager'), | 
				
			||||||
 | 
					            'default', | 
				
			||||||
 | 
					            'default', | 
				
			||||||
 | 
					            'Doctrine\Common\Persistence\ObjectManagerAware' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetManagerForClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->mr->getManagerForClass('Doctrine\Tests\Common\Persistence\TestObject'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetManagerForProxyInterface() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertNull($this->mr->getManagerForClass('Doctrine\Common\Persistence\ObjectManagerAware')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetManagerForInvalidClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            'ReflectionException', | 
				
			||||||
 | 
					            'Class Doctrine\Tests\Common\Persistence\TestObjectInexistent does not exist' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->mr->getManagerForClass('prefix:TestObjectInexistent'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetManagerForAliasedClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->mr->getManagerForClass('prefix:TestObject'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetManagerForInvalidAliasedClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            'ReflectionException', | 
				
			||||||
 | 
					            'Class Doctrine\Tests\Common\Persistence\TestObject:Foo does not exist' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->mr->getManagerForClass('prefix:TestObject:Foo'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestManager extends PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function getMetadataFactory() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return new TestClassMetadataFactory($driver, $metadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestManagerRegistry extends AbstractManagerRegistry | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    protected function getService($name) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return new TestManager(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritdoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected function resetService($name) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getAliasNamespace($alias) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return __NAMESPACE__; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,29 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Annotations\AnnotationReader; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\AnnotationDriver; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ClassMetadata; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AnnotationDriverTest extends \PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testGetAllClassNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $reader = new AnnotationReader(); | 
				
			||||||
 | 
					        $driver = new SimpleAnnotationDriver($reader, array(__DIR__ . '/_files/annotation')); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classes = $driver->getAllClassNames(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array('Doctrine\TestClass'), $classes); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SimpleAnnotationDriver extends AnnotationDriver | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    protected $entityAnnotationClasses = array('Doctrine\Entity' => true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function loadMetadataForClass($className, ClassMetadata $metadata) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,152 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain; | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DriverChainTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testDelegateToMatchingNamespaceDriver() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; | 
				
			||||||
 | 
					        $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain = new MappingDriverChain(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $driver1->expects($this->never()) | 
				
			||||||
 | 
					                ->method('loadMetadataForClass'); | 
				
			||||||
 | 
					        $driver1->expectS($this->never()) | 
				
			||||||
 | 
					                ->method('isTransient'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $driver2->expects($this->at(0)) | 
				
			||||||
 | 
					                ->method('loadMetadataForClass') | 
				
			||||||
 | 
					                ->with($this->equalTo($className), $this->equalTo($classMetadata)); | 
				
			||||||
 | 
					        $driver2->expects($this->at(1)) | 
				
			||||||
 | 
					                ->method('isTransient') | 
				
			||||||
 | 
					                ->with($this->equalTo($className)) | 
				
			||||||
 | 
					                ->will($this->returnValue( true )); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); | 
				
			||||||
 | 
					        $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain->loadMetadataForClass($className, $classMetadata); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue( $chain->isTransient($className) ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; | 
				
			||||||
 | 
					        $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain = new MappingDriverChain(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); | 
				
			||||||
 | 
					        $chain->loadMetadataForClass($className, $classMetadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGatherAllClassNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; | 
				
			||||||
 | 
					        $classMetadata = $this->getMock('Doctrine\Common\Persistence\ClassMetadata'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain = new MappingDriverChain(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $driver1->expects($this->once()) | 
				
			||||||
 | 
					                ->method('getAllClassNames') | 
				
			||||||
 | 
					                ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $driver2->expects($this->once()) | 
				
			||||||
 | 
					                ->method('getAllClassNames') | 
				
			||||||
 | 
					                ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); | 
				
			||||||
 | 
					        $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array( | 
				
			||||||
 | 
					            'Doctrine\Tests\Models\Company\Foo', | 
				
			||||||
 | 
					            'Doctrine\Tests\ORM\Mapping\Bar', | 
				
			||||||
 | 
					            'Doctrine\Tests\ORM\Mapping\Baz' | 
				
			||||||
 | 
					        ), $chain->getAllClassNames()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @group DDC-706 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testIsTransient() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $chain = new MappingDriverChain(); | 
				
			||||||
 | 
					        $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @group DDC-1412 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testDefaultDriver() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $companyDriver      = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $defaultDriver      = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $entityClassName    = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity'; | 
				
			||||||
 | 
					        $managerClassName   = 'Doctrine\Tests\Models\Company\CompanyManager'; | 
				
			||||||
 | 
					        $chain              = new MappingDriverChain(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $companyDriver->expects($this->never()) | 
				
			||||||
 | 
					            ->method('loadMetadataForClass'); | 
				
			||||||
 | 
					        $companyDriver->expects($this->once()) | 
				
			||||||
 | 
					            ->method('isTransient') | 
				
			||||||
 | 
					            ->with($this->equalTo($managerClassName)) | 
				
			||||||
 | 
					            ->will($this->returnValue(false)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $defaultDriver->expects($this->never()) | 
				
			||||||
 | 
					            ->method('loadMetadataForClass'); | 
				
			||||||
 | 
					        $defaultDriver->expects($this->once()) | 
				
			||||||
 | 
					            ->method('isTransient') | 
				
			||||||
 | 
					            ->with($this->equalTo($entityClassName)) | 
				
			||||||
 | 
					            ->will($this->returnValue(true)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertNull($chain->getDefaultDriver()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain->setDefaultDriver($defaultDriver); | 
				
			||||||
 | 
					        $chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame($defaultDriver, $chain->getDefaultDriver()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($chain->isTransient($entityClassName)); | 
				
			||||||
 | 
					        $this->assertFalse($chain->isTransient($managerClassName)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testDefaultDriverGetAllClassNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $companyDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $defaultDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $chain         = new MappingDriverChain(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $companyDriver->expects($this->once()) | 
				
			||||||
 | 
					            ->method('getAllClassNames') | 
				
			||||||
 | 
					            ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $defaultDriver->expects($this->once()) | 
				
			||||||
 | 
					            ->method('getAllClassNames') | 
				
			||||||
 | 
					            ->will($this->returnValue(array('Other\Class'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $chain->setDefaultDriver($defaultDriver); | 
				
			||||||
 | 
					        $chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classNames = $chain->getAllClassNames(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array('Doctrine\Tests\Models\Company\Foo', 'Other\Class'), $classNames); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DriverChainEntity | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,209 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\DefaultFileLocator; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ReflectionService; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ClassMetadata; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory; | 
				
			||||||
 | 
					use Doctrine\Common\Cache\ArrayCache; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ClassMetadataFactoryTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var TestClassMetadataFactory | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private $cmf; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $this->cmf = new TestClassMetadataFactory($driver, $metadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetCacheDriver() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertNull($this->cmf->getCacheDriver()); | 
				
			||||||
 | 
					        $cache = new ArrayCache(); | 
				
			||||||
 | 
					        $this->cmf->setCacheDriver($cache); | 
				
			||||||
 | 
					        $this->assertSame($cache, $this->cmf->getCacheDriver()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetMetadataFor() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata = $this->cmf->getMetadataFor('stdClass'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); | 
				
			||||||
 | 
					        $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetMetadataForAbsentClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); | 
				
			||||||
 | 
					        $this->cmf->getMetadataFor(__NAMESPACE__ . '\AbsentClass'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetParentMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); | 
				
			||||||
 | 
					        $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); | 
				
			||||||
 | 
					        $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetCachedMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $cache = new ArrayCache(); | 
				
			||||||
 | 
					        $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->cmf->setCacheDriver($cache); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); | 
				
			||||||
 | 
					        $this->assertSame($loadedMetadata, $metadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCacheGetMetadataFor() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $cache = new ArrayCache(); | 
				
			||||||
 | 
					        $this->cmf->setCacheDriver($cache); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAliasedMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->cmf->getMetadataFor('prefix:ChildEntity'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); | 
				
			||||||
 | 
					        $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @group DCOM-270 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testGetInvalidAliasedMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            'Doctrine\Common\Persistence\Mapping\MappingException', | 
				
			||||||
 | 
					            'Class \'Doctrine\Tests\Common\Persistence\Mapping\ChildEntity:Foo\' does not exist' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->cmf->getMetadataFor('prefix:ChildEntity:Foo'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @group DCOM-270 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testClassIsTransient() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertTrue($this->cmf->isTransient('prefix:ChildEntity:Foo')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testWillFallbackOnNotLoadedMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->cmf->fallbackCallback = function () use ($classMetadata) { | 
				
			||||||
 | 
					            return $classMetadata; | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->cmf->metadata = null; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame($classMetadata, $this->cmf->getMetadataFor('Foo')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testWillFailOnFallbackFailureWithNotLoadedMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->cmf->fallbackCallback = function () { | 
				
			||||||
 | 
					            return null; | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->cmf->metadata = null; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->cmf->getMetadataFor('Foo'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestClassMetadataFactory extends AbstractClassMetadataFactory | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public $driver; | 
				
			||||||
 | 
					    public $metadata; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @var callable|null */ | 
				
			||||||
 | 
					    public $fallbackCallback; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($driver, $metadata) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->driver = $driver; | 
				
			||||||
 | 
					        $this->metadata = $metadata; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return __NAMESPACE__ . '\\' . $simpleClassName; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function initialize() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function newClassMetadataInstance($className) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->metadata; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function getDriver() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->driver; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function isEntity(ClassMetadata $class) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return true; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function onNotFoundMetadata($className) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (! $fallback = $this->fallbackCallback) { | 
				
			||||||
 | 
					            return null; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $fallback(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function isTransient($class) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return true; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RootEntity | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ChildEntity extends RootEntity | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,98 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\DefaultFileLocator; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DefaultFileLocatorTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testGetPaths() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array($path)); | 
				
			||||||
 | 
					        $this->assertEquals(array($path), $locator->getPaths()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator($path); | 
				
			||||||
 | 
					        $this->assertEquals(array($path), $locator->getPaths()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetFileExtension() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array(), ".yml"); | 
				
			||||||
 | 
					        $this->assertEquals(".yml", $locator->getFileExtension()); | 
				
			||||||
 | 
					        $locator->setFileExtension(".xml"); | 
				
			||||||
 | 
					        $this->assertEquals(".xml", $locator->getFileExtension()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testUniquePaths() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array($path, $path)); | 
				
			||||||
 | 
					        $this->assertEquals(array($path), $locator->getPaths()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFindMappingFile() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array($path), ".yml"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(__DIR__ . '/_files' . DIRECTORY_SEPARATOR . 'stdClass.yml', $locator->findMappingFile('stdClass')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFindMappingFileNotFound() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array($path), ".yml"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            'Doctrine\Common\Persistence\Mapping\MappingException', | 
				
			||||||
 | 
					            "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $locator->findMappingFile('stdClass2'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAllClassNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array($path), ".yml"); | 
				
			||||||
 | 
					        $allClasses = $locator->getAllClassNames(null); | 
				
			||||||
 | 
					        $globalClasses = $locator->getAllClassNames("global"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $expectedAllClasses    = array('global', 'stdClass', 'subDirClass'); | 
				
			||||||
 | 
					        $expectedGlobalClasses = array('subDirClass', 'stdClass'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sort($allClasses); | 
				
			||||||
 | 
					        sort($globalClasses); | 
				
			||||||
 | 
					        sort($expectedAllClasses); | 
				
			||||||
 | 
					        sort($expectedGlobalClasses); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals($expectedAllClasses, $allClasses); | 
				
			||||||
 | 
					        $this->assertEquals($expectedGlobalClasses, $globalClasses); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAllClassNamesNonMatchingFileExtension() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array($path), ".xml"); | 
				
			||||||
 | 
					        $this->assertEquals(array(), $locator->getAllClassNames("global")); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFileExists() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new DefaultFileLocator(array($path), ".yml"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($locator->fileExists("stdClass")); | 
				
			||||||
 | 
					        $this->assertFalse($locator->fileExists("stdClass2")); | 
				
			||||||
 | 
					        $this->assertTrue($locator->fileExists("global")); | 
				
			||||||
 | 
					        $this->assertFalse($locator->fileExists("global2")); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,142 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\FileDriver; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ClassMetadata; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FileDriverTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testGlobalBasename() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver = new TestFileDriver(array()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertNull($driver->getGlobalBasename()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver->setGlobalBasename("global"); | 
				
			||||||
 | 
					        $this->assertEquals("global", $driver->getGlobalBasename()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetElementFromGlobalFile() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver = new TestFileDriver($this->newLocator()); | 
				
			||||||
 | 
					        $driver->setGlobalBasename("global"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $element = $driver->getElement('stdGlobal'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals('stdGlobal', $element); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetElementFromFile() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = $this->newLocator(); | 
				
			||||||
 | 
					        $locator->expects($this->once()) | 
				
			||||||
 | 
					                ->method('findMappingFile') | 
				
			||||||
 | 
					                ->with($this->equalTo('stdClass')) | 
				
			||||||
 | 
					                ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver = new TestFileDriver($locator); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals('stdClass', $driver->getElement('stdClass')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAllClassNamesGlobalBasename() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver = new TestFileDriver($this->newLocator()); | 
				
			||||||
 | 
					        $driver->setGlobalBasename("global"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classNames = $driver->getAllClassNames(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAllClassNamesFromMappingFile() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = $this->newLocator(); | 
				
			||||||
 | 
					        $locator->expects($this->any()) | 
				
			||||||
 | 
					                ->method('getAllClassNames') | 
				
			||||||
 | 
					                ->with($this->equalTo(null)) | 
				
			||||||
 | 
					                ->will($this->returnValue(array('stdClass'))); | 
				
			||||||
 | 
					        $driver = new TestFileDriver($locator); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classNames = $driver->getAllClassNames(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array('stdClass'), $classNames); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAllClassNamesBothSources() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = $this->newLocator(); | 
				
			||||||
 | 
					        $locator->expects($this->any()) | 
				
			||||||
 | 
					                ->method('getAllClassNames') | 
				
			||||||
 | 
					                ->with($this->equalTo('global')) | 
				
			||||||
 | 
					                ->will($this->returnValue(array('stdClass'))); | 
				
			||||||
 | 
					        $driver = new TestFileDriver($locator); | 
				
			||||||
 | 
					        $driver->setGlobalBasename("global"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classNames = $driver->getAllClassNames(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testIsNotTransient() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = $this->newLocator(); | 
				
			||||||
 | 
					        $locator->expects($this->once()) | 
				
			||||||
 | 
					                ->method('fileExists') | 
				
			||||||
 | 
					                ->with($this->equalTo('stdClass')) | 
				
			||||||
 | 
					                ->will($this->returnValue( true )); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver = new TestFileDriver($locator); | 
				
			||||||
 | 
					        $driver->setGlobalBasename("global"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse($driver->isTransient('stdClass')); | 
				
			||||||
 | 
					        $this->assertFalse($driver->isTransient('stdGlobal')); | 
				
			||||||
 | 
					        $this->assertFalse($driver->isTransient('stdGlobal2')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testIsTransient() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = $this->newLocator(); | 
				
			||||||
 | 
					        $locator->expects($this->once()) | 
				
			||||||
 | 
					                ->method('fileExists') | 
				
			||||||
 | 
					                ->with($this->equalTo('stdClass2')) | 
				
			||||||
 | 
					                ->will($this->returnValue( false )); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver = new TestFileDriver($locator); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($driver->isTransient('stdClass2')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNonLocatorFallback() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); | 
				
			||||||
 | 
					        $this->assertTrue($driver->isTransient('stdClass2')); | 
				
			||||||
 | 
					        $this->assertFalse($driver->isTransient('stdClass')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private function newLocator() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); | 
				
			||||||
 | 
					        $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); | 
				
			||||||
 | 
					        $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); | 
				
			||||||
 | 
					        return $locator; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestFileDriver extends FileDriver | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    protected function loadMappingFile($file) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (strpos($file, "global.yml") !== false) { | 
				
			||||||
 | 
					            return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        return array('stdClass' => 'stdClass'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function loadMetadataForClass($className, ClassMetadata $metadata) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,18 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\PHPDriver; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PHPDriverTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testLoadMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $metadata->expects($this->once())->method('getFieldNames'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver = new PHPDriver(array(__DIR__ . "/_files")); | 
				
			||||||
 | 
					        $driver->loadMetadataForClass('TestEntity', $metadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,84 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @group DCOM-93 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var RuntimeReflectionService | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private $reflectionService; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public $unusedPublicProperty; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->reflectionService = new RuntimeReflectionService(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testShortname() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassNamespaceName() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetParentClasses() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classes = $this->reflectionService->getParentClasses(__CLASS__); | 
				
			||||||
 | 
					        $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetParentClassesForAbsentClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); | 
				
			||||||
 | 
					        $this->reflectionService->getParentClasses(__NAMESPACE__ . '\AbsentClass'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetReflectionClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $class = $this->reflectionService->getClass(__CLASS__); | 
				
			||||||
 | 
					        $this->assertInstanceOf("ReflectionClass", $class); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetMethods() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); | 
				
			||||||
 | 
					        $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAccessibleProperty() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); | 
				
			||||||
 | 
					        $this->assertInstanceOf("ReflectionProperty", $reflProp); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "unusedPublicProperty"); | 
				
			||||||
 | 
					        $this->assertInstanceOf("Doctrine\Common\Reflection\RuntimePublicReflectionProperty", $reflProp); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,35 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class StaticPHPDriverTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testLoadMetadata() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $metadata->expects($this->once())->method('getFieldNames'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $driver = new StaticPHPDriver(array(__DIR__)); | 
				
			||||||
 | 
					        $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAllClassNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $driver = new StaticPHPDriver(array(__DIR__)); | 
				
			||||||
 | 
					        $classNames = $driver->getAllClassNames(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertContains( | 
				
			||||||
 | 
					            'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestEntity | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    static public function loadMetadata($metadata) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata->getFieldNames(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,70 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\StaticReflectionService; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @group DCOM-93 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    private $reflectionService; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->reflectionService = new StaticReflectionService(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testShortname() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassNamespaceName() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetParentClasses() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classes = $this->reflectionService->getParentClasses(__CLASS__); | 
				
			||||||
 | 
					        $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetReflectionClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $class = $this->reflectionService->getClass(__CLASS__); | 
				
			||||||
 | 
					        $this->assertNull($class); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetMethods() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); | 
				
			||||||
 | 
					        $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAccessibleProperty() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); | 
				
			||||||
 | 
					        $this->assertNull($reflProp); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,181 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence\Mapping; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SymfonyFileLocatorTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testGetPaths() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix)); | 
				
			||||||
 | 
					        $this->assertEquals(array($path), $locator->getPaths()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix)); | 
				
			||||||
 | 
					        $this->assertEquals(array($path), $locator->getPaths()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetPrefixes() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix)); | 
				
			||||||
 | 
					        $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetFileExtension() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array(), ".yml"); | 
				
			||||||
 | 
					        $this->assertEquals(".yml", $locator->getFileExtension()); | 
				
			||||||
 | 
					        $locator->setFileExtension(".xml"); | 
				
			||||||
 | 
					        $this->assertEquals(".xml", $locator->getFileExtension()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFileExists() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($locator->fileExists("Foo\stdClass")); | 
				
			||||||
 | 
					        $this->assertTrue($locator->fileExists("Foo\global")); | 
				
			||||||
 | 
					        $this->assertFalse($locator->fileExists("Foo\stdClass2")); | 
				
			||||||
 | 
					        $this->assertFalse($locator->fileExists("Foo\global2")); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetAllClassNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); | 
				
			||||||
 | 
					        $allClasses = $locator->getAllClassNames(null); | 
				
			||||||
 | 
					        $globalClasses = $locator->getAllClassNames("global"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $expectedAllClasses    = array("Foo\\Bar\\subDirClass", "Foo\\global", "Foo\\stdClass"); | 
				
			||||||
 | 
					        $expectedGlobalClasses = array("Foo\\Bar\\subDirClass", "Foo\\stdClass"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sort($allClasses); | 
				
			||||||
 | 
					        sort($globalClasses); | 
				
			||||||
 | 
					        sort($expectedAllClasses); | 
				
			||||||
 | 
					        sort($expectedGlobalClasses); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals($expectedAllClasses, $allClasses); | 
				
			||||||
 | 
					        $this->assertEquals($expectedGlobalClasses, $globalClasses); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @expectedException \InvalidArgumentException | 
				
			||||||
 | 
					     * @expectedExceptionMessage Namespace separator should not be empty | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testInvalidCustomNamespaceSeparator() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        new SymfonyFileLocator(array($path => $prefix), ".yml", null); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function customNamespaceSeparatorProvider() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array( | 
				
			||||||
 | 
					            'directory separator' => array(DIRECTORY_SEPARATOR, "/_custom_ns/dir"), | 
				
			||||||
 | 
					            'default dot separator' => array('.', "/_custom_ns/dot"), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @dataProvider customNamespaceSeparatorProvider | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @param $separator string Directory separator to test against | 
				
			||||||
 | 
					     * @param $dir       string Path to load mapping data from | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @throws \Doctrine\Common\Persistence\Mapping\MappingException | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testGetClassNamesWithCustomNsSeparator($separator, $dir) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . $dir; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix), ".yml", $separator); | 
				
			||||||
 | 
					        $classes = $locator->getAllClassNames(null); | 
				
			||||||
 | 
					        sort($classes); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array("Foo\\stdClass", "Foo\\sub\\subClass", "Foo\\sub\\subsub\\subSubClass"), $classes); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function customNamespaceLookupQueryProvider() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array( | 
				
			||||||
 | 
					            'directory separator'  => array( | 
				
			||||||
 | 
					                DIRECTORY_SEPARATOR, | 
				
			||||||
 | 
					                "/_custom_ns/dir", | 
				
			||||||
 | 
					                array( | 
				
			||||||
 | 
					                    "stdClass.yml"               => "Foo\\stdClass", | 
				
			||||||
 | 
					                    "sub/subClass.yml"           => "Foo\\sub\\subClass", | 
				
			||||||
 | 
					                    "sub/subsub/subSubClass.yml" => "Foo\\sub\\subsub\\subSubClass", | 
				
			||||||
 | 
					                ) | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					            'default dot separator' => array( | 
				
			||||||
 | 
					                '.', | 
				
			||||||
 | 
					                "/_custom_ns/dot", | 
				
			||||||
 | 
					                array( | 
				
			||||||
 | 
					                    "stdClass.yml"               => "Foo\\stdClass", | 
				
			||||||
 | 
					                    "sub.subClass.yml"           => "Foo\\sub\\subClass", | 
				
			||||||
 | 
					                    "sub.subsub.subSubClass.yml" => "Foo\\sub\\subsub\\subSubClass", | 
				
			||||||
 | 
					                ) | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @dataProvider customNamespaceLookupQueryProvider | 
				
			||||||
 | 
					     * @param $separator string Directory separator to test against | 
				
			||||||
 | 
					     * @param $dir       string Path to load mapping data from | 
				
			||||||
 | 
					     * @param $files     array  Files to lookup classnames | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @throws \Doctrine\Common\Persistence\Mapping\MappingException | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testFindMappingFileWithCustomNsSeparator($separator, $dir, $files) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path   = __DIR__ . $dir; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix), ".yml", $separator); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        foreach ($files as $filePath => $className) { | 
				
			||||||
 | 
					            $this->assertEquals(realpath($path .'/'. $filePath), realpath($locator->findMappingFile($className))); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFindMappingFile() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFindMappingFileNotFound() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $path = __DIR__ . "/_files"; | 
				
			||||||
 | 
					        $prefix = "Foo"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            "Doctrine\Common\Persistence\Mapping\MappingException", | 
				
			||||||
 | 
					            "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $locator->findMappingFile("Foo\\stdClass2"); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1,3 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$metadata->getFieldNames(); | 
				
			||||||
@ -0,0 +1,17 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @Doctrine\Entity | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class TestClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @Annotation | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class Entity | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1 @@ | 
				
			|||||||
 | 
					test | 
				
			||||||
@ -0,0 +1,60 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\ObjectManagerDecorator; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\ObjectManager; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NullObjectManagerDecorator extends ObjectManagerDecorator | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function __construct(ObjectManager $wrapped) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->wrapped = $wrapped; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ObjectManagerDecoratorTest extends \PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    private $wrapped; | 
				
			||||||
 | 
					    private $decorated; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->wrapped = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); | 
				
			||||||
 | 
					        $this->decorated = new NullObjectManagerDecorator($this->wrapped); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getMethodParameters() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $class = new \ReflectionClass('Doctrine\Common\Persistence\ObjectManager'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $methods = array(); | 
				
			||||||
 | 
					        foreach ($class->getMethods() as $method) { | 
				
			||||||
 | 
					            if ($method->getNumberOfRequiredParameters() === 0) { | 
				
			||||||
 | 
					               $methods[] = array($method->getName(), array()); | 
				
			||||||
 | 
					            } elseif ($method->getNumberOfRequiredParameters() > 0) { | 
				
			||||||
 | 
					                $methods[] = array($method->getName(), array_fill(0, $method->getNumberOfRequiredParameters(), 'req') ?: array()); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					            if ($method->getNumberOfParameters() != $method->getNumberOfRequiredParameters()) { | 
				
			||||||
 | 
					                $methods[] = array($method->getName(), array_fill(0, $method->getNumberOfParameters(), 'all') ?: array()); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $methods; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @dataProvider getMethodParameters | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testAllMethodCallsAreDelegatedToTheWrappedInstance($method, array $parameters) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $stub = $this->wrapped | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method($method) | 
				
			||||||
 | 
					            ->will($this->returnValue('INNER VALUE FROM ' . $method)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        call_user_func_array(array($stub, 'with'), $parameters); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('INNER VALUE FROM ' . $method, call_user_func_array(array($this->decorated, $method), $parameters)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,247 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Persistence; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\PersistentObject; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ClassMetadata; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ReflectionService; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @group DDC-1448 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class PersistentObjectTest extends \Doctrine\Tests\DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    private $cm; | 
				
			||||||
 | 
					    private $om; | 
				
			||||||
 | 
					    private $object; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->cm = new TestObjectMetadata; | 
				
			||||||
 | 
					        $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); | 
				
			||||||
 | 
					        $this->om->expects($this->any())->method('getClassMetadata') | 
				
			||||||
 | 
					                 ->will($this->returnValue($this->cm)); | 
				
			||||||
 | 
					        $this->object = new TestObject; | 
				
			||||||
 | 
					        PersistentObject::setObjectManager($this->om); | 
				
			||||||
 | 
					        $this->object->injectObjectManager($this->om, $this->cm); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetObjectManager() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertSame($this->om, PersistentObject::getObjectManager()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNonMatchingObjectManager() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('RuntimeException'); | 
				
			||||||
 | 
					        $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); | 
				
			||||||
 | 
					        $this->object->injectObjectManager($om, $this->cm); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetField() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertEquals('beberlei', $this->object->getName()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSetField() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->object->setName("test"); | 
				
			||||||
 | 
					        $this->assertEquals("test", $this->object->getName()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetIdentifier() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertEquals(1, $this->object->getId()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSetIdentifier() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('BadMethodCallException'); | 
				
			||||||
 | 
					        $this->object->setId(2); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSetUnknownField() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('BadMethodCallException'); | 
				
			||||||
 | 
					        $this->object->setUnknown("test"); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetUnknownField() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('BadMethodCallException'); | 
				
			||||||
 | 
					        $this->object->getUnknown(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetToOneAssociation() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertNull($this->object->getParent()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSetToOneAssociation() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $parent = new TestObject(); | 
				
			||||||
 | 
					        $this->object->setParent($parent); | 
				
			||||||
 | 
					        $this->assertSame($parent, $this->object->getParent($parent)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSetInvalidToOneAssociation() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $parent = new \stdClass(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException('InvalidArgumentException'); | 
				
			||||||
 | 
					        $this->object->setParent($parent); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSetToOneAssociationNull() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $parent = new TestObject(); | 
				
			||||||
 | 
					        $this->object->setParent($parent); | 
				
			||||||
 | 
					        $this->object->setParent(null); | 
				
			||||||
 | 
					        $this->assertNull($this->object->getParent()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testAddToManyAssociation() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $child = new TestObject(); | 
				
			||||||
 | 
					        $this->object->addChildren($child); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame($this->object, $child->getParent()); | 
				
			||||||
 | 
					        $this->assertEquals(1, count($this->object->getChildren())); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $child = new TestObject(); | 
				
			||||||
 | 
					        $this->object->addChildren($child); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(2, count($this->object->getChildren())); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testAddInvalidToManyAssociation() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('InvalidArgumentException'); | 
				
			||||||
 | 
					        $this->object->addChildren(new \stdClass()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNoObjectManagerSet() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        PersistentObject::setObjectManager(null); | 
				
			||||||
 | 
					        $child = new TestObject(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException('RuntimeException'); | 
				
			||||||
 | 
					        $child->setName("test"); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInvalidMethod() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('BadMethodCallException'); | 
				
			||||||
 | 
					        $this->object->asdf(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testAddInvalidCollection() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('BadMethodCallException'); | 
				
			||||||
 | 
					        $this->object->addAsdf(new \stdClass()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestObject extends PersistentObject | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    protected $id = 1; | 
				
			||||||
 | 
					    protected $name = 'beberlei'; | 
				
			||||||
 | 
					    protected $parent; | 
				
			||||||
 | 
					    protected $children; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestObjectMetadata implements ClassMetadata | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getAssociationMappedByTargetField($assocName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $assoc = array('children' => 'parent'); | 
				
			||||||
 | 
					        return $assoc[$assocName]; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getAssociationNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array('parent', 'children'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getAssociationTargetClass($assocName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return __NAMESPACE__ . '\TestObject'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getFieldNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array('id', 'name'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getIdentifier() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array('id'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getName() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return __NAMESPACE__ . '\TestObject'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getReflectionClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return new \ReflectionClass($this->getName()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getTypeOfField($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $types = array('id' => 'integer', 'name' => 'string'); | 
				
			||||||
 | 
					        return $types[$fieldName]; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function hasAssociation($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return in_array($fieldName, array('parent', 'children')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function hasField($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return in_array($fieldName, array('id', 'name')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function isAssociationInverseSide($assocName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return ($assocName === 'children'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function isCollectionValuedAssociation($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return ($fieldName === 'children'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function isIdentifier($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $fieldName === 'id'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function isSingleValuedAssociation($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $fieldName === 'parent'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getIdentifierValues($entity) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getIdentifierFieldNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function initializeReflection(ReflectionService $reflService) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function wakeupReflection(ReflectionService $reflService) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,146 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\ProxyDefinition; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AbstractProxyFactoryTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testGenerateProxyClasses() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata       = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $proxyGenerator = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyGenerator | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('getProxyFileName'); | 
				
			||||||
 | 
					        $proxyGenerator | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('generateProxyClass'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory'); | 
				
			||||||
 | 
					        $proxyFactory    = $this->getMockForAbstractClass( | 
				
			||||||
 | 
					            'Doctrine\Common\Proxy\AbstractProxyFactory', | 
				
			||||||
 | 
					            array($proxyGenerator, $metadataFactory, true) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('skipClass') | 
				
			||||||
 | 
					            ->will($this->returnValue(false)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $generated = $proxyFactory->generateProxyClasses(array($metadata), sys_get_temp_dir()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(1, $generated, 'One proxy was generated'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetProxy() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata        = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $proxy           = $this->getMock('Doctrine\Common\Proxy\Proxy'); | 
				
			||||||
 | 
					        $definition      = new ProxyDefinition(get_class($proxy), array(), array(), null, null); | 
				
			||||||
 | 
					        $proxyGenerator  = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false); | 
				
			||||||
 | 
					        $metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadataFactory | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('getMetadataFor') | 
				
			||||||
 | 
					            ->will($this->returnValue($metadata)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory = $this->getMockForAbstractClass( | 
				
			||||||
 | 
					            'Doctrine\Common\Proxy\AbstractProxyFactory', | 
				
			||||||
 | 
					            array($proxyGenerator, $metadataFactory, true) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('createProxyDefinition') | 
				
			||||||
 | 
					            ->will($this->returnValue($definition)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $generatedProxy = $proxyFactory->getProxy('Class', array('id' => 1)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertInstanceOf(get_class($proxy), $generatedProxy); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testResetUnitializedProxy() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata        = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $proxy           = $this->getMock('Doctrine\Common\Proxy\Proxy'); | 
				
			||||||
 | 
					        $definition      = new ProxyDefinition(get_class($proxy), array(), array(), null, null); | 
				
			||||||
 | 
					        $proxyGenerator  = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false); | 
				
			||||||
 | 
					        $metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadataFactory | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('getMetadataFor') | 
				
			||||||
 | 
					            ->will($this->returnValue($metadata)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory = $this->getMockForAbstractClass( | 
				
			||||||
 | 
					            'Doctrine\Common\Proxy\AbstractProxyFactory', | 
				
			||||||
 | 
					            array($proxyGenerator, $metadataFactory, true) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('createProxyDefinition') | 
				
			||||||
 | 
					            ->will($this->returnValue($definition)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('__isInitialized') | 
				
			||||||
 | 
					            ->will($this->returnValue(false)); | 
				
			||||||
 | 
					        $proxy | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('__setInitializer'); | 
				
			||||||
 | 
					        $proxy | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('__setCloner'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory->resetUninitializedProxy($proxy); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testDisallowsResettingInitializedProxy() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyFactory = $this->getMockForAbstractClass('Doctrine\Common\Proxy\AbstractProxyFactory',  array(), '', false); | 
				
			||||||
 | 
					        $proxy        = $this->getMock('Doctrine\Common\Proxy\Proxy'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('__isInitialized') | 
				
			||||||
 | 
					            ->will($this->returnValue(true)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory->resetUninitializedProxy($proxy); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testMissingPrimaryKeyValue() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata        = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $proxy           = $this->getMock('Doctrine\Common\Proxy\Proxy'); | 
				
			||||||
 | 
					        $definition      = new ProxyDefinition(get_class($proxy), array('missingKey'), array(), null, null); | 
				
			||||||
 | 
					        $proxyGenerator  = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false); | 
				
			||||||
 | 
					        $metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadataFactory | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('getMetadataFor') | 
				
			||||||
 | 
					            ->will($this->returnValue($metadata)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory = $this->getMockForAbstractClass( | 
				
			||||||
 | 
					            'Doctrine\Common\Proxy\AbstractProxyFactory', | 
				
			||||||
 | 
					            array($proxyGenerator, $metadataFactory, true) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyFactory | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('createProxyDefinition') | 
				
			||||||
 | 
					            ->will($this->returnValue($definition)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException('\OutOfBoundsException'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $generatedProxy = $proxyFactory->getProxy('Class', array()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,72 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use PHPUnit_Framework_TestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\Autoloader; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @group DDC-1698 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class AutoloaderTest extends PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public static function dataResolveFile() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array( | 
				
			||||||
 | 
					            array('/tmp', 'MyProxy', 'MyProxy\__CG__\RealClass', '/tmp' . DIRECTORY_SEPARATOR . '__CG__RealClass.php'), | 
				
			||||||
 | 
					            array('/tmp', 'MyProxy\Subdir', 'MyProxy\Subdir\__CG__\RealClass', '/tmp' . DIRECTORY_SEPARATOR . '__CG__RealClass.php'), | 
				
			||||||
 | 
					            array('/tmp', 'MyProxy', 'MyProxy\__CG__\Other\RealClass', '/tmp' . DIRECTORY_SEPARATOR . '__CG__OtherRealClass.php'), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @dataProvider dataResolveFile | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testResolveFile($proxyDir, $proxyNamespace, $className, $expectedProxyFile) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $actualProxyFile = Autoloader::resolveFile($proxyDir, $proxyNamespace, $className); | 
				
			||||||
 | 
					        $this->assertEquals($expectedProxyFile, $actualProxyFile); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testAutoload() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (file_exists(sys_get_temp_dir() ."/AutoloaderTestClass.php")) { | 
				
			||||||
 | 
					            unlink(sys_get_temp_dir() ."/AutoloaderTestClass.php"); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $autoloader = Autoloader::register(sys_get_temp_dir(), 'ProxyAutoloaderTest', function($proxyDir, $proxyNamespace, $className) { | 
				
			||||||
 | 
					            file_put_contents(sys_get_temp_dir() . "/AutoloaderTestClass.php", "<?php namespace ProxyAutoloaderTest; class AutoloaderTestClass {} ");
 | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue(class_exists('ProxyAutoloaderTest\AutoloaderTestClass', true)); | 
				
			||||||
 | 
					        unlink(sys_get_temp_dir() ."/AutoloaderTestClass.php"); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testRegisterWithInvalidCallback() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            'Doctrine\Common\Proxy\Exception\InvalidArgumentException', | 
				
			||||||
 | 
					            'Invalid \$notFoundCallback given: must be a callable, "stdClass" given' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Autoloader::register('', '', new \stdClass()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,16 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class CallableTypeHintClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param callable $foo | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function call(callable $foo) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,16 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class InvalidTypeHintClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param InvalidHint (non existing class type hint) | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function invalidTypeHintMethod(InvalidHint $foo) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,115 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset representing a lazy loadable object | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * @author Marco Pivetta <ocramius@gmail.com> | 
				
			||||||
 | 
					 * @since  2.4 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class LazyLoadableObject | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicIdentifierField; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $protectedIdentifierField; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicTransientField            = 'publicTransientFieldValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $protectedTransientField      = 'protectedTransientFieldValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicPersistentField           = 'publicPersistentFieldValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $protectedPersistentField     = 'protectedPersistentFieldValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicAssociation               = 'publicAssociationValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $protectedAssociation         = 'protectedAssociationValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getProtectedIdentifierField() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->protectedIdentifierField; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testInitializationTriggeringMethod() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return 'testInitializationTriggeringMethod'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getProtectedAssociation() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->protectedAssociation; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param \stdClass $param | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function publicTypeHintedMethod(\stdClass $param) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function &byRefMethod() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param mixed $thisIsNotByRef | 
				
			||||||
 | 
					     * @param &mixed $thisIsByRef | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function byRefParamMethod($thisIsNotByRef, &$thisIsByRef) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,195 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use ReflectionClass; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ClassMetadata; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Class metadata test asset for @see LazyLoadableObject | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * @author Marco Pivetta <ocramius@gmail.com> | 
				
			||||||
 | 
					 * @since  2.4 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class LazyLoadableObjectClassMetadata implements ClassMetadata | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var ReflectionClass | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $reflectionClass; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var array | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $identifier = array( | 
				
			||||||
 | 
					        'publicIdentifierField'    => true, | 
				
			||||||
 | 
					        'protectedIdentifierField' => true, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var array | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $fields = array( | 
				
			||||||
 | 
					        'publicIdentifierField'    => true, | 
				
			||||||
 | 
					        'protectedIdentifierField' => true, | 
				
			||||||
 | 
					        'publicPersistentField'    => true, | 
				
			||||||
 | 
					        'protectedPersistentField' => true, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var array | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $associations = array( | 
				
			||||||
 | 
					        'publicAssociation'        => true, | 
				
			||||||
 | 
					        'protectedAssociation'     => true, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getName() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->getReflectionClass()->getName(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getIdentifier() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array_keys($this->identifier); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getReflectionClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (null === $this->reflectionClass) { | 
				
			||||||
 | 
					            $this->reflectionClass = new \ReflectionClass(__NAMESPACE__ . '\LazyLoadableObject'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $this->reflectionClass; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function isIdentifier($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return isset($this->identifier[$fieldName]); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function hasField($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return isset($this->fields[$fieldName]); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function hasAssociation($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return isset($this->associations[$fieldName]); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function isSingleValuedAssociation($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        throw new \BadMethodCallException('not implemented'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function isCollectionValuedAssociation($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        throw new \BadMethodCallException('not implemented'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getFieldNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array_keys($this->fields); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getIdentifierFieldNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->getIdentifier(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getAssociationNames() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array_keys($this->associations); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getTypeOfField($fieldName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return 'string'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getAssociationTargetClass($assocName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        throw new \BadMethodCallException('not implemented'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function isAssociationInverseSide($assocName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        throw new \BadMethodCallException('not implemented'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getAssociationMappedByTargetField($assocName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        throw new \BadMethodCallException('not implemented'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getIdentifierValues($object) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        throw new \BadMethodCallException('not implemented'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,37 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class MagicCloneClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $id = 'id'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicField = 'publicField'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var boolean | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $cloned = false; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $clonedValue = 'defaultValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return void | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __clone() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->clonedValue = 'newClonedValue'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,51 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use InvalidArgumentException; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * @since 2.4 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class MagicGetByRefClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var mixed | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $valueField; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param string $name | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return mixed | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @throws \InvalidArgumentException | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function & __get($name) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if ($name === 'value') { | 
				
			||||||
 | 
					            return $this->valueField; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        throw new InvalidArgumentException(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,38 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class MagicGetClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $id = 'id'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicField = 'publicField'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param $name | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return string | 
				
			||||||
 | 
					     * @throws \BadMethodCallException | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __get($name) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if ($name === 'test') { | 
				
			||||||
 | 
					            return 'test'; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($name === 'publicField' || $name === 'id') { | 
				
			||||||
 | 
					            throw new \BadMethodCallException('Should never be called for "publicField" or "id"'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return 'not defined'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,38 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class MagicIssetClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $id = 'id'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicField = 'publicField'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param string $name | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return bool | 
				
			||||||
 | 
					     * @throws \BadMethodCallException | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __isset($name) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if ('test' === $name) { | 
				
			||||||
 | 
					            return true; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ('publicField' === $name || 'id' === $name) { | 
				
			||||||
 | 
					            throw new \BadMethodCallException('Should never be called for "publicField" or "id"'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return false; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,43 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class MagicSetClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $id = 'id'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicField = 'publicField'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string|null | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $testAttribute; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param string $name | 
				
			||||||
 | 
					     * @param mixed  $value | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @throws \BadMethodCallException | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __set($name, $value) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if ($name === 'test') { | 
				
			||||||
 | 
					            $this->testAttribute = $value; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($name === 'publicField' || $name === 'id') { | 
				
			||||||
 | 
					            throw new \BadMethodCallException('Should never be called for "publicField" or "id"'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->testAttribute = $value; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,37 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class MagicSleepClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $id = 'id'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicField = 'publicField'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $serializedField = 'defaultValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $nonSerializedField = 'defaultValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return array | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __sleep() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array('serializedField'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,32 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class MagicWakeupClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $id = 'id'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $publicField = 'publicField'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $wakeupValue = 'defaultValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return void | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __wakeup() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->wakeupValue = 'newWakeupValue'; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,249 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\ProxyGenerator; | 
				
			||||||
 | 
					use ReflectionClass; | 
				
			||||||
 | 
					use ReflectionMethod; | 
				
			||||||
 | 
					use PHPUnit_Framework_TestCase; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test the proxy generator. Its work is generating on-the-fly subclasses of a given model, which implement the Proxy | 
				
			||||||
 | 
					 * pattern. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com> | 
				
			||||||
 | 
					 * @author Marco Pivetta <ocramius@gmail.com> | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class ProxyClassGeneratorTest extends PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $proxyClass = 'Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\LazyLoadableObject'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var LazyLoadableObjectClassMetadata | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $metadata; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var ProxyGenerator | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $proxyGenerator; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->metadata       = new LazyLoadableObjectClassMetadata(); | 
				
			||||||
 | 
					        $this->proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (class_exists($this->proxyClass, false)) { | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->generateAndRequire($this->proxyGenerator, $this->metadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testReferenceProxyRespectsMethodsParametersTypeHinting() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $method = new ReflectionMethod($this->proxyClass, 'publicTypeHintedMethod'); | 
				
			||||||
 | 
					        $params = $method->getParameters(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(1, count($params)); | 
				
			||||||
 | 
					        $this->assertEquals('stdClass', $params[0]->getClass()->getName()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testProxyRespectsMethodsWhichReturnValuesByReference() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $method = new ReflectionMethod($this->proxyClass, 'byRefMethod'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($method->returnsReference()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testProxyRespectsByRefMethodParameters() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $method = new ReflectionMethod($this->proxyClass, 'byRefParamMethod'); | 
				
			||||||
 | 
					        $parameters = $method->getParameters(); | 
				
			||||||
 | 
					        $this->assertSame('thisIsNotByRef', $parameters[0]->getName()); | 
				
			||||||
 | 
					        $this->assertFalse($parameters[0]->isPassedByReference()); | 
				
			||||||
 | 
					        $this->assertSame('thisIsByRef', $parameters[1]->getName()); | 
				
			||||||
 | 
					        $this->assertTrue($parameters[1]->isPassedByReference()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCreatesAssociationProxyAsSubclassOfTheOriginalOne() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->assertTrue(is_subclass_of($this->proxyClass, $this->metadata->getName())); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNonNamespacedProxyGeneration() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $classCode = file_get_contents($this->proxyGenerator->getProxyFileName($this->metadata->getName())); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertNotContains("class LazyLoadableObject extends \\\\" . $this->metadata->getName(), $classCode); | 
				
			||||||
 | 
					        $this->assertContains("class LazyLoadableObject extends \\" . $this->metadata->getName(), $classCode); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassWithSleepProxyGeneration() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\SleepClass', false)) { | 
				
			||||||
 | 
					            $className = 'Doctrine\Tests\Common\Proxy\SleepClass'; | 
				
			||||||
 | 
					            $metadata = $this->createClassMetadata($className, array('id')); | 
				
			||||||
 | 
					            $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $this->generateAndRequire($proxyGenerator, $metadata); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxySleepClass.php'); | 
				
			||||||
 | 
					        $this->assertEquals(1, substr_count($classCode, 'function __sleep')); | 
				
			||||||
 | 
					        $this->assertEquals(1, substr_count($classCode, 'parent::__sleep()')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * Check that the proxy doesn't serialize static properties (in __sleep() method) | 
				
			||||||
 | 
					     * @group DCOM-212 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testClassWithStaticPropertyProxyGeneration() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\StaticPropertyClass', false)) { | 
				
			||||||
 | 
					            $className = 'Doctrine\Tests\Common\Proxy\StaticPropertyClass'; | 
				
			||||||
 | 
					            $metadata = $this->createClassMetadata($className, array()); | 
				
			||||||
 | 
					            $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $this->generateAndRequire($proxyGenerator, $metadata); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyStaticPropertyClass.php'); | 
				
			||||||
 | 
					        $this->assertEquals(1, substr_count($classCode, 'function __sleep')); | 
				
			||||||
 | 
					        $this->assertNotContains('protectedStaticProperty', $classCode); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private function generateAndRequire($proxyGenerator, $metadata) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyGenerator->generateProxyClass($metadata, $proxyGenerator->getProxyFileName($metadata->getName())); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        require_once $proxyGenerator->getProxyFileName($metadata->getName()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassWithCallableTypeHintOnProxiedMethod() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (PHP_VERSION_ID < 50400) { | 
				
			||||||
 | 
					            $this->markTestSkipped('`callable` is only supported in PHP >=5.4.0'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\CallableTypeHintClass', false)) { | 
				
			||||||
 | 
					            $className = 'Doctrine\Tests\Common\Proxy\CallableTypeHintClass'; | 
				
			||||||
 | 
					            $metadata = $this->createClassMetadata($className, array('id')); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					            $this->generateAndRequire($proxyGenerator, $metadata); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyCallableTypeHintClass.php'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(1, substr_count($classCode, 'call(callable $foo)')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassWithVariadicArgumentOnProxiedMethod() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (PHP_VERSION_ID < 50600) { | 
				
			||||||
 | 
					            $this->markTestSkipped('`...` is only supported in PHP >=5.6.0'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\VariadicTypeHintClass', false)) { | 
				
			||||||
 | 
					            $className = 'Doctrine\Tests\Common\Proxy\VariadicTypeHintClass'; | 
				
			||||||
 | 
					            $metadata = $this->createClassMetadata($className, array('id')); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					            $this->generateAndRequire($proxyGenerator, $metadata); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyVariadicTypeHintClass.php'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(1, substr_count($classCode, 'function addType(...$types)')); | 
				
			||||||
 | 
					        $this->assertEquals(1, substr_count($classCode, '__invoke($this, \'addType\', array($types))')); | 
				
			||||||
 | 
					        $this->assertEquals(1, substr_count($classCode, 'parent::addType(...$types)')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testClassWithInvalidTypeHintOnProxiedMethod() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $className = 'Doctrine\Tests\Common\Proxy\InvalidTypeHintClass'; | 
				
			||||||
 | 
					        $metadata = $this->createClassMetadata($className, array('id')); | 
				
			||||||
 | 
					        $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            'Doctrine\Common\Proxy\Exception\UnexpectedValueException', | 
				
			||||||
 | 
					            'The type hint of parameter "foo" in method "invalidTypeHintMethod"' | 
				
			||||||
 | 
					                .' in class "' . $className . '" is invalid.' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $proxyGenerator->generateProxyClass($metadata); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNoConfigDirThrowsException() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException'); | 
				
			||||||
 | 
					        new ProxyGenerator(null, null); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNoNamespaceThrowsException() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException'); | 
				
			||||||
 | 
					        new ProxyGenerator(__DIR__ . '/generated', null); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInvalidPlaceholderThrowsException() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException'); | 
				
			||||||
 | 
					        $generator = new ProxyGenerator(__DIR__ . '/generated', 'SomeNamespace'); | 
				
			||||||
 | 
					        $generator->setPlaceholder('<somePlaceholder>', array()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testUseEvalIfNoFilenameIsGiven() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $className = __NAMESPACE__ . '\\EvalBase'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata = $this->createClassMetadata($className, array('id')); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyGenerator->generateProxyClass($metadata); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $reflClass = new ReflectionClass('Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\EvalBase'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertContains("eval()'d code", $reflClass->getFileName()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private function createClassMetadata($className, array $ids) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					        $reflClass = new ReflectionClass($className); | 
				
			||||||
 | 
					        $metadata->expects($this->any())->method('getReflectionClass')->will($this->returnValue($reflClass)); | 
				
			||||||
 | 
					        $metadata->expects($this->any())->method('getIdentifierFieldNames')->will($this->returnValue($ids)); | 
				
			||||||
 | 
					        $metadata->expects($this->any())->method('getName')->will($this->returnValue($className)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $metadata; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EvalBase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,752 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\ProxyGenerator; | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\Proxy; | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\Exception\UnexpectedValueException; | 
				
			||||||
 | 
					use Doctrine\Common\Persistence\Mapping\ClassMetadata; | 
				
			||||||
 | 
					use PHPUnit_Framework_TestCase; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test the generated proxies behavior. These tests make assumptions about the structure of LazyLoadableObject | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * @author Marco Pivetta <ocramius@gmail.com> | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class ProxyLogicTest extends PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var \PHPUnit_Framework_MockObject_MockObject | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $proxyLoader; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var ClassMetadata | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $lazyLoadableObjectMetadata; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var LazyLoadableObject|Proxy | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $lazyObject; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $identifier = array( | 
				
			||||||
 | 
					        'publicIdentifierField' => 'publicIdentifierFieldValue', | 
				
			||||||
 | 
					        'protectedIdentifierField' => 'protectedIdentifierFieldValue', | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var \PHPUnit_Framework_MockObject_MockObject|Callable | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $initializerCallbackMock; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->proxyLoader = $loader      = $this->getMock('stdClass', array('load'), array(), '', false); | 
				
			||||||
 | 
					        $this->initializerCallbackMock    = $this->getMock('stdClass', array('__invoke')); | 
				
			||||||
 | 
					        $identifier                       = $this->identifier; | 
				
			||||||
 | 
					        $this->lazyLoadableObjectMetadata = $metadata = new LazyLoadableObjectClassMetadata(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // emulating what should happen in a proxy factory | 
				
			||||||
 | 
					        $cloner = function (LazyLoadableObject $proxy) use ($loader, $identifier, $metadata) { | 
				
			||||||
 | 
					            /* @var $proxy LazyLoadableObject|Proxy */ | 
				
			||||||
 | 
					            if ($proxy->__isInitialized()) { | 
				
			||||||
 | 
					                return; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $proxy->__setInitialized(true); | 
				
			||||||
 | 
					            $proxy->__setInitializer(null); | 
				
			||||||
 | 
					            $original = $loader->load($identifier); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (null === $original) { | 
				
			||||||
 | 
					                throw new UnexpectedValueException(); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            foreach ($metadata->getReflectionClass()->getProperties() as $reflProperty) { | 
				
			||||||
 | 
					                $propertyName = $reflProperty->getName(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if ($metadata->hasField($propertyName) || $metadata->hasAssociation($propertyName)) { | 
				
			||||||
 | 
					                    $reflProperty->setAccessible(true); | 
				
			||||||
 | 
					                    $reflProperty->setValue($proxy, $reflProperty->getValue($original)); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyClassName = 'Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\LazyLoadableObject'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // creating the proxy class | 
				
			||||||
 | 
					        if (!class_exists($proxyClassName, false)) { | 
				
			||||||
 | 
					            $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					            $proxyGenerator->generateProxyClass($metadata); | 
				
			||||||
 | 
					            require_once $proxyGenerator->getProxyFileName($metadata->getName()); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject = new $proxyClassName($this->getClosure($this->initializerCallbackMock), $cloner); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // setting identifiers in the proxy via reflection | 
				
			||||||
 | 
					        foreach ($metadata->getIdentifierFieldNames() as $idField) { | 
				
			||||||
 | 
					            $prop = $metadata->getReflectionClass()->getProperty($idField); | 
				
			||||||
 | 
					            $prop->setAccessible(true); | 
				
			||||||
 | 
					            $prop->setValue($this->lazyObject, $identifier[$idField]); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse($this->lazyObject->__isInitialized()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFetchingPublicIdentifierDoesNotCauseLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('publicIdentifierFieldValue', $this->lazyObject->publicIdentifierField); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFetchingIdentifiersViaPublicGetterDoesNotCauseLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('protectedIdentifierFieldValue', $this->lazyObject->getProtectedIdentifierField()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCallingMethodCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, 'testInitializationTriggeringMethod', array()), | 
				
			||||||
 | 
					            function (Proxy $proxy) { | 
				
			||||||
 | 
					                $proxy->__setInitializer(null); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->testInitializationTriggeringMethod(); | 
				
			||||||
 | 
					        $this->lazyObject->testInitializationTriggeringMethod(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFetchingPublicFieldsCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, '__get', array('publicPersistentField')), | 
				
			||||||
 | 
					            function () use ($test) { | 
				
			||||||
 | 
					                $test->setProxyValue('publicPersistentField', 'loadedValue'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('loadedValue', $this->lazyObject->publicPersistentField); | 
				
			||||||
 | 
					        $this->assertSame('loadedValue', $this->lazyObject->publicPersistentField); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFetchingPublicAssociationCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, '__get', array('publicAssociation')), | 
				
			||||||
 | 
					            function () use ($test) { | 
				
			||||||
 | 
					                $test->setProxyValue('publicAssociation', 'loadedAssociation'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('loadedAssociation', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					        $this->assertSame('loadedAssociation', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFetchingProtectedAssociationViaPublicGetterCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, 'getProtectedAssociation', array()), | 
				
			||||||
 | 
					            function (Proxy $proxy) { | 
				
			||||||
 | 
					                $proxy->__setInitializer(null); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('protectedAssociationValue', $this->lazyObject->getProtectedAssociation()); | 
				
			||||||
 | 
					        $this->assertSame('protectedAssociationValue', $this->lazyObject->getProtectedAssociation()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testLazyLoadingTriggeredOnlyAtFirstPublicPropertyRead() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, '__get', array('publicPersistentField')), | 
				
			||||||
 | 
					            function () use ($test) { | 
				
			||||||
 | 
					                $test->setProxyValue('publicPersistentField', 'loadedValue'); | 
				
			||||||
 | 
					                $test->setProxyValue('publicAssociation', 'publicAssociationValue'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('loadedValue', $this->lazyObject->publicPersistentField); | 
				
			||||||
 | 
					        $this->assertSame('publicAssociationValue', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNoticeWhenReadingNonExistentPublicProperties() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $class = get_class($this->lazyObject); | 
				
			||||||
 | 
					        $this->setExpectedException( | 
				
			||||||
 | 
					            'PHPUnit_Framework_Error_Notice', | 
				
			||||||
 | 
					            'Undefined property: ' . $class . '::$non_existing_property' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->non_existing_property; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFalseWhenCheckingNonExistentProperty() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse(isset($this->lazyObject->non_existing_property)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNoErrorWhenSettingNonExistentProperty() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->non_existing_property = 'now has a value'; | 
				
			||||||
 | 
					        $this->assertSame('now has a value', $this->lazyObject->non_existing_property); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCloningCallsClonerWithClonedObject() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $lazyObject = $this->lazyObject; | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $cb = $this->getMock('stdClass', array('cb')); | 
				
			||||||
 | 
					        $cb | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('cb') | 
				
			||||||
 | 
					            ->will($this->returnCallback(function (LazyLoadableObject $proxy) use ($lazyObject, $test) { | 
				
			||||||
 | 
					                /* @var $proxy LazyLoadableObject|Proxy */ | 
				
			||||||
 | 
					                $test->assertNotSame($proxy, $lazyObject); | 
				
			||||||
 | 
					                $proxy->__setInitializer(null); | 
				
			||||||
 | 
					                $proxy->publicAssociation = 'clonedAssociation'; | 
				
			||||||
 | 
					            })); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->__setCloner($this->getClosure(array($cb, 'cb'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $cloned = clone $this->lazyObject; | 
				
			||||||
 | 
					        $this->assertSame('clonedAssociation', $cloned->publicAssociation); | 
				
			||||||
 | 
					        $this->assertNotSame($cloned, $lazyObject, 'a clone of the lazy object is retrieved'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFetchingTransientPropertiesWillNotTriggerLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicTransientFieldValue', | 
				
			||||||
 | 
					            $this->lazyObject->publicTransientField, | 
				
			||||||
 | 
					            'fetching public transient field won\'t trigger lazy loading' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $property = $this | 
				
			||||||
 | 
					            ->lazyLoadableObjectMetadata | 
				
			||||||
 | 
					            ->getReflectionClass() | 
				
			||||||
 | 
					            ->getProperty('protectedTransientField'); | 
				
			||||||
 | 
					        $property->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedTransientFieldValue', | 
				
			||||||
 | 
					            $property->getValue($this->lazyObject), | 
				
			||||||
 | 
					            'fetching protected transient field via reflection won\'t trigger lazy loading' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * Provided to guarantee backwards compatibility | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testLoadProxyMethod() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(2, array($this->lazyObject, '__load', array())); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->__load(); | 
				
			||||||
 | 
					        $this->lazyObject->__load(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testLoadingWithPersisterWillBeTriggeredOnlyOnce() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this | 
				
			||||||
 | 
					            ->proxyLoader | 
				
			||||||
 | 
					            ->expects($this->once()) | 
				
			||||||
 | 
					            ->method('load') | 
				
			||||||
 | 
					            ->with( | 
				
			||||||
 | 
					                array( | 
				
			||||||
 | 
					                    'publicIdentifierField' => 'publicIdentifierFieldValue', | 
				
			||||||
 | 
					                    'protectedIdentifierField' => 'protectedIdentifierFieldValue', | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					                $this->lazyObject | 
				
			||||||
 | 
					            ) | 
				
			||||||
 | 
					            ->will($this->returnCallback(function ($id, LazyLoadableObject $lazyObject) { | 
				
			||||||
 | 
					                // setting a value to verify that the persister can actually set something in the object | 
				
			||||||
 | 
					                $lazyObject->publicAssociation = $id['publicIdentifierField'] . '-test'; | 
				
			||||||
 | 
					                return true; | 
				
			||||||
 | 
					            })); | 
				
			||||||
 | 
					        $this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->__load(); | 
				
			||||||
 | 
					        $this->lazyObject->__load(); | 
				
			||||||
 | 
					        $this->assertSame('publicIdentifierFieldValue-test', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testFailedLoadingWillThrowException() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->proxyLoader->expects($this->any())->method('load')->will($this->returnValue(null)); | 
				
			||||||
 | 
					        $this->setExpectedException('UnexpectedValueException'); | 
				
			||||||
 | 
					        $this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->__load(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCloningWithPersister() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->lazyObject->publicTransientField = 'should-not-change'; | 
				
			||||||
 | 
					        $this | 
				
			||||||
 | 
					            ->proxyLoader | 
				
			||||||
 | 
					            ->expects($this->exactly(2)) | 
				
			||||||
 | 
					            ->method('load') | 
				
			||||||
 | 
					            ->with(array( | 
				
			||||||
 | 
					                'publicIdentifierField'    => 'publicIdentifierFieldValue', | 
				
			||||||
 | 
					                'protectedIdentifierField' => 'protectedIdentifierFieldValue', | 
				
			||||||
 | 
					            )) | 
				
			||||||
 | 
					            ->will($this->returnCallback(function () { | 
				
			||||||
 | 
					                $blueprint = new LazyLoadableObject(); | 
				
			||||||
 | 
					                $blueprint->publicPersistentField = 'checked-persistent-field'; | 
				
			||||||
 | 
					                $blueprint->publicAssociation     = 'checked-association-field'; | 
				
			||||||
 | 
					                $blueprint->publicTransientField  = 'checked-transient-field'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return $blueprint; | 
				
			||||||
 | 
					            })); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $firstClone = clone $this->lazyObject; | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'checked-persistent-field', | 
				
			||||||
 | 
					            $firstClone->publicPersistentField, | 
				
			||||||
 | 
					            'Persistent fields are cloned correctly' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'checked-association-field', | 
				
			||||||
 | 
					            $firstClone->publicAssociation, | 
				
			||||||
 | 
					            'Associations are cloned correctly' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'should-not-change', | 
				
			||||||
 | 
					            $firstClone->publicTransientField, | 
				
			||||||
 | 
					            'Transient fields are not overwritten' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $secondClone = clone $this->lazyObject; | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'checked-persistent-field', | 
				
			||||||
 | 
					            $secondClone->publicPersistentField, | 
				
			||||||
 | 
					            'Persistent fields are cloned correctly' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'checked-association-field', | 
				
			||||||
 | 
					            $secondClone->publicAssociation, | 
				
			||||||
 | 
					            'Associations are cloned correctly' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'should-not-change', | 
				
			||||||
 | 
					            $secondClone->publicTransientField, | 
				
			||||||
 | 
					            'Transient fields are not overwritten' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // those should not trigger lazy loading | 
				
			||||||
 | 
					        $firstClone->__load(); | 
				
			||||||
 | 
					        $secondClone->__load(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testNotInitializedProxyUnserialization() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->configureInitializerMock(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $serialized = serialize($this->lazyObject); | 
				
			||||||
 | 
					        /* @var $unserialized LazyLoadableObject|Proxy */ | 
				
			||||||
 | 
					        $unserialized = unserialize($serialized); | 
				
			||||||
 | 
					        $reflClass = $this->lazyLoadableObjectMetadata->getReflectionClass(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse($unserialized->__isInitialized(), 'serialization didn\'t cause intialization'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking identifiers | 
				
			||||||
 | 
					        $this->assertSame('publicIdentifierFieldValue', $unserialized->publicIdentifierField, 'identifiers are kept'); | 
				
			||||||
 | 
					        $protectedIdentifierField = $reflClass->getProperty('protectedIdentifierField'); | 
				
			||||||
 | 
					        $protectedIdentifierField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedIdentifierFieldValue', | 
				
			||||||
 | 
					            $protectedIdentifierField->getValue($unserialized), | 
				
			||||||
 | 
					            'identifiers are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking transient fields | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicTransientFieldValue', | 
				
			||||||
 | 
					            $unserialized->publicTransientField, | 
				
			||||||
 | 
					            'transient fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $protectedTransientField = $reflClass->getProperty('protectedTransientField'); | 
				
			||||||
 | 
					        $protectedTransientField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedTransientFieldValue', | 
				
			||||||
 | 
					            $protectedTransientField->getValue($unserialized), | 
				
			||||||
 | 
					            'transient fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking persistent fields | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicPersistentFieldValue', | 
				
			||||||
 | 
					            $unserialized->publicPersistentField, | 
				
			||||||
 | 
					            'persistent fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $protectedPersistentField = $reflClass->getProperty('protectedPersistentField'); | 
				
			||||||
 | 
					        $protectedPersistentField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedPersistentFieldValue', | 
				
			||||||
 | 
					            $protectedPersistentField->getValue($unserialized), | 
				
			||||||
 | 
					            'persistent fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking associations | 
				
			||||||
 | 
					        $this->assertSame('publicAssociationValue', $unserialized->publicAssociation, 'associations are kept'); | 
				
			||||||
 | 
					        $protectedAssociationField = $reflClass->getProperty('protectedAssociation'); | 
				
			||||||
 | 
					        $protectedAssociationField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedAssociationValue', | 
				
			||||||
 | 
					            $protectedAssociationField->getValue($unserialized), | 
				
			||||||
 | 
					            'associations are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInitializedProxyUnserialization() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        // persister will retrieve the lazy object itself, so that we don't have to re-define all field values | 
				
			||||||
 | 
					        $this->proxyLoader->expects($this->once())->method('load')->will($this->returnValue($this->lazyObject)); | 
				
			||||||
 | 
					        $this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation()); | 
				
			||||||
 | 
					        $this->lazyObject->__load(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $serialized   = serialize($this->lazyObject); | 
				
			||||||
 | 
					        $reflClass    = $this->lazyLoadableObjectMetadata->getReflectionClass(); | 
				
			||||||
 | 
					        /* @var $unserialized LazyLoadableObject|Proxy */ | 
				
			||||||
 | 
					        $unserialized = unserialize($serialized); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($unserialized->__isInitialized(), 'serialization didn\'t cause intialization'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking transient fields | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicTransientFieldValue', | 
				
			||||||
 | 
					            $unserialized->publicTransientField, | 
				
			||||||
 | 
					            'transient fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $protectedTransientField = $reflClass->getProperty('protectedTransientField'); | 
				
			||||||
 | 
					        $protectedTransientField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedTransientFieldValue', | 
				
			||||||
 | 
					            $protectedTransientField->getValue($unserialized), | 
				
			||||||
 | 
					            'transient fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking persistent fields | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicPersistentFieldValue', | 
				
			||||||
 | 
					            $unserialized->publicPersistentField, | 
				
			||||||
 | 
					            'persistent fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $protectedPersistentField = $reflClass->getProperty('protectedPersistentField'); | 
				
			||||||
 | 
					        $protectedPersistentField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedPersistentFieldValue', | 
				
			||||||
 | 
					            $protectedPersistentField->getValue($unserialized), | 
				
			||||||
 | 
					            'persistent fields are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking identifiers | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicIdentifierFieldValue', | 
				
			||||||
 | 
					            $unserialized->publicIdentifierField, | 
				
			||||||
 | 
					            'identifiers are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $protectedIdentifierField = $reflClass->getProperty('protectedIdentifierField'); | 
				
			||||||
 | 
					        $protectedIdentifierField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedIdentifierFieldValue', | 
				
			||||||
 | 
					            $protectedIdentifierField->getValue($unserialized), | 
				
			||||||
 | 
					            'identifiers are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Checking associations | 
				
			||||||
 | 
					        $this->assertSame('publicAssociationValue', $unserialized->publicAssociation, 'associations are kept'); | 
				
			||||||
 | 
					        $protectedAssociationField = $reflClass->getProperty('protectedAssociation'); | 
				
			||||||
 | 
					        $protectedAssociationField->setAccessible(true); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'protectedAssociationValue', | 
				
			||||||
 | 
					            $protectedAssociationField->getValue($unserialized), | 
				
			||||||
 | 
					            'associations are kept' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInitializationRestoresDefaultPublicLazyLoadedFieldValues() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        // setting noop persister | 
				
			||||||
 | 
					        $this->proxyLoader->expects($this->once())->method('load')->will($this->returnValue($this->lazyObject)); | 
				
			||||||
 | 
					        $this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicPersistentFieldValue', | 
				
			||||||
 | 
					            $this->lazyObject->publicPersistentField, | 
				
			||||||
 | 
					            'Persistent field is restored to default value' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $this->assertSame( | 
				
			||||||
 | 
					            'publicAssociationValue', | 
				
			||||||
 | 
					            $this->lazyObject->publicAssociation, | 
				
			||||||
 | 
					            'Association is restored to default value' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSettingPublicFieldsCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, '__set', array('publicPersistentField', 'newPublicPersistentFieldValue')), | 
				
			||||||
 | 
					            function () use ($test) { | 
				
			||||||
 | 
					                $test->setProxyValue('publicPersistentField', 'overrideValue'); | 
				
			||||||
 | 
					                $test->setProxyValue('publicAssociation', 'newAssociationValue'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->publicPersistentField = 'newPublicPersistentFieldValue'; | 
				
			||||||
 | 
					        $this->assertSame('newPublicPersistentFieldValue', $this->lazyObject->publicPersistentField); | 
				
			||||||
 | 
					        $this->assertSame('newAssociationValue', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSettingPublicAssociationCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, '__set', array('publicAssociation', 'newPublicAssociationValue')), | 
				
			||||||
 | 
					            function () use ($test) { | 
				
			||||||
 | 
					                $test->setProxyValue('publicPersistentField', 'newPublicPersistentFieldValue'); | 
				
			||||||
 | 
					                $test->setProxyValue('publicAssociation', 'overrideValue'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->lazyObject->publicAssociation = 'newPublicAssociationValue'; | 
				
			||||||
 | 
					        $this->assertSame('newPublicAssociationValue', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					        $this->assertSame('newPublicPersistentFieldValue', $this->lazyObject->publicPersistentField); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCheckingPublicFieldsCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, '__isset', array('publicPersistentField')), | 
				
			||||||
 | 
					            function () use ($test) { | 
				
			||||||
 | 
					                $test->setProxyValue('publicPersistentField', null); | 
				
			||||||
 | 
					                $test->setProxyValue('publicAssociation', 'setPublicAssociation'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse(isset($this->lazyObject->publicPersistentField)); | 
				
			||||||
 | 
					        $this->assertNull($this->lazyObject->publicPersistentField); | 
				
			||||||
 | 
					        $this->assertTrue(isset($this->lazyObject->publicAssociation)); | 
				
			||||||
 | 
					        $this->assertSame('setPublicAssociation', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCheckingPublicAssociationCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $test = $this; | 
				
			||||||
 | 
					        $this->configureInitializerMock( | 
				
			||||||
 | 
					            1, | 
				
			||||||
 | 
					            array($this->lazyObject, '__isset', array('publicAssociation')), | 
				
			||||||
 | 
					            function () use ($test) { | 
				
			||||||
 | 
					                $test->setProxyValue('publicPersistentField', 'newPersistentFieldValue'); | 
				
			||||||
 | 
					                $test->setProxyValue('publicAssociation', 'setPublicAssociation'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue(isset($this->lazyObject->publicAssociation)); | 
				
			||||||
 | 
					        $this->assertSame('setPublicAssociation', $this->lazyObject->publicAssociation); | 
				
			||||||
 | 
					        $this->assertTrue(isset($this->lazyObject->publicPersistentField)); | 
				
			||||||
 | 
					        $this->assertSame('newPersistentFieldValue', $this->lazyObject->publicPersistentField); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCallingVariadicMethodCausesLazyLoading() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (PHP_VERSION_ID < 50600) { | 
				
			||||||
 | 
					            $this->markTestSkipped('Test applies only to PHP 5.6+'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxyClassName = 'Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\VariadicTypeHintClass'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* @var $metadata \Doctrine\Common\Persistence\Mapping\ClassMetadata|\PHPUnit_Framework_MockObject_MockObject */ | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getName') | 
				
			||||||
 | 
					            ->will($this->returnValue('Doctrine\Tests\Common\Proxy\VariadicTypeHintClass')); | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getReflectionClass') | 
				
			||||||
 | 
					            ->will($this->returnValue(new \ReflectionClass('Doctrine\Tests\Common\Proxy\VariadicTypeHintClass'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // creating the proxy class | 
				
			||||||
 | 
					        if (!class_exists($proxyClassName, false)) { | 
				
			||||||
 | 
					            $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true); | 
				
			||||||
 | 
					            $proxyGenerator->generateProxyClass($metadata); | 
				
			||||||
 | 
					            require_once $proxyGenerator->getProxyFileName($metadata->getName()); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* @var $invocationMock callable|\PHPUnit_Framework_MockObject_MockObject */ | 
				
			||||||
 | 
					        $invocationMock = $this->getMock('stdClass', array('__invoke')); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* @var $lazyObject \Doctrine\Tests\Common\Proxy\VariadicTypeHintClass */ | 
				
			||||||
 | 
					        $lazyObject = new $proxyClassName( | 
				
			||||||
 | 
					            function ($proxy, $method, $parameters) use ($invocationMock) { | 
				
			||||||
 | 
					                $invocationMock($proxy, $method, $parameters); | 
				
			||||||
 | 
					            }, | 
				
			||||||
 | 
					            function () {} | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $invocationMock | 
				
			||||||
 | 
					            ->expects($this->at(0)) | 
				
			||||||
 | 
					            ->method('__invoke') | 
				
			||||||
 | 
					            ->with($lazyObject, 'addType', array(array('type1', 'type2'))); | 
				
			||||||
 | 
					        $invocationMock | 
				
			||||||
 | 
					            ->expects($this->at(1)) | 
				
			||||||
 | 
					            ->method('__invoke') | 
				
			||||||
 | 
					            ->with($lazyObject, 'addTypeWithMultipleParameters', array('foo', 'bar', array('baz1', 'baz2'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $lazyObject->addType('type1', 'type2'); | 
				
			||||||
 | 
					        $this->assertSame(array('type1', 'type2'), $lazyObject->types); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $lazyObject->addTypeWithMultipleParameters('foo', 'bar', 'baz1', 'baz2'); | 
				
			||||||
 | 
					        $this->assertSame('foo', $lazyObject->foo); | 
				
			||||||
 | 
					        $this->assertSame('bar', $lazyObject->bar); | 
				
			||||||
 | 
					        $this->assertSame(array('baz1', 'baz2'), $lazyObject->baz); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * Converts a given callable into a closure | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @param  callable $callable | 
				
			||||||
 | 
					     * @return \Closure | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getClosure($callable) { | 
				
			||||||
 | 
					        return function () use ($callable) { | 
				
			||||||
 | 
					            call_user_func_array($callable, func_get_args()); | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * Configures the current initializer callback mock with provided matcher params | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @param int $expectedCallCount the number of invocations to be expected. If a value< 0 is provided, `any` is used | 
				
			||||||
 | 
					     * @param array $callParamsMatch an ordered array of parameters to be expected | 
				
			||||||
 | 
					     * @param callable $callbackClosure a return callback closure | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return \PHPUnit_Framework_MockObject_MockObject| | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected function configureInitializerMock( | 
				
			||||||
 | 
					        $expectedCallCount = 0, | 
				
			||||||
 | 
					        array $callParamsMatch = null, | 
				
			||||||
 | 
					        \Closure $callbackClosure = null | 
				
			||||||
 | 
					    ) { | 
				
			||||||
 | 
					        if (!$expectedCallCount) { | 
				
			||||||
 | 
					            $invocationCountMatcher = $this->exactly((int) $expectedCallCount); | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            $invocationCountMatcher = $expectedCallCount < 0 ? $this->any() : $this->exactly($expectedCallCount); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $invocationMocker = $this->initializerCallbackMock->expects($invocationCountMatcher)->method('__invoke'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (null !== $callParamsMatch) { | 
				
			||||||
 | 
					            call_user_func_array(array($invocationMocker, 'with'), $callParamsMatch); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($callbackClosure) { | 
				
			||||||
 | 
					            $invocationMocker->will($this->returnCallback($callbackClosure)); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * Sets a value in the current proxy object without triggering lazy loading through `__set` | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @link https://bugs.php.net/bug.php?id=63463 | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @param string $property | 
				
			||||||
 | 
					     * @param mixed $value | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function setProxyValue($property, $value) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $reflectionProperty = new \ReflectionProperty($this->lazyObject, $property); | 
				
			||||||
 | 
					        $initializer        = $this->lazyObject->__getInitializer(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // disabling initializer since setting `publicPersistentField` triggers `__set`/`__get` | 
				
			||||||
 | 
					        $this->lazyObject->__setInitializer(null); | 
				
			||||||
 | 
					        $reflectionProperty->setValue($this->lazyObject, $value); | 
				
			||||||
 | 
					        $this->lazyObject->__setInitializer($initializer); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * Retrieves the suggested implementation of an initializer that proxy factories in O*M | 
				
			||||||
 | 
					     * are currently following, and that should be used to initialize the current proxy object | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return \Closure | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected function getSuggestedInitializerImplementation() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $loader     = $this->proxyLoader; | 
				
			||||||
 | 
					        $identifier = $this->identifier; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return function (LazyLoadableObject $proxy) use ($loader, $identifier) { | 
				
			||||||
 | 
					            /* @var $proxy LazyLoadableObject|Proxy */ | 
				
			||||||
 | 
					            $proxy->__setInitializer(null); | 
				
			||||||
 | 
					            $proxy->__setCloner(null); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ($proxy->__isInitialized()) { | 
				
			||||||
 | 
					                return; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $properties = $proxy->__getLazyProperties(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            foreach ($properties as $propertyName => $property) { | 
				
			||||||
 | 
					                if (!isset($proxy->$propertyName)) { | 
				
			||||||
 | 
					                    $proxy->$propertyName = $properties[$propertyName]; | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $proxy->__setInitialized(true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (method_exists($proxy, '__wakeup')) { | 
				
			||||||
 | 
					                $proxy->__wakeup(); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (null === $loader->load($identifier, $proxy)) { | 
				
			||||||
 | 
					                throw new \UnexpectedValueException('Couldn\'t load'); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,327 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					/* | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
				
			||||||
 | 
					 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
				
			||||||
 | 
					 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
				
			||||||
 | 
					 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
				
			||||||
 | 
					 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
				
			||||||
 | 
					 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
				
			||||||
 | 
					 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This software consists of voluntary contributions made by many individuals | 
				
			||||||
 | 
					 * and is licensed under the MIT license. For more information, see | 
				
			||||||
 | 
					 * <http://www.doctrine-project.org>. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\ProxyGenerator; | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\Proxy; | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\Exception\UnexpectedValueException; | 
				
			||||||
 | 
					use PHPUnit_Framework_TestCase; | 
				
			||||||
 | 
					use ReflectionClass; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test for behavior of proxies with inherited magic methods | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * @author Marco Pivetta <ocramius@gmail.com> | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class ProxyMagicMethodsTest extends PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var \Doctrine\Common\Proxy\ProxyGenerator | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $proxyGenerator; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var LazyLoadableObject|Proxy | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $lazyObject; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $identifier = array( | 
				
			||||||
 | 
					        'publicIdentifierField' => 'publicIdentifierFieldValue', | 
				
			||||||
 | 
					        'protectedIdentifierField' => 'protectedIdentifierFieldValue', | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var \PHPUnit_Framework_MockObject_MockObject|Callable | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $initializerCallbackMock; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function setUp() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . '\\MagicMethodProxy'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function tearDownAfterClass() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInheritedMagicGet() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicGetClass'); | 
				
			||||||
 | 
					        $proxy          = new $proxyClassName( | 
				
			||||||
 | 
					            function (Proxy $proxy, $method, $params) use (&$counter) { | 
				
			||||||
 | 
					                if ( ! in_array($params[0], array('publicField', 'test', 'notDefined'))) { | 
				
			||||||
 | 
					                    throw new \InvalidArgumentException('Unexpected access to field "' . $params[0] . '"'); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $initializer = $proxy->__getInitializer(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $proxy->__setInitializer(null); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $proxy->publicField = 'modifiedPublicField'; | 
				
			||||||
 | 
					                $counter            += 1; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $proxy->__setInitializer($initializer); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('id', $proxy->id); | 
				
			||||||
 | 
					        $this->assertSame('modifiedPublicField', $proxy->publicField); | 
				
			||||||
 | 
					        $this->assertSame('test', $proxy->test); | 
				
			||||||
 | 
					        $this->assertSame('not defined', $proxy->notDefined); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame(3, $counter); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @group DCOM-194 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testInheritedMagicGetByRef() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName    = $this->generateProxyClass(__NAMESPACE__ . '\\MagicGetByRefClass'); | 
				
			||||||
 | 
					        /* @var $proxy \Doctrine\Tests\Common\Proxy\MagicGetByRefClass */ | 
				
			||||||
 | 
					        $proxy             = new $proxyClassName(); | 
				
			||||||
 | 
					        $proxy->valueField = 123; | 
				
			||||||
 | 
					        $value             = & $proxy->__get('value'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame(123, $value); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $value = 456; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame(456, $proxy->__get('value'), 'Value was fetched by reference'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->setExpectedException('InvalidArgumentException'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $undefined = $proxy->nonExisting; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInheritedMagicSet() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicSetClass'); | 
				
			||||||
 | 
					        $proxy          = new $proxyClassName( | 
				
			||||||
 | 
					            function (Proxy  $proxy, $method, $params) use (&$counter) { | 
				
			||||||
 | 
					                if ( ! in_array($params[0], array('publicField', 'test', 'notDefined'))) { | 
				
			||||||
 | 
					                    throw new \InvalidArgumentException('Unexpected access to field "' . $params[0] . '"'); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $counter += 1; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('id', $proxy->id); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy->publicField = 'publicFieldValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('publicFieldValue', $proxy->publicField); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy->test = 'testValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('testValue', $proxy->testAttribute); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy->notDefined = 'not defined'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('not defined', $proxy->testAttribute); | 
				
			||||||
 | 
					        $this->assertSame(3, $counter); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInheritedMagicSleep() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicSleepClass'); | 
				
			||||||
 | 
					        $proxy          = new $proxyClassName(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('defaultValue', $proxy->serializedField); | 
				
			||||||
 | 
					        $this->assertSame('defaultValue', $proxy->nonSerializedField); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy->serializedField    = 'changedValue'; | 
				
			||||||
 | 
					        $proxy->nonSerializedField = 'changedValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $unserialized = unserialize(serialize($proxy)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('changedValue', $unserialized->serializedField); | 
				
			||||||
 | 
					        $this->assertSame('defaultValue', $unserialized->nonSerializedField, 'Field was not returned by "__sleep"'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInheritedMagicWakeup() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicWakeupClass'); | 
				
			||||||
 | 
					        $proxy          = new $proxyClassName(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('defaultValue', $proxy->wakeupValue); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy->wakeupValue = 'changedValue'; | 
				
			||||||
 | 
					        $unserialized       = unserialize(serialize($proxy)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('newWakeupValue', $unserialized->wakeupValue, '"__wakeup" was called'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $unserialized->__setInitializer(function (Proxy $proxy) { | 
				
			||||||
 | 
					            $proxy->__setInitializer(null); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $proxy->publicField = 'newPublicFieldValue'; | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('newPublicFieldValue', $unserialized->publicField, 'Proxy can still be initialized'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInheritedMagicIsset() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicIssetClass'); | 
				
			||||||
 | 
					        $proxy          = new $proxyClassName(function (Proxy $proxy, $method, $params) use (&$counter) { | 
				
			||||||
 | 
					            if (in_array($params[0], array('publicField', 'test', 'nonExisting'))) { | 
				
			||||||
 | 
					                $initializer = $proxy->__getInitializer(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $proxy->__setInitializer(null); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $proxy->publicField = 'modifiedPublicField'; | 
				
			||||||
 | 
					                $counter            += 1; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $proxy->__setInitializer($initializer); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            throw new \InvalidArgumentException( | 
				
			||||||
 | 
					                sprintf('Should not be initialized when checking isset("%s")', $params[0]) | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue(isset($proxy->id)); | 
				
			||||||
 | 
					        $this->assertTrue(isset($proxy->publicField)); | 
				
			||||||
 | 
					        $this->assertTrue(isset($proxy->test)); | 
				
			||||||
 | 
					        $this->assertFalse(isset($proxy->nonExisting)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame(3, $counter); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInheritedMagicClone() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicCloneClass'); | 
				
			||||||
 | 
					        $proxy          = new $proxyClassName( | 
				
			||||||
 | 
					            null, | 
				
			||||||
 | 
					            function ($proxy) { | 
				
			||||||
 | 
					                $proxy->cloned = true; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $cloned = clone $proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('newClonedValue', $cloned->clonedValue); | 
				
			||||||
 | 
					        $this->assertFalse($proxy->cloned); | 
				
			||||||
 | 
					        $this->assertTrue($cloned->cloned); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @group DCOM-175 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testClonesPrivateProperties() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\SerializedClass'); | 
				
			||||||
 | 
					        /* @var $proxy SerializedClass */ | 
				
			||||||
 | 
					        $proxy          = new $proxyClassName(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $proxy->setFoo(1); | 
				
			||||||
 | 
					        $proxy->setBar(2); | 
				
			||||||
 | 
					        $proxy->setBaz(3); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $unserialized = unserialize(serialize($proxy)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame(1, $unserialized->getFoo()); | 
				
			||||||
 | 
					        $this->assertSame(2, $unserialized->getBar()); | 
				
			||||||
 | 
					        $this->assertSame(3, $unserialized->getBaz()); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param $className | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private function generateProxyClass($className) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $proxyClassName = 'Doctrine\\Tests\\Common\\Proxy\\MagicMethodProxy\\__CG__\\' . $className; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (class_exists($proxyClassName, false)) { | 
				
			||||||
 | 
					            return $proxyClassName; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata = $this->getMock('Doctrine\\Common\\Persistence\\Mapping\\ClassMetadata'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getName') | 
				
			||||||
 | 
					            ->will($this->returnValue($className)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getIdentifier') | 
				
			||||||
 | 
					            ->will($this->returnValue(array('id'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getReflectionClass') | 
				
			||||||
 | 
					            ->will($this->returnValue(new ReflectionClass($className))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('isIdentifier') | 
				
			||||||
 | 
					            ->will($this->returnCallback(function ($fieldName) { | 
				
			||||||
 | 
					                return 'id' === $fieldName; | 
				
			||||||
 | 
					            })); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('hasField') | 
				
			||||||
 | 
					            ->will($this->returnCallback(function ($fieldName) { | 
				
			||||||
 | 
					                return in_array($fieldName, array('id', 'publicField')); | 
				
			||||||
 | 
					            })); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('hasAssociation') | 
				
			||||||
 | 
					            ->will($this->returnValue(false)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getFieldNames') | 
				
			||||||
 | 
					            ->will($this->returnValue(array('id', 'publicField'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getIdentifierFieldNames') | 
				
			||||||
 | 
					            ->will($this->returnValue(array('id'))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getAssociationNames') | 
				
			||||||
 | 
					            ->will($this->returnValue(array())); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $metadata | 
				
			||||||
 | 
					            ->expects($this->any()) | 
				
			||||||
 | 
					            ->method('getTypeOfField') | 
				
			||||||
 | 
					            ->will($this->returnValue('string')); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->proxyGenerator->generateProxyClass($metadata, $this->proxyGenerator->getProxyFileName($className)); | 
				
			||||||
 | 
					        require_once $this->proxyGenerator->getProxyFileName($className); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $proxyClassName; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,72 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class SerializedClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var mixed | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private $foo = 'foo'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var mixed | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    protected $bar = 'bar'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var mixed | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public $baz = 'baz'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param mixed $foo | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function setFoo($foo) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->foo = $foo; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return mixed|string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getFoo() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->foo; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param $bar | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function setBar($bar) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->bar = $bar; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return mixed|string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getBar() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->bar; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param $baz | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function setBaz($baz) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->baz = $baz; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return mixed|string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function getBaz() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->baz; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,19 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class SleepClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public $id; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return array | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __sleep() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array('id'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,11 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class StaticPropertyClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    protected static $protectedStaticProperty; | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,29 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Test asset class | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class VariadicTypeHintClass | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public $types; | 
				
			||||||
 | 
					    public $foo; | 
				
			||||||
 | 
					    public $bar; | 
				
			||||||
 | 
					    public $baz; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param ...$types | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function addType(...$types) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->types = $types; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function addTypeWithMultipleParameters($foo, $bar, ...$baz) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->foo = $foo; | 
				
			||||||
 | 
					        $this->bar = $bar; | 
				
			||||||
 | 
					        $this->baz = $baz; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,7 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DeeperNamespaceParent extends Dummies\NoParent | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,8 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection\Dummies; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NoParent | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public $test; | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,14 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Common\Annotations\Annotation; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * @Annotation( | 
				
			||||||
 | 
					 *   key = "value" | 
				
			||||||
 | 
					 * ) | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class ExampleAnnotationClass { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}  | 
				
			||||||
@ -0,0 +1,7 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FullyClassifiedParent extends \Doctrine\Tests\Common\Reflection\NoParent | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,8 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NoParent | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public $test; | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,192 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use PHPUnit_Framework_TestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Reflection\RuntimePublicReflectionProperty; | 
				
			||||||
 | 
					use Doctrine\Common\Proxy\Proxy; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RuntimePublicReflectionPropertyTest extends PHPUnit_Framework_TestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function testGetValueOnProxyPublicProperty() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $getCheckMock = $this->getMock('stdClass', array('callGet')); | 
				
			||||||
 | 
					        $getCheckMock->expects($this->never())->method('callGet'); | 
				
			||||||
 | 
					        $initializer = function () use ($getCheckMock) { | 
				
			||||||
 | 
					            call_user_func($getCheckMock); | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $mockProxy = new RuntimePublicReflectionPropertyTestProxyMock(); | 
				
			||||||
 | 
					        $mockProxy->__setInitializer($initializer); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $reflProperty = new RuntimePublicReflectionProperty( | 
				
			||||||
 | 
					            __NAMESPACE__ . '\RuntimePublicReflectionPropertyTestProxyMock', | 
				
			||||||
 | 
					            'checkedProperty' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame('testValue', $reflProperty->getValue($mockProxy)); | 
				
			||||||
 | 
					        unset($mockProxy->checkedProperty); | 
				
			||||||
 | 
					        $this->assertNull($reflProperty->getValue($mockProxy)); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testSetValueOnProxyPublicProperty() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $setCheckMock = $this->getMock('stdClass', array('neverCallSet')); | 
				
			||||||
 | 
					        $setCheckMock->expects($this->never())->method('neverCallSet'); | 
				
			||||||
 | 
					        $initializer = function () use ($setCheckMock) { | 
				
			||||||
 | 
					            call_user_func(array($setCheckMock, 'neverCallSet')); | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $mockProxy = new RuntimePublicReflectionPropertyTestProxyMock(); | 
				
			||||||
 | 
					        $mockProxy->__setInitializer($initializer); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $reflProperty = new RuntimePublicReflectionProperty( | 
				
			||||||
 | 
					            __NAMESPACE__ . '\RuntimePublicReflectionPropertyTestProxyMock', | 
				
			||||||
 | 
					            'checkedProperty' | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $reflProperty->setValue($mockProxy, 'newValue'); | 
				
			||||||
 | 
					        $this->assertSame('newValue', $mockProxy->checkedProperty); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        unset($mockProxy->checkedProperty); | 
				
			||||||
 | 
					        $reflProperty->setValue($mockProxy, 'otherNewValue'); | 
				
			||||||
 | 
					        $this->assertSame('otherNewValue', $mockProxy->checkedProperty); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $setCheckMock = $this->getMock('stdClass', array('callSet')); | 
				
			||||||
 | 
					        $setCheckMock->expects($this->once())->method('callSet'); | 
				
			||||||
 | 
					        $initializer = function () use ($setCheckMock) { | 
				
			||||||
 | 
					            call_user_func(array($setCheckMock, 'callSet')); | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $mockProxy->__setInitializer($initializer); | 
				
			||||||
 | 
					        $mockProxy->__setInitialized(true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        unset($mockProxy->checkedProperty); | 
				
			||||||
 | 
					        $reflProperty->setValue($mockProxy, 'againNewValue'); | 
				
			||||||
 | 
					        $this->assertSame('againNewValue', $mockProxy->checkedProperty); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * Mock that simulates proxy public property lazy loading | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					class RuntimePublicReflectionPropertyTestProxyMock implements Proxy | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var \Closure|null | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private $initializer     = null; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var \Closure|null | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private $initialized     = false; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @var string | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public  $checkedProperty = 'testValue'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __getInitializer() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->initializer; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __setInitializer(\Closure $initializer = null) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->initializer = $initializer; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __getLazyProperties() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __load() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __isInitialized() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->initialized; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __setInitialized($initialized) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->initialized = (bool) $initialized; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param string $name | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __get($name) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if ($this->initializer) { | 
				
			||||||
 | 
					            $cb = $this->initializer; | 
				
			||||||
 | 
					            $cb(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $this->checkedProperty; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param string $name | 
				
			||||||
 | 
					     * @param mixed  $value | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __set($name, $value) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if ($this->initializer) { | 
				
			||||||
 | 
					            $cb = $this->initializer; | 
				
			||||||
 | 
					            $cb(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // triggers notices if `$name` is used: see https://bugs.php.net/bug.php?id=63463 | 
				
			||||||
 | 
					        $this->checkedProperty = $value; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @param string $name | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return integer | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __isset($name) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if ($this->initializer) { | 
				
			||||||
 | 
					            $cb = $this->initializer; | 
				
			||||||
 | 
					            $cb(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return isset($this->checkedProperty); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __setCloner(\Closure $cloner = null) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * {@inheritDoc} | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function __getCloner() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,7 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SameNamespaceParent extends NoParent | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,93 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					use Doctrine\Common\Reflection\StaticReflectionParser; | 
				
			||||||
 | 
					use Doctrine\Common\Reflection\Psr0FindFile; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class StaticReflectionParserTest extends DoctrineTestCase | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @dataProvider parentClassData | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @param bool $classAnnotationOptimize | 
				
			||||||
 | 
					     * @param string $parsedClassName | 
				
			||||||
 | 
					     * @param string $expectedClassName | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @return void | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testParentClass($classAnnotationOptimize, $parsedClassName, $expectedClassName) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        // If classed annotation optimization is enabled the properties tested | 
				
			||||||
 | 
					        // below cannot be found. | 
				
			||||||
 | 
					        if ($classAnnotationOptimize) { | 
				
			||||||
 | 
					            $this->setExpectedException('ReflectionException'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $testsRoot = substr(__DIR__, 0, -strlen(__NAMESPACE__) - 1); | 
				
			||||||
 | 
					        $paths = array( | 
				
			||||||
 | 
					            'Doctrine\\Tests' => array($testsRoot), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $staticReflectionParser = new StaticReflectionParser($parsedClassName, new Psr0FindFile($paths), $classAnnotationOptimize); | 
				
			||||||
 | 
					        $declaringClassName = $staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', 'test')->getClassName(); | 
				
			||||||
 | 
					        $this->assertEquals($expectedClassName, $declaringClassName); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return array | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function parentClassData() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $data = array(); | 
				
			||||||
 | 
					        $noParentClassName = 'Doctrine\\Tests\\Common\\Reflection\\NoParent'; | 
				
			||||||
 | 
					        $dummyParentClassName = 'Doctrine\\Tests\\Common\\Reflection\\Dummies\\NoParent'; | 
				
			||||||
 | 
					        foreach (array(false, true) as $classAnnotationOptimize) { | 
				
			||||||
 | 
					            $data[] = array( | 
				
			||||||
 | 
					              $classAnnotationOptimize, $noParentClassName, $noParentClassName, | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					            $data[] = array( | 
				
			||||||
 | 
					              $classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\FullyClassifiedParent', $noParentClassName, | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					            $data[] = array( | 
				
			||||||
 | 
					              $classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\SameNamespaceParent', $noParentClassName, | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					            $data[] = array( | 
				
			||||||
 | 
					              $classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\DeeperNamespaceParent', $dummyParentClassName, | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					            $data[] = array( | 
				
			||||||
 | 
					              $classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\UseParent', $dummyParentClassName, | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        return $data; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @dataProvider classAnnotationOptimize | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function testClassAnnotationOptimizedParsing($classAnnotationOptimize) { | 
				
			||||||
 | 
					        $testsRoot = substr(__DIR__, 0, -strlen(__NAMESPACE__) - 1); | 
				
			||||||
 | 
					        $paths = array( | 
				
			||||||
 | 
					          'Doctrine\\Tests' => array($testsRoot), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					        $staticReflectionParser = new StaticReflectionParser('Doctrine\\Tests\\Common\\Reflection\\ExampleAnnotationClass', new Psr0FindFile($paths), $classAnnotationOptimize); | 
				
			||||||
 | 
					        $expectedDocComment = '/** | 
				
			||||||
 | 
					 * @Annotation( | 
				
			||||||
 | 
					 *   key = "value" | 
				
			||||||
 | 
					 * ) | 
				
			||||||
 | 
					 */'; | 
				
			||||||
 | 
					        $this->assertEquals($expectedDocComment, $staticReflectionParser->getDocComment('class')); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * @return array | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public function classAnnotationOptimize() | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return array( | 
				
			||||||
 | 
					            array(false), | 
				
			||||||
 | 
					            array(true) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,9 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Reflection; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Tests\Common\Reflection\Dummies\NoParent as Test; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UseParent extends Test | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,100 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Doctrine\Tests\Common\Util | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    use Doctrine\Tests\DoctrineTestCase; | 
				
			||||||
 | 
					    use Doctrine\Common\Util\ClassUtils; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class ClassUtilsTest extends DoctrineTestCase | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        static public function dataGetClass() | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            return array( | 
				
			||||||
 | 
					                array('stdClass', 'stdClass'), | 
				
			||||||
 | 
					                array('Doctrine\Common\Util\ClassUtils', 'Doctrine\Common\Util\ClassUtils'), | 
				
			||||||
 | 
					                array( 'MyProject\Proxies\__CG__\stdClass', 'stdClass' ), | 
				
			||||||
 | 
					                array( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\stdClass', 'stdClass' ), | 
				
			||||||
 | 
					                array( 'MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject','Doctrine\Tests\Common\Util\ChildObject' ) | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** | 
				
			||||||
 | 
					         * @dataProvider dataGetClass | 
				
			||||||
 | 
					         */ | 
				
			||||||
 | 
					        public function testGetRealClass($className, $expectedClassName) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            $this->assertEquals($expectedClassName, ClassUtils::getRealClass($className)); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** | 
				
			||||||
 | 
					         * @dataProvider dataGetClass | 
				
			||||||
 | 
					         */ | 
				
			||||||
 | 
					        public function testGetClass( $className, $expectedClassName ) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            $object = new $className(); | 
				
			||||||
 | 
					            $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public function testGetParentClass() | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); | 
				
			||||||
 | 
					            $this->assertEquals('stdClass', $parentClass); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public function testGenerateProxyClassName() | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** | 
				
			||||||
 | 
					         * @dataProvider dataGetClass | 
				
			||||||
 | 
					         */ | 
				
			||||||
 | 
					        public function testNewReflectionClass( $className, $expectedClassName ) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            $reflClass = ClassUtils::newReflectionClass( $className ); | 
				
			||||||
 | 
					            $this->assertEquals( $expectedClassName, $reflClass->getName() ); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** | 
				
			||||||
 | 
					         * @dataProvider dataGetClass | 
				
			||||||
 | 
					         */ | 
				
			||||||
 | 
					        public function testNewReflectionObject( $className, $expectedClassName ) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            $object = new $className; | 
				
			||||||
 | 
					            $reflClass = ClassUtils::newReflectionObject( $object ); | 
				
			||||||
 | 
					            $this->assertEquals( $expectedClassName, $reflClass->getName() ); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class ChildObject extends \stdClass | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MyProject\Proxies\__CG__ | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    class stdClass extends \stdClass | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    class stdClass extends \MyProject\Proxies\__CG__\stdClass | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue