diff --git a/cake/tests/cases/libs/html_coverage_report.test.php b/cake/tests/cases/libs/html_coverage_report.test.php new file mode 100644 index 00000000000..7ee39d10744 --- /dev/null +++ b/cake/tests/cases/libs/html_coverage_report.test.php @@ -0,0 +1,46 @@ +params = array('app' => false, 'plugin' => false, 'group' => false); + $coverage = array(); + $this->Coverage = new HtmlCoverageReport($coverage, $reporter); + } + +/** + * test getting the path filters. + * + * @return void + */ + function testGetPathFilter() { + $this->Coverage->appTest = false; + $result = $this->Coverage->getPathFilter(); + $this->assertEquals(TEST_CAKE_CORE_INCLUDE_PATH, $result); + + $this->Coverage->appTest = true; + $result = $this->Coverage->getPathFilter(); + $this->assertEquals(ROOT . DS . APP_DIR . DS, $result); + + $this->Coverage->appTest = false; + $this->Coverage->pluginTest = 'test_plugin'; + $result = $this->Coverage->getPathFilter(); + $this->assertEquals(ROOT . DS . APP_DIR . DS . 'plugins' . DS .'test_plugin' . DS, $result); + } + +/** + * teardown + * + * @return void + */ + function tearDown() { + unset($this->Coverage); + } +} \ No newline at end of file diff --git a/cake/tests/lib/coverage/html_coverage_report.php b/cake/tests/lib/coverage/html_coverage_report.php index 4c1840a7e68..0e47a83359d 100644 --- a/cake/tests/lib/coverage/html_coverage_report.php +++ b/cake/tests/lib/coverage/html_coverage_report.php @@ -12,7 +12,11 @@ class HtmlCoverageReport { * * @var string */ - protected $_coverage; + protected $_rawCoverage; + + public $appTest = false; + public $pluginTest = false; + public $groupTest = false; /** * Constructor @@ -20,8 +24,35 @@ class HtmlCoverageReport { * @param array $coverage Array of coverage data from PHPUnit_Test_Result * @return void */ - public function __construct($coverage) { - $this->_coverage = $coverage; + public function __construct($coverage, CakeBaseReporter $reporter) { + $this->_rawCoverage = $coverage; + $this->setParams($reporter); + } + +/** + * Pulls params out of the reporter. + * + * @return void + */ + protected function setParams(CakeBaseReporter $reporter) { + if ($reporter->params['app']) { + $this->appTest = true; + } + if ($reporter->params['group']) { + $this->groupTest = true; + } + if ($reporter->params['plugin']) { + $this->pluginTest = Inflector::underscore($reporter->params['plugin']); + } + } + +/** + * Set the coverage data array + * + * @return void + */ + public function setCoverage($coverage) { + $this->_rawCoverage = $coverage; } /** @@ -30,6 +61,54 @@ public function __construct($coverage) { * @return string compiled html report. */ public function report() { - + $pathFilter = $this->getPathFilter(); + $coverageData = $this->filterCoverageDataByPath($pathFilter); + } + +/** + * Gets the base path that the files we are interested in live in. + * If appTest ist + * + * @return void + */ + public function getPathFilter() { + $path = ROOT . DS; + if ($this->appTest) { + $path .= APP_DIR . DS; + } elseif ($this->pluginTest) { + $path = App::pluginPath($this->pluginTest); + } else { + $path = TEST_CAKE_CORE_INCLUDE_PATH; + } + return $path; + } + +/** + * Filters the coverage data by path. Files not in the provided path will be removed. + * This method will merge all the various test run reports as well into a single report per file. + * + * @param string $path Path to filter files by. + * @return array Array of coverage data for files that match the given path. + */ + public function filterCoverageDataByPath($path) { + $files = array(); + foreach ($this->_rawCoverage as $testRun) { + foreach ($testRun['files'] as $filename => $fileCoverage) { + if (strpos($filename, $path) !== 0) { + continue; + } + if (!isset($files[$filename])) { + $files[$filename] = array(); + } + foreach ($fileCoverage as $line => $value) { + if (!isset($files[$filename][$line])) { + $files[$filename][$line] = $value; + } elseif ($files[$filename][$line] < $value) { + $files[$filename][$line] = $value; + } + } + } + } + return $files; } } \ No newline at end of file