* @license MIT * * @group Coverage */ abstract class AbstractProxyGeneratorTest extends PHPUnit_Framework_TestCase { /** * @dataProvider getTestedImplementations * * Verifies that generated code is valid and implements expected interfaces */ public function testGeneratesValidCode($className) { $generator = $this->getProxyGenerator(); $generatedClassName = UniqueIdentifierGenerator::getIdentifier('AbstractProxyGeneratorTest'); $generatedClass = new ClassGenerator($generatedClassName); $originalClass = new ReflectionClass($className); $generatorStrategy = new EvaluatingGeneratorStrategy(); $generator->generate($originalClass, $generatedClass); $generatorStrategy->generate($generatedClass); $generatedReflection = new ReflectionClass($generatedClassName); if ($originalClass->isInterface()) { $this->assertTrue($generatedReflection->implementsInterface($className)); } else { $this->assertSame($originalClass->getName(), $generatedReflection->getParentClass()->getName()); } $this->assertSame($generatedClassName, $generatedReflection->getName()); foreach ($this->getExpectedImplementedInterfaces() as $interface) { $this->assertTrue($generatedReflection->implementsInterface($interface)); } } /** * Retrieve a new generator instance * * @return \ProxyManager\ProxyGenerator\ProxyGeneratorInterface */ abstract protected function getProxyGenerator(); /** * Retrieve interfaces that should be implemented by the generated code * * @return string[] */ abstract protected function getExpectedImplementedInterfaces(); /** * @return array */ public function getTestedImplementations() { return array( array('ProxyManagerTestAsset\\BaseClass'), array('ProxyManagerTestAsset\\ClassWithMagicMethods'), array('ProxyManagerTestAsset\\ClassWithByRefMagicMethods'), array('ProxyManagerTestAsset\\ClassWithMixedProperties'), array('ProxyManagerTestAsset\\BaseInterface'), ); } }