"Fixing code CodeCoverageManager so code coverage can be tested when cake core is outside of the ROOT path or set in the php.ini

Cleaned up code structure."

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@6891 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
phpnut 2008-05-15 17:27:57 +00:00
parent 17379fff80
commit 0cc0580fff

View file

@ -95,9 +95,9 @@ class CodeCoverageManager {
function start($testCaseFile, &$reporter) {
$manager =& CodeCoverageManager::getInstance();
$manager->reporter = $reporter;
$testCaseFile = str_replace(DS . DS, DS, $testCaseFile);
$thisFile = str_replace('.php', '.test.php', basename(__FILE__));
if (strpos($testCaseFile, $thisFile) !== false) {
trigger_error('Xdebug supports no parallel coverage analysis - so this is not possible.', E_USER_ERROR);
}
@ -105,13 +105,14 @@ class CodeCoverageManager {
if (isset($_GET['app'])) {
$manager->appTest = true;
}
if (isset($_GET['group'])) {
$manager->groupTest = true;
}
if (isset($_GET['plugin'])) {
$manager->pluginTest = Inflector::underscore($_GET['plugin']);
}
$manager->testCaseFile = $testCaseFile;
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
}
@ -130,10 +131,10 @@ class CodeCoverageManager {
trigger_error('This test object file is invalid: ' . $testObjectFile);
return ;
}
$dump = xdebug_get_code_coverage();
xdebug_stop_code_coverage();
$coverageData = array();
foreach ($dump as $file => $data) {
if ($file == $testObjectFile) {
$coverageData = $data;
@ -144,7 +145,6 @@ class CodeCoverageManager {
if (empty($coverageData) && $output) {
echo 'The test object file is never loaded.';
}
$execCodeLines = $manager->__getExecutableLines(file_get_contents($testObjectFile));
$result = '';
@ -168,7 +168,6 @@ class CodeCoverageManager {
return ;
}
}
$dump = xdebug_get_code_coverage();
xdebug_stop_code_coverage();
$coverageData = array();
@ -181,7 +180,6 @@ class CodeCoverageManager {
if (empty($coverageData) && $output) {
echo 'The test object files are never loaded.';
}
$execCodeLines = $manager->__getExecutableLines($testObjectFiles);
$result = '';
@ -218,7 +216,6 @@ class CodeCoverageManager {
foreach ($testObjectFile as $num => $line) {
$num++;
$foundByManualFinder = array_key_exists($num, $execCodeLines) && trim($execCodeLines[$num]) != '';
$foundByXdebug = array_key_exists($num, $coverageData) && $coverageData[$num] !== -2;
@ -236,7 +233,6 @@ class CodeCoverageManager {
}
$report .= $manager->__paintCodeline($class, $num, $line);;
}
return $manager->__paintHeader($lineCount, $coveredCount, $report);
}
/**
@ -275,8 +271,8 @@ class CodeCoverageManager {
continue;
}
$lines[$i] = 'uncovered show';
$foundEndBlockInContextSearch = false;
for ($j = 1; $j <= $numContextLines; $j++) {
$key = $i - $j;
@ -310,8 +306,8 @@ class CodeCoverageManager {
}
}
}
$key = $i + $j;
if ($key < $total) {
$lines[$key] = 'show';
@ -321,19 +317,17 @@ class CodeCoverageManager {
}
}
}
// find the last "uncovered" or "show"n line and "end" its block
$lastShownLine = $manager->__array_strpos($lines, 'show', true);
if (isset($lines[$lastShownLine])) {
$lines[$lastShownLine] .= ' end';
}
// give the first start line another class so we can control the top padding of the entire results
$firstShownLine = $manager->__array_strpos($lines, 'show');
if (isset($lines[$firstShownLine])) {
$lines[$firstShownLine] .= ' realstart';
}
// get the output
$lineCount = $coveredCount = 0;
$report = '';
@ -354,7 +348,6 @@ class CodeCoverageManager {
$report .= $manager->__paintCodeline($class, $num, $line);
}
}
return $manager->__paintHeader($lineCount, $coveredCount, $report);
}
/**
@ -373,7 +366,6 @@ class CodeCoverageManager {
foreach ($testObjectFile as $num => $line) {
$num++;
$foundByManualFinder = array_key_exists($num, $execCodeLines) && trim($execCodeLines[$num]) != '';
$foundByXdebug = array_key_exists($num, $coverageData) && $coverageData[$num] !== -2;
@ -385,7 +377,6 @@ class CodeCoverageManager {
}
}
}
return $manager->__paintHeaderCli($lineCount, $coveredCount, $report);
}
/**
@ -408,7 +399,6 @@ class CodeCoverageManager {
foreach ($testObjectFile as $num => $line) {
$num++;
$foundByManualFinder = array_key_exists($num, $execCodeLines[$objFilename]) && trim($execCodeLines[$objFilename][$num]) != '';
$foundByXdebug = array_key_exists($num, $coverageData[$objFilename]) && $coverageData[$objFilename][$num] !== -2;
@ -424,7 +414,6 @@ class CodeCoverageManager {
$class = 'ignored';
}
}
$report .= $manager->__paintGroupResultLine($objFilename, $lineCount, $coveredCount);
}
return $manager->__paintGroupResultHeader($report);
@ -449,7 +438,6 @@ class CodeCoverageManager {
foreach ($testObjectFile as $num => $line) {
$num++;
$foundByManualFinder = array_key_exists($num, $execCodeLines[$objFilename]) && trim($execCodeLines[$objFilename][$num]) != '';
$foundByXdebug = array_key_exists($num, $coverageData[$objFilename]) && $coverageData[$objFilename][$num] !== -2;
@ -461,10 +449,8 @@ class CodeCoverageManager {
}
}
}
$report .= $manager->__paintGroupResultLineCli($objFilename, $lineCount, $coveredCount);
}
return $report;
}
/**
@ -478,19 +464,18 @@ class CodeCoverageManager {
function __testObjectFileFromCaseFile($file, $isApp = true) {
$manager = CodeCoverageManager::getInstance();
$path = $manager->__getTestFilesPath($isApp);
$folderPrefixMap = array(
'behaviors' => 'models',
'components' => 'controllers',
'helpers' => 'views'
);
foreach ($folderPrefixMap as $dir => $prefix) {
if (strpos($file, $dir) === 0) {
$path .= $prefix . DS;
break;
}
}
$testManager =& new TestManager();
$testFile = str_replace(array('/', $testManager->_testExtension), array(DS, '.php'), $file);
@ -504,6 +489,7 @@ class CodeCoverageManager {
}
$path .= $testFile;
$realpath = realpath($path);
if ($realpath) {
return $realpath;
}
@ -522,9 +508,11 @@ class CodeCoverageManager {
$testManager =& new TestManager();
$path = TESTS . 'groups';
if (!$isApp) {
$path = ROOT . DS . 'cake' . DS . 'tests' . DS . 'groups';
}
if (!!$manager->pluginTest) {
$path = APP . 'plugins' . DS . $manager->pluginTest . DS . 'tests' . DS . 'groups';
}
@ -534,14 +522,13 @@ class CodeCoverageManager {
trigger_error('This group file does not exist!');
return array();
}
$result = array();
$groupContent = file_get_contents($path);
$ds = '\s*\.\s*DS\s*\.\s*';
$pluginTest = 'APP\.\'plugins\'' . $ds . '\'' . $manager->pluginTest . '\'' . $ds . '\'tests\'' . $ds . '\'cases\'';
$pattern = '/\s*TestManager::addTestFile\(\s*\$this,\s*(' . $pluginTest . '|APP_TEST_CASES|CORE_TEST_CASES)' . $ds . '(.*?)\)/i';
preg_match_all($pattern, $groupContent, $matches);
$result = array();
foreach ($matches[2] as $file) {
$patterns = array(
'/\s*\.\s*DS\s*\.\s*/',
@ -553,7 +540,6 @@ class CodeCoverageManager {
$file = str_replace("'", '', $file);
$result[] = $manager->__testObjectFileFromCaseFile($file, $isApp) . '.php';
}
return $result;
}
/**
@ -573,26 +559,19 @@ class CodeCoverageManager {
}
return $result;
}
$content = h($content);
// arrays are 0-indexed, but we want 1-indexed stuff now as we are talking code lines mind you (**)
$content = "\n" . $content;
// // strip unwanted lines
$content = preg_replace_callback("/(@codeCoverageIgnoreStart.*?@codeCoverageIgnoreEnd)/is", array('CodeCoverageManager', '__replaceWithNewlines'), $content);
// strip php | ?\> tag only lines
$content = preg_replace('/[ |\t]*[&lt;\?php|\?&gt;]+[ |\t]*/', '', $content);
// strip lines that contain only braces and parenthesis
$content = preg_replace('/[ |\t]*[{|}|\(|\)]+[ |\t]*/', '', $content);
$result = explode("\n", $content);
// unset the zero line again to get the original line numbers, but starting at 1, see (**)
unset($result[0]);
return $result;
}
/**
@ -617,7 +596,6 @@ class CodeCoverageManager {
function __paintHeader($lineCount, $coveredCount, $report) {
$manager =& CodeCoverageManager::getInstance();
$codeCoverage = $manager->__calcCoverage($lineCount, $coveredCount);
return $report = '<h2>Code Coverage: ' . $codeCoverage . '%</h2>
<div class="code-coverage-results"><pre>' . $report . '</pre></div>';
}
@ -641,8 +619,8 @@ class CodeCoverageManager {
function __paintGroupResultLine($file, $lineCount, $coveredCount) {
$manager =& CodeCoverageManager::getInstance();
$codeCoverage = $manager->__calcCoverage($lineCount, $coveredCount);
$class = 'result-bad';
if ($codeCoverage > 50) {
$class = 'result-ok';
}
@ -662,8 +640,8 @@ class CodeCoverageManager {
function __paintGroupResultLineCli($file, $lineCount, $coveredCount) {
$manager =& CodeCoverageManager::getInstance();
$codeCoverage = $manager->__calcCoverage($lineCount, $coveredCount);
$class = 'bad';
if ($codeCoverage > 50) {
$class = 'ok';
}
@ -683,7 +661,6 @@ class CodeCoverageManager {
function __paintHeaderCli($lineCount, $coveredCount, $report) {
$manager =& CodeCoverageManager::getInstance();
$codeCoverage = $manager->__calcCoverage($lineCount, $coveredCount);
return $report = 'Code Coverage: ' . $codeCoverage . '%';
}
/**
@ -694,6 +671,7 @@ class CodeCoverageManager {
*/
function __paintCodeline($class, $num, $line) {
$line = h($line);
if (trim($line) == '') {
$line = '&nbsp;'; // Win IE fix
}
@ -725,14 +703,14 @@ class CodeCoverageManager {
function __getTestFilesPath($isApp = true) {
$manager = CodeCoverageManager::getInstance();
$path = ROOT . DS;
if ($isApp) {
$path .= APP_DIR . DS;
} elseif (!!$manager->pluginTest) {
$path .= APP_DIR . DS . 'plugins' . DS . $manager->pluginTest . DS;
} else {
$path = ROOT.DS.'cake'.DS;
$path = TEST_CAKE_CORE_INCLUDE_PATH;
}
return $path;
}
/**
@ -751,6 +729,7 @@ class CodeCoverageManager {
if ($reverse) {
$arr = array_reverse($arr, true);
}
foreach ($arr as $key => $val) {
if (strpos($val, $needle) !== false) {
return $key;