* @license MIT * * @group Functional * @coversNothing */ class FatalPreventionFunctionalTest extends PHPUnit_Framework_TestCase { private $template = <<<'PHP' generate(new ReflectionClass($className), $generatedClass); $classSignatureGenerator->addSignature($generatedClass, array('eval tests')); $generatorStrategy->generate($generatedClass); } catch (ProxyManager\Exception\ExceptionInterface $e) { } catch (ReflectionException $e) { } echo 'SUCCESS: ' . %s; PHP; /** * Verifies that code generation and evaluation will not cause fatals with any given class * * @param string $generatorClass an instantiable class (no arguments) implementing * the {@see \ProxyManager\ProxyGenerator\ProxyGeneratorInterface} * @param string $className a valid (existing/autoloadable) class name * * @dataProvider getTestedClasses */ public function testCodeGeneration($generatorClass, $className) { if (defined('HHVM_VERSION')) { $this->markTestSkipped('HHVM is just too slow for this kind of test right now.'); } if (PHP_VERSION_ID < 50401) { $this->markTestSkipped('Can\'t run this test suite on php < 5.4.1'); } $runner = PHPUnit_Util_PHP::factory(); $code = sprintf( $this->template, var_export(realpath(__DIR__ . '/../../../vendor/autoload.php'), true), var_export($className, true), $generatorClass, var_export($className, true) ); $result = $runner->runJob($code, array('-n')); if (('SUCCESS: ' . $className) !== $result['stdout']) { $this->fail(sprintf( "Crashed with class '%s' and generator '%s'.\n\nStdout:\n%s\nStderr:\n%s\nGenerated code:\n%s'", $generatorClass, $className, $result['stdout'], $result['stderr'], $code )); } $this->assertSame('SUCCESS: ' . $className, $result['stdout']); } /** * @return string[][] */ public function getTestedClasses() { $that = $this; return call_user_func_array( 'array_merge', array_map( function ($generator) use ($that) { return array_map( function ($class) use ($generator) { return array($generator, $class); }, $that->getProxyTestedClasses() ); }, array( 'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizerGenerator', 'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolderGenerator', 'ProxyManager\\ProxyGenerator\\LazyLoadingGhostGenerator', 'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolderGenerator', 'ProxyManager\\ProxyGenerator\\NullObjectGenerator', 'ProxyManager\\ProxyGenerator\\RemoteObjectGenerator', ) ) ); } /** * @private (public only for PHP 5.3 compatibility) * * @return string[] */ public function getProxyTestedClasses() { $skippedPaths = array( realpath(__DIR__ . '/../../src'), realpath(__DIR__ . '/../../vendor'), realpath(__DIR__ . '/../../tests/ProxyManagerTest'), ); return array_filter( get_declared_classes(), function ($className) use ($skippedPaths) { $reflectionClass = new ReflectionClass($className); $fileName = $reflectionClass->getFileName(); if (! $fileName) { return false; } $realPath = realpath($fileName); foreach ($skippedPaths as $skippedPath) { if (0 === strpos($realPath, $skippedPath)) { // skip classes defined within ProxyManager, vendor or the test suite return false; } } return true; } ); } }