307 lines
9.6 KiB
PHP
307 lines
9.6 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* base include file for eclipse plugin
|
||
|
* @package SimpleTest
|
||
|
* @subpackage Eclipse
|
||
|
* @version $Id: eclipse.php 2011 2011-04-29 08:22:48Z pp11 $
|
||
|
*/
|
||
|
/**#@+
|
||
|
* simpletest include files
|
||
|
*/
|
||
|
include_once 'unit_tester.php';
|
||
|
include_once 'test_case.php';
|
||
|
include_once 'invoker.php';
|
||
|
include_once 'socket.php';
|
||
|
include_once 'mock_objects.php';
|
||
|
/**#@-*/
|
||
|
|
||
|
/**
|
||
|
* base reported class for eclipse plugin
|
||
|
* @package SimpleTest
|
||
|
* @subpackage Eclipse
|
||
|
*/
|
||
|
class EclipseReporter extends SimpleScorer {
|
||
|
|
||
|
/**
|
||
|
* Reporter to be run inside of Eclipse interface.
|
||
|
* @param object $listener Eclipse listener (?).
|
||
|
* @param boolean $cc Whether to include test coverage.
|
||
|
*/
|
||
|
function __construct(&$listener, $cc=false){
|
||
|
$this->listener = &$listener;
|
||
|
$this->SimpleScorer();
|
||
|
$this->case = "";
|
||
|
$this->group = "";
|
||
|
$this->method = "";
|
||
|
$this->cc = $cc;
|
||
|
$this->error = false;
|
||
|
$this->fail = false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Means to display human readable object comparisons.
|
||
|
* @return SimpleDumper Visual comparer.
|
||
|
*/
|
||
|
function getDumper() {
|
||
|
return new SimpleDumper();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Localhost connection from Eclipse.
|
||
|
* @param integer $port Port to connect to Eclipse.
|
||
|
* @param string $host Normally localhost.
|
||
|
* @return SimpleSocket Connection to Eclipse.
|
||
|
*/
|
||
|
function &createListener($port, $host="127.0.0.1"){
|
||
|
$tmplistener = &new SimpleSocket($host, $port, 5);
|
||
|
return $tmplistener;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Wraps the test in an output buffer.
|
||
|
* @param SimpleInvoker $invoker Current test runner.
|
||
|
* @return EclipseInvoker Decorator with output buffering.
|
||
|
* @access public
|
||
|
*/
|
||
|
function &createInvoker(&$invoker){
|
||
|
$eclinvoker = &new EclipseInvoker($invoker, $this->listener);
|
||
|
return $eclinvoker;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* C style escaping.
|
||
|
* @param string $raw String with backslashes, quotes and whitespace.
|
||
|
* @return string Replaced with C backslashed tokens.
|
||
|
*/
|
||
|
function escapeVal($raw){
|
||
|
$needle = array("\\","\"","/","\b","\f","\n","\r","\t");
|
||
|
$replace = array('\\\\','\"','\/','\b','\f','\n','\r','\t');
|
||
|
return str_replace($needle, $replace, $raw);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stash the first passing item. Clicking the test
|
||
|
* item goes to first pass.
|
||
|
* @param string $message Test message, but we only wnat the first.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintPass($message){
|
||
|
if (! $this->pass){
|
||
|
$this->message = $this->escapeVal($message);
|
||
|
}
|
||
|
$this->pass = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stash the first failing item. Clicking the test
|
||
|
* item goes to first fail.
|
||
|
* @param string $message Test message, but we only wnat the first.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintFail($message){
|
||
|
//only get the first failure or error
|
||
|
if (! $this->fail && ! $this->error){
|
||
|
$this->fail = true;
|
||
|
$this->message = $this->escapeVal($message);
|
||
|
$this->listener->write('{status:"fail",message:"'.$this->message.'",group:"'.$this->group.'",case:"'.$this->case.'",method:"'.$this->method.'"}');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stash the first error. Clicking the test
|
||
|
* item goes to first error.
|
||
|
* @param string $message Test message, but we only wnat the first.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintError($message){
|
||
|
if (! $this->fail && ! $this->error){
|
||
|
$this->error = true;
|
||
|
$this->message = $this->escapeVal($message);
|
||
|
$this->listener->write('{status:"error",message:"'.$this->message.'",group:"'.$this->group.'",case:"'.$this->case.'",method:"'.$this->method.'"}');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Stash the first exception. Clicking the test
|
||
|
* item goes to first message.
|
||
|
* @param string $message Test message, but we only wnat the first.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintException($exception){
|
||
|
if (! $this->fail && ! $this->error){
|
||
|
$this->error = true;
|
||
|
$message = 'Unexpected exception of type[' . get_class($exception) .
|
||
|
'] with message [' . $exception->getMessage() . '] in [' .
|
||
|
$exception->getFile() .' line '. $exception->getLine() . ']';
|
||
|
$this->message = $this->escapeVal($message);
|
||
|
$this->listener->write(
|
||
|
'{status:"error",message:"' . $this->message . '",group:"' .
|
||
|
$this->group . '",case:"' . $this->case . '",method:"' . $this->method
|
||
|
. '"}');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* We don't display any special header.
|
||
|
* @param string $test_name First test top level
|
||
|
* to start.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintHeader($test_name) {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* We don't display any special footer.
|
||
|
* @param string $test_name The top level test.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintFooter($test_name) {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Paints nothing at the start of a test method, but stash
|
||
|
* the method name for later.
|
||
|
* @param string $test_name Name of test that is starting.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintMethodStart($method) {
|
||
|
$this->pass = false;
|
||
|
$this->fail = false;
|
||
|
$this->error = false;
|
||
|
$this->method = $this->escapeVal($method);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Only send one message if the test passes, after that
|
||
|
* suppress the message.
|
||
|
* @param string $test_name Name of test that is ending.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintMethodEnd($method){
|
||
|
if ($this->fail || $this->error || ! $this->pass){
|
||
|
} else {
|
||
|
$this->listener->write(
|
||
|
'{status:"pass",message:"' . $this->message . '",group:"' .
|
||
|
$this->group . '",case:"' . $this->case . '",method:"' .
|
||
|
$this->method . '"}');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stashes the test case name for the later failure message.
|
||
|
* @param string $test_name Name of test or other label.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintCaseStart($case){
|
||
|
$this->case = $this->escapeVal($case);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Drops the name.
|
||
|
* @param string $test_name Name of test or other label.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintCaseEnd($case){
|
||
|
$this->case = "";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stashes the name of the test suite. Starts test coverage
|
||
|
* if enabled.
|
||
|
* @param string $group Name of test or other label.
|
||
|
* @param integer $size Number of test cases starting.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintGroupStart($group, $size){
|
||
|
$this->group = $this->escapeVal($group);
|
||
|
if ($this->cc){
|
||
|
if (extension_loaded('xdebug')){
|
||
|
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Paints coverage report if enabled.
|
||
|
* @param string $group Name of test or other label.
|
||
|
* @access public
|
||
|
*/
|
||
|
function paintGroupEnd($group){
|
||
|
$this->group = "";
|
||
|
$cc = "";
|
||
|
if ($this->cc){
|
||
|
if (extension_loaded('xdebug')){
|
||
|
$arrfiles = xdebug_get_code_coverage();
|
||
|
xdebug_stop_code_coverage();
|
||
|
$thisdir = dirname(__FILE__);
|
||
|
$thisdirlen = strlen($thisdir);
|
||
|
foreach ($arrfiles as $index=>$file){
|
||
|
if (substr($index, 0, $thisdirlen)===$thisdir){
|
||
|
continue;
|
||
|
}
|
||
|
$lcnt = 0;
|
||
|
$ccnt = 0;
|
||
|
foreach ($file as $line){
|
||
|
if ($line == -2){
|
||
|
continue;
|
||
|
}
|
||
|
$lcnt++;
|
||
|
if ($line==1){
|
||
|
$ccnt++;
|
||
|
}
|
||
|
}
|
||
|
if ($lcnt > 0){
|
||
|
$cc .= round(($ccnt/$lcnt) * 100, 2) . '%';
|
||
|
}else{
|
||
|
$cc .= "0.00%";
|
||
|
}
|
||
|
$cc.= "\t". $index . "\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
$this->listener->write('{status:"coverage",message:"' .
|
||
|
EclipseReporter::escapeVal($cc) . '"}');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Invoker decorator for Eclipse. Captures output until
|
||
|
* the end of the test.
|
||
|
* @package SimpleTest
|
||
|
* @subpackage Eclipse
|
||
|
*/
|
||
|
class EclipseInvoker extends SimpleInvokerDecorator{
|
||
|
function __construct(&$invoker, &$listener) {
|
||
|
$this->listener = &$listener;
|
||
|
$this->SimpleInvokerDecorator($invoker);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Starts output buffering.
|
||
|
* @param string $method Test method to call.
|
||
|
* @access public
|
||
|
*/
|
||
|
function before($method){
|
||
|
ob_start();
|
||
|
$this->invoker->before($method);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stops output buffering and send the captured output
|
||
|
* to the listener.
|
||
|
* @param string $method Test method to call.
|
||
|
* @access public
|
||
|
*/
|
||
|
function after($method) {
|
||
|
$this->invoker->after($method);
|
||
|
$output = ob_get_contents();
|
||
|
ob_end_clean();
|
||
|
if ($output !== ""){
|
||
|
$result = $this->listener->write('{status:"info",message:"' .
|
||
|
EclipseReporter::escapeVal($output) . '"}');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
?>
|