Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
25.00% |
1 / 4 |
CRAP | |
67.14% |
47 / 70 |
MethodDefinitionPass | |
0.00% |
0 / 1 |
|
25.00% |
1 / 4 |
36.64 | |
67.14% |
47 / 70 |
apply | |
0.00% |
0 / 1 |
6.40 | |
77.78% |
14 / 18 |
|||
renderParams | |
0.00% |
0 / 1 |
8.32 | |
70.00% |
14 / 20 |
|||
appendToClass | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
renderMethodBody | |
0.00% |
0 / 1 |
11.41 | |
55.17% |
16 / 29 |
<?php | |
namespace Mockery\Generator\StringManipulation\Pass; | |
use Mockery\Generator\Method; | |
use Mockery\Generator\MockConfiguration; | |
class MethodDefinitionPass implements Pass | |
{ | |
public function apply($code, MockConfiguration $config) | |
{ | |
foreach ($config->getMethodsToMock() as $method) { | |
if ($method->isPublic()) { | |
$methodDef = 'public'; | |
} elseif($method->isProtected()) { | |
$methodDef = 'protected'; | |
} else { | |
$methodDef = 'private'; | |
} | |
if ($method->isStatic()) { | |
$methodDef .= ' static'; | |
} | |
$methodDef .= ' function '; | |
$methodDef .= $method->returnsReference() ? ' & ' : ''; | |
$methodDef .= $method->getName(); | |
$methodDef .= $this->renderParams($method, $config); | |
$methodDef .= $this->renderMethodBody($method, $config); | |
$code = $this->appendToClass($code, $methodDef); | |
} | |
return $code; | |
} | |
protected function renderParams(Method $method, $config) | |
{ | |
$class = $method->getDeclaringClass(); | |
if ($class->isInternal()) { | |
$overrides = $config->getParameterOverrides(); | |
if (isset($overrides[strtolower($class->getName())][$method->getName()])) { | |
return '(' . implode(',', $overrides[strtolower($class->getName())][$method->getName()]) . ')'; | |
} | |
} | |
$methodParams = array(); | |
$params = $method->getParameters(); | |
foreach ($params as $param) { | |
$paramDef = $param->getTypeHintAsString(); | |
$paramDef .= $param->isPassedByReference() ? '&' : ''; | |
$paramDef .= '$' . $param->getName(); | |
if (false !== $param->isDefaultValueAvailable()) { | |
$paramDef .= ' = ' . var_export($param->getDefaultValue(), true); | |
} elseif ($param->isOptional()) { | |
$paramDef .= ' = null'; | |
} | |
$methodParams[] = $paramDef; | |
} | |
return '(' . implode(', ', $methodParams) . ')'; | |
} | |
protected function appendToClass($class, $code) | |
{ | |
$lastBrace = strrpos($class, "}"); | |
$class = substr($class, 0, $lastBrace) . $code . "\n }\n"; | |
return $class; | |
} | |
private function renderMethodBody($method, $config) | |
{ | |
$invoke = $method->isStatic() ? 'static::_mockery_handleStaticMethodCall' : '$this->_mockery_handleMethodCall'; | |
$body = <<<BODY | |
{ | |
\$argc = func_num_args(); | |
\$argv = func_get_args(); | |
BODY; | |
// Fix up known parameters by reference - used func_get_args() above | |
// in case more parameters are passed in than the function definition | |
// says - eg varargs. | |
$class = $method->getDeclaringClass(); | |
$class_name = strtolower($class->getName()); | |
$overrides = $config->getParameterOverrides(); | |
if (isset($overrides[$class_name][$method->getName()])) { | |
$params = array_values($overrides[$class_name][$method->getName()]); | |
$paramCount = count($params); | |
for ($i = 0; $i < $paramCount; ++$i) { | |
$param = $params[$i]; | |
if (strpos($param, '&') !== false) { | |
$body .= <<<BODY | |
if (\$argc > $i) { | |
\$argv[$i] = {$param}; | |
} | |
BODY; | |
} | |
} | |
} else { | |
$params = array_values($method->getParameters()); | |
$paramCount = count($params); | |
for ($i = 0; $i < $paramCount; ++$i) { | |
$param = $params[$i]; | |
if (!$param->isPassedByReference()) { | |
continue; | |
} | |
$body .= <<<BODY | |
if (\$argc > $i) { | |
\$argv[$i] =& \${$param->getName()}; | |
} | |
BODY; | |
} | |
} | |
$body .= <<<BODY | |
\$ret = {$invoke}(__FUNCTION__, \$argv); | |
return \$ret; | |
} | |
BODY; | |
return $body; | |
} | |
} |