public getMockedClassCode ( $class, $mockNamespace = null, $mockClass = null ) |
public function getMockedClassCode($class, $mockNamespace = null, $mockClass = null)
{
if (trim($class, '\\') == '' || rtrim($class, '\\') != $class) {
throw new exceptions\runtime('Class name \'' . $class . '\' is invalid');
}
if ($mockNamespace === null) {
$mockNamespace = $this->getNamespace($class);
}
$class = '\\' . ltrim($class, '\\');
if ($mockClass === null) {
$mockClass = self::getClassName($class);
}
if ($this->adapter->class_exists($mockNamespace . '\\' . $mockClass, false) === true || $this->adapter->interface_exists($mockNamespace . '\\' . $mockClass, false) === true) {
throw new exceptions\logic('Class \'' . $mockNamespace . '\\' . $mockClass . '\' already exists');
}
if ($this->adapter->class_exists($class, true) === false && $this->adapter->interface_exists($class, true) === false) {
$code = self::generateUnknownClassCode($class, $mockNamespace, $mockClass);
} else {
$reflectionClass = call_user_func($this->reflectionClassFactory, $class);
if ($reflectionClass->isFinal() === true) {
throw new exceptions\logic('Class \'' . $class . '\' is final, unable to mock it');
}
$code = $reflectionClass->isInterface() === false ? $this->generateClassCode($reflectionClass, $mockNamespace, $mockClass) : $this->generateInterfaceCode($reflectionClass, $mockNamespace, $mockClass);
}
$this->shuntedMethods = $this->overloadedMethods = $this->orphanizedMethods = array();
$this->unshuntParentClassCalls();
return $code;
}
/** @php 5.4 */ public function testGetMockedClassCodeForClassWithCallableTypeHint() { $this->if($generator = new testedClass())->and($reflectionParameterController = new mock\controller())->and($reflectionParameterController->__construct = function () { })->and($reflectionParameterController->isArray = false)->and($reflectionParameterController->isCallable = true)->and($reflectionParameterController->getName = 'callback')->and($reflectionParameterController->isPassedByReference = false)->and($reflectionParameterController->isDefaultValueAvailable = false)->and($reflectionParameterController->isOptional = false)->and($reflectionParameter = new \mock\reflectionParameter(null, null))->and($reflectionMethodController = new mock\controller())->and($reflectionMethodController->__construct = function () { })->and($reflectionMethodController->getName = '__construct')->and($reflectionMethodController->isConstructor = true)->and($reflectionMethodController->getParameters = array($reflectionParameter))->and($reflectionMethodController->isPublic = true)->and($reflectionMethodController->isProtected = false)->and($reflectionMethodController->isPrivate = false)->and($reflectionMethodController->isFinal = false)->and($reflectionMethodController->isStatic = false)->and($reflectionMethodController->isAbstract = false)->and($reflectionMethodController->returnsReference = false)->and($reflectionMethod = new \mock\reflectionMethod(null, null))->and($reflectionClassController = new mock\controller())->and($reflectionClassController->__construct = function () { })->and($reflectionClassController->getName = function () use(&$realClass) { return $realClass; })->and($reflectionClassController->isFinal = false)->and($reflectionClassController->isInterface = false)->and($reflectionClassController->getMethods = array($reflectionMethod))->and($reflectionClassController->getConstructor = $reflectionMethod)->and($reflectionClass = new \mock\reflectionClass(null))->and($generator->setReflectionClassFactory(function () use($reflectionClass) { return $reflectionClass; }))->and($adapter = new atoum\test\adapter())->and($adapter->class_exists = function ($class) use(&$realClass) { return $class == '\\' . $realClass; })->and($generator->setAdapter($adapter))->then->string($generator->getMockedClassCode($realClass = uniqid()))->isEqualTo('namespace mock {' . PHP_EOL . 'final class ' . $realClass . ' extends \\' . $realClass . ' implements \\mageekguy\\atoum\\mock\\aggregator' . PHP_EOL . '{' . PHP_EOL . $this->getMockControllerMethods() . "\t" . 'public function __construct(callable $callback, \\mageekguy\\atoum\\mock\\controller $mockController = null)' . PHP_EOL . "\t" . '{' . PHP_EOL . "\t\t" . '$arguments = array_merge(array($callback), array_slice(func_get_args(), 1, -1));' . PHP_EOL . "\t\t" . 'if ($mockController === null)' . PHP_EOL . "\t\t" . '{' . PHP_EOL . "\t\t\t" . '$mockController = \\mageekguy\\atoum\\mock\\controller::get();' . PHP_EOL . "\t\t" . '}' . PHP_EOL . "\t\t" . 'if ($mockController !== null)' . PHP_EOL . "\t\t" . '{' . PHP_EOL . "\t\t\t" . '$this->setMockController($mockController);' . PHP_EOL . "\t\t" . '}' . PHP_EOL . "\t\t" . 'if (isset($this->getMockController()->__construct) === true)' . PHP_EOL . "\t\t" . '{' . PHP_EOL . "\t\t\t" . '$this->getMockController()->invoke(\'__construct\', $arguments);' . PHP_EOL . "\t\t" . '}' . PHP_EOL . "\t\t" . 'else' . PHP_EOL . "\t\t" . '{' . PHP_EOL . "\t\t\t" . '$this->getMockController()->addCall(\'__construct\', $arguments);' . PHP_EOL . "\t\t\t" . 'call_user_func_array(\'parent::__construct\', $arguments);' . PHP_EOL . "\t\t" . '}' . PHP_EOL . "\t" . '}' . PHP_EOL . "\t" . 'public static function getMockedMethods()' . PHP_EOL . "\t" . '{' . PHP_EOL . "\t\t" . 'return ' . var_export(array('__construct'), true) . ';' . PHP_EOL . "\t" . '}' . PHP_EOL . '}' . PHP_EOL . '}'); }