From 61bb16ee2e5f0a66234e1575242169a10fde47b5 Mon Sep 17 00:00:00 2001
From: xue <>
Date: Fri, 7 Jul 2006 14:54:15 +0000
Subject: Merge from 3.0 branch till 1253.
---
.../simpletest/HtmlReporterWithCoverage.php | 268 +++++++++++++++++++++
1 file changed, 268 insertions(+)
create mode 100644 tests/test_tools/simpletest/HtmlReporterWithCoverage.php
(limited to 'tests/test_tools/simpletest/HtmlReporterWithCoverage.php')
diff --git a/tests/test_tools/simpletest/HtmlReporterWithCoverage.php b/tests/test_tools/simpletest/HtmlReporterWithCoverage.php
new file mode 100644
index 00000000..abd10076
--- /dev/null
+++ b/tests/test_tools/simpletest/HtmlReporterWithCoverage.php
@@ -0,0 +1,268 @@
+painter = $painter;
+ $this->base_dir = $base_dir;
+ }
+
+ function paintHeader($test_name, $charset="UTF-8")
+ {
+ $this->sendNoCacheHeaders();
+ header('Content-Type: text/html; Charset='.$charset);
+ print "\n
\n$test_name\n";
+ print "";
+ print "\n";
+ print "\n\n";
+ print "$test_name
\n";
+ flush();
+
+ if (extension_loaded('xdebug'))
+ xdebug_start_code_coverage(XDEBUG_CC_UNUSED);
+
+ }
+
+ /**
+ *
+ */
+ function _getCss()
+ {
+ $contents = parent::_getCss()."\n ";
+ $contents .= '
+ .bar { float: left; display: inline; border: 1px solid #eee; width: 300px; white-space: nowrap;}
+ .percentage { float: left; background-color: #eef; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 0.65em; padding: 5px; margin-right: }
+ .coverage {margin: 0.4em; }
+ .coverage a {
+ padding-left: 0.5em;
+ }
+ .coverage:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+ }
+ .coverage {display: inline-block;}
+ /* Hides from IE-mac \*/
+ * html .coverage {height: 1%;}
+ .coverage {display: block;}
+ /* End hide from IE-mac */
+ ';
+ Return $contents;
+ }
+
+ function paintFooter($test_name)
+ {
+ if (extension_loaded('xdebug'))
+ {
+ $this->coverage = xdebug_get_code_coverage();
+ xdebug_stop_code_coverage();
+ }
+
+ $colour = ($this->getFailCount() + $this->getExceptionCount() > 0 ? "red" : "green");
+ print "";
+ print $this->getTestCaseProgress() . "/" . $this->getTestCaseCount();
+ print " test cases complete:\n";
+ print "" . $this->getPassCount() . " passes, ";
+ print "" . $this->getFailCount() . " fails and ";
+ print "" . $this->getExceptionCount() . " exceptions.";
+ print "
\n";
+ $this->paintCoverage();
+ print "\n\n";
+ }
+
+ function paintCoverage()
+ {
+ $dir = dirname(__FILE__);
+ if(count($this->coverage) > 0)
+ print 'Code Coverage
';
+
+
+ ksort($this->coverage);
+
+ $details = array();
+ foreach($this->coverage as $file => $coverage)
+ {
+ if(is_int(strpos($file, $dir)) == false
+ && is_int(strpos($file, 'simpletest')) == false
+ && is_int(strpos($file, $this->base_dir)))
+ {
+ $total = HTMLCoverageReport::codelines($file);
+ $executed = count($coverage);
+ $percentage = sprintf('%01d',$executed/$total*100);
+ $width = $percentage * 3;
+ $filename = str_replace($this->base_dir, '',$file);
+ $link = $this->constructURL($filename, $coverage);
+
+ $detail['total'] = $total;
+ $detail['executed'] = $executed;
+ $detail['width'] = $width;
+ $detail['filename'] = $filename;
+ $detail['link'] = $link;
+ $details[$percentage][] = $detail;
+ }
+ }
+ krsort($details);
+ foreach($details as $percentage => $files)
+ {
+ foreach($files as $detail)
+ {
+ $total = $detail['total'];
+ $executed = $detail['executed'];
+ $width = $detail['width'];
+ $filename = $detail['filename'];
+ $link = $detail['link'];
+
+ print "";
+ print "
";
+ print "";
+ print "$executed/$total\n";
+ print "$percentage%\n";
+ print "
{$filename}\n";
+ print "
\n";
+ }
+ }
+ }
+
+ function constructURL($file, $coverage)
+ {
+ $file = rawurlencode($file);
+ $lines = implode(',', array_keys($coverage));
+ return $this->painter.'?file='.$file.'&lines='.$lines;
+ }
+}
+
+
+class HTMLCoverageReport extends HtmlReporter
+{
+ protected $file;
+ protected $lines;
+ protected $name;
+
+ function __construct($file, $name, $lines)
+ {
+ $this->file = $file;
+ $this->lines = $lines;
+ $this->name = $name;
+ }
+
+ function show()
+ {
+ $this->paintHeader($this->name);
+
+ $contents = file($this->file);
+ foreach($contents as $count => $line)
+ {
+ $num = ($count+1);
+ $line = preg_replace("/\\n|\\r/",'',$line);
+ $line = htmlspecialchars($line);
+ $line = str_replace(' ',' ',$line);
+ $line = str_replace("\t",' ',$line);
+ if(in_array($count+1, $this->lines))
+ echo "$num $line
\n";
+ else
+ echo "$num $line
\n";
+ }
+
+ $this->paintFooter();
+ }
+
+ function paintHeader($file, $charset="UTF-8")
+ {
+ $total = $this->codelines($this->file);
+ $executed = count($this->lines);
+ $percentage = sprintf('%01.2f',$executed/$total*100);
+
+ $this->sendNoCacheHeaders();
+ header('Content-Type: text/html Charset='.$charset);
+ print "\n\nCode Coverage: $file\n";
+ print "";
+ print "\n";
+ print "\n\n";
+ print "Code Coverage
\n";
+ print "$file
";
+ print " Total code lines: {$total}
Total lines executed: {$executed} ({$percentage}%)
";
+ flush();
+ }
+
+ function paintFooter($test_name)
+ {
+ print "\n\n";
+ }
+
+ static function codelines($file)
+ {
+ $source = file_get_contents($file);
+ $tokens = @token_get_all($source);
+
+ $lines = '';
+
+ foreach ($tokens as $token)
+ {
+ if (is_string($token))
+ {
+ // simple 1-character token
+ $lines .= $token;
+ }
+ else
+ {
+ // token array
+ list($id, $text) = $token;
+
+ switch ($id)
+ {
+ case T_COMMENT:
+ case T_ML_COMMENT: // we've defined this
+ case T_DOC_COMMENT: // and this
+ // no action on comments
+ break;
+
+ default:
+ // anything else -> output "as is"
+ //echo $text;
+ $lines .= $text;
+ break;
+ }
+ }
+ }
+
+ $lines = preg_replace('/\\n\s*$/m',"",$lines);
+ $codelines = explode("\n",$lines);
+ $count = 0;
+ $patterns[] = '^\s*{\s*$';
+ $patterns[] = '<\?';
+ $patterns[] = '^\s*(private|protected|public)\s+\$';
+ $pattern = '/'.implode('|', $patterns).'/';
+ foreach($codelines as $line)
+ {
+ if(!preg_match($pattern, $line))
+ $count++;
+ }
+ return $count;
+ //var_dump($codelines);
+ //return count($codelines);
+ }
+}
+
+?>
--
cgit v1.2.3