Deprecated: Assigning the return value of new by reference is deprecated in /home/bluestat/public_html/source/index.php on line 477
.
namespace phalanx\test;
// This TestListener is meant to print to stdout and show CLI output for the
// running test suite. It unfortunately conflicts with the standard text runner
// UI, so it must be configured manually (see runner.php for an example).
//
// The format of the output is designed to mimic the Google Test (GTest)
// framework output.
class TestListener implements \PHPUnit_Framework_TestListener
{
const COLOR_NONE = 0;
const COLOR_RED = 1;
const COLOR_GREEN = 2;
// The start time of the test suite.
private $suite_start_time = 0;
// The suite depth.
private $suite_depth = 0;
// The number of errors that occured in a suite.
private $suite_error_counts = 0;
// Array of failing tests.
private $failing = array();
// An error occurred.
public function addError(\PHPUnit_Framework_Test $test,
\Exception $e,
$time)
{
$this->_Print(NULL, $this->_ErrorLocation($e));
$this->_Print(' ', $e->GetMessage());
$this->_Print('[ ERROR ]', $test->ToString() . ' (' . $this->_Round($time) . ' ms)', self::COLOR_RED);
++$this->suite_error_count;
$this->failing[] = $test->ToString();
}
// A failure occurred.
public function addFailure(\PHPUnit_Framework_Test $test,
\PHPUnit_Framework_AssertionFailedError $e,
$time)
{
$this->_Print(NULL, $this->_ErrorLocation($e));
$this->_Print(' ', $e->GetMessage());
$this->_Print('[ FAILED ]', $test->ToString() . ' (' . $this->_Round($time) . ' ms)', self::COLOR_RED);
++$this->suite_error_count;
$this->failing[] = $test->ToString();
}
// Incomplete test.
public function addIncompleteTest(\PHPUnit_Framework_Test $test,
\Exception $e, $time)
{
$this->_Print('INCOMPLETE', $test->ToString());
}
// Skipped test.
public function addSkippedTest(\PHPUnit_Framework_Test $test,
\Exception $e,
$time)
{
$this->_Print('SKIPPED', $test->ToString());
}
// A test suite started.
public function startTestSuite(\PHPUnit_Framework_TestSuite $suite)
{
$this->_Print($this->_SuiteMarker(), $this->_DescribeSuite($suite), self::COLOR_GREEN);
$this->suite_start_time = microtime(TRUE);
++$this->suite_depth;
$this->suite_error_count = 0;
}
// A test suite ended.
public function endTestSuite(\PHPUnit_Framework_TestSuite $suite)
{
$main_suite = (--$this->suite_depth == 0);
$color_red = (($main_suite && count($this->failing)) || $this->suite_error_count > 0);
$delta = microtime(TRUE) - $this->suite_start_time;
$this->_Print(
$this->_SuiteMarker(),
$this->_DescribeSuite($suite) . ' (' . $this->_Round($delta) . ' ms total)',
($color_red ? self::COLOR_RED : self::COLOR_GREEN));
echo "\n";
// If this is the main suite (the one to which all other tests/suites
// are attached), then print the test summary.
if ($main_suite && $color_red) {
$count = count($this->failing);
$plural = ($count > 1 ? 'S' : '');
echo " YOU HAVE $count FAILING TEST{$plural}:\n";
foreach ($this->failing as $test) {
echo " $test\n";
}
echo "\n";
}
}
// A test started.
public function startTest(\PHPUnit_Framework_Test $test)
{
$this->_Print('[ RUN ]', $test->ToString(), self::COLOR_GREEN);
}
// A test ended.
public function endTest(\PHPUnit_Framework_Test $test, $time)
{
$this->_Print('[ OK ]', $test->ToString() . ' (' . $this->_Round($time) . ' ms)', self::COLOR_GREEN);
}
// Returns the description for a test suite.
private function _DescribeSuite(\PHPUnit_Framework_TestSuite $suite)
{
$count = $suite->Count();
return sprintf('%d test%s from %s', $count, ($count > 1 ? 's' : ''), $suite->GetName());
}
// Returns the test suite marker.
private function _SuiteMarker()
{
if ($this->suite_depth == 0)
return '[==========]';
else
return '[----------]';
}
// Prints a line to output.
private function _Print($column, $annotation, $color = self::COLOR_NONE)
{
$color_code = '';
switch ($color) {
case self::COLOR_RED: $color_code = '0;31'; break;
case self::COLOR_GREEN: $color_code = '0;32'; break;
}
if ($color != self::COLOR_NONE) {
$column = "\x1b[{$color_code}m{$column}\x1b[0m";
}
echo "$column $annotation\n";
}
// Takes in a float from microtime() and returns it formatted to display as
// milliseconds.
private function _Round($time)
{
return round($time * 1000);
}
// Returns the error location as a string.
private function _ErrorLocation(\Exception $e)
{
$trace = $e->GetTrace();
$frame = NULL;
// Find the first frame from non-PHPUnit code, which is where the error
// should have occurred.
foreach ($trace as $f) {
if (strpos($f['file'], 'PHPUnit/Framework') === FALSE) {
$frame = $f;
break;
}
}
if (!$frame)
$frame = $trace[0];
return $frame['file'] . ':' . $frame['line'];
}
}