Skip to content

Commit

Permalink
Starting work on HtmlCoverageReport and adding a test case.
Browse files Browse the repository at this point in the history
  • Loading branch information
markstory committed May 8, 2010
1 parent fd07380 commit ac5f731
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 4 deletions.
46 changes: 46 additions & 0 deletions cake/tests/cases/libs/html_coverage_report.test.php
@@ -0,0 +1,46 @@
<?php

require_once CAKE . 'tests' . DS . 'lib' . DS . 'coverage' . DS . 'html_coverage_report.php';

class HtmlCoverageReportTest extends CakeTestCase {
/**
* setup
*
* @return void
*/
public function setUp() {
$reporter = new CakeBaseReporter();
$reporter->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);
}
}
87 changes: 83 additions & 4 deletions cake/tests/lib/coverage/html_coverage_report.php
Expand Up @@ -12,16 +12,47 @@ class HtmlCoverageReport {
*
* @var string
*/
protected $_coverage;
protected $_rawCoverage;

public $appTest = false;
public $pluginTest = false;
public $groupTest = false;

/**
* Constructor
*
* @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;
}

/**
Expand All @@ -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;
}
}

0 comments on commit ac5f731

Please sign in to comment.