Improve CLI use of Debugging tools and test execution.

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@60581 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Sam Minnee 2008-08-13 01:47:05 +00:00
parent 0e0fc7a1cb
commit 0bdc8fad81
5 changed files with 76 additions and 18 deletions

View File

@ -51,6 +51,19 @@ class CliDebugView extends DebugView {
function writeTrace() {
Debug::backtrace();
}
/**
* Render the information header for the view
*
* @param string $title
* @param string $title
*/
public function writeInfo($title, $subtitle, $description=false) {
echo wordwrap(strtoupper($title),100) . "\n";
echo wordwrap($subtitle,100) . "\n";
echo str_repeat('-',min(100,max(strlen($title),strlen($subtitle)))) . "\n";
echo wordwrap($description,100) . "\n\n";
}
}

40
dev/CliTestReporter.php Normal file
View File

@ -0,0 +1,40 @@
<?php
/**
* Test reporter optimised for CLI (ie, plain-text) output
*/
class CliTestReporter extends SapphireTestReporter {
/**
* Display error bar if it exists
*/
public function writeResults() {
$passCount = 0;
$failCount = 0;
$testCount = 0;
$errorCount = 0;
foreach($this->suiteResults['suites'] as $suite) {
foreach($suite['tests'] as $test) {
$testCount++;
($test['status'] == 1) ? $passCount++ : $failCount++;
}
}
$result = ($failCount > 0) ? 'fail' : 'pass';
echo "$testCount tests run: $passCount passes, $failCount fails, and 0 exceptions\n\n";
}
public function endTest( PHPUnit_Framework_Test $test, $time) {
parent::endTest($test, $time);
$this->writeTest($this->currentTest);
}
protected function writeTest($test) {
if ($test['status'] != 1) {
echo $this->testNameToPhrase($test['name']) . "\n". $test['message'] . "\n";
echo "In line {$test['exception']['line']} of {$test['exception']['file']}" . "\n\n";
}
}
}

View File

@ -75,7 +75,7 @@ class Debug {
if(!Director::isLive()) {
if($showHeader) {
$caller = Debug::caller();
if(Director::is_ajax())
if(Director::is_ajax() || Director::is_cli())
echo "Debug ($caller[class]$caller[type]$caller[function]() in line $caller[line] of " . basename($caller['file']) . ")\n";
else
echo "<div style=\"background-color: white; text-align: left;\">\n<hr>\n<h3>Debug <span style=\"font-size: 65%\">($caller[class]$caller[type]$caller[function]() \n<span style=\"font-weight:normal\">in line</span> $caller[line] \n<span style=\"font-weight:normal\">of</span> " . basename($caller['file']) . ")</span>\n</h3>\n";
@ -83,7 +83,8 @@ class Debug {
echo Debug::text($val);
if(!Director::is_ajax()) echo "</div>";
if(!Director::is_ajax() && !Director::is_cli()) echo "</div>";
else echo "\n\n";
}
}
@ -153,7 +154,7 @@ class Debug {
} else if (is_object($val)) {
$val = var_export($val, true);
} else {
if(true || !Director::is_ajax()) {
if(!Director::is_cli() && !Director::is_ajax()) {
$val = "<pre style=\"font-family: Courier new\">" . htmlentities($val) . "</pre>\n";
}
}

View File

@ -42,27 +42,27 @@ class SapphireTestReporter implements PHPUnit_Framework_TestListener {
* Holds array of suites and total number of tests run
* @var array
*/
private $suiteResults;
protected $suiteResults;
/**
* Holds data of current suite that is been run
* @var array
*/
private $currentSuite;
protected $currentSuite;
/**
* Holds data of current test that is been run
* @var array
*/
private $currentTest;
protected $currentTest;
/**
* Whether PEAR Benchmark_Timer is available for timing
* @var boolean
*/
private $hasTimer;
protected $hasTimer;
/**
* Holds the PEAR Benchmark_Timer object
* @var obj Benchmark_Timer
*/
private $timer;
protected $timer;
/**
* Constructor, checks to see availability of PEAR Benchmark_Timer and
@ -277,7 +277,7 @@ class SapphireTestReporter implements PHPUnit_Framework_TestListener {
}
private function testNameToPhrase($name) {
protected function testNameToPhrase($name) {
return ucfirst(preg_replace("/([a-z])([A-Z])/", "$1 $2", $name));
}

View File

@ -47,7 +47,7 @@ class TestRunner extends Controller {
function init() {
parent::init();
if (!self::$default_reporter) self::set_reporter('DebugView');
if (!self::$default_reporter) self::set_reporter(Director::is_cli() ? 'CliDebugView' : 'DebugView');
}
public function Link() {
@ -126,7 +126,16 @@ class TestRunner extends Controller {
restore_error_handler();
/*, array("reportDirectory" => "/Users/sminnee/phpunit-report")*/
$reporter = new SapphireTestReporter();
if(Director::is_cli()) $reporter = new CliTestReporter();
else $reporter = new SapphireTestReporter();
self::$default_reporter->writeHeader("Sapphire Test Runner");
if (count($classList) > 1) {
self::$default_reporter->writeInfo("All Tests", "Running test cases: " . implode(", ", $classList));
} else {
self::$default_reporter->writeInfo($classList[0], "");
}
$results = new PHPUnit_Framework_TestResult();
$results->addListener($reporter);
@ -139,12 +148,6 @@ class TestRunner extends Controller {
//$testResult = PHPUnit_TextUI_TestRunner::run($suite);
}
self::$default_reporter->writeHeader();
if (count($classList) > 1) {
self::$default_reporter->writeInfo("All Tests", "Running test cases: " . implode(", ", $classList) .")");
} else {
self::$default_reporter->writeInfo($classList[0], "");
}
echo '<div class="trace">';
$reporter->writeResults();
@ -154,8 +157,9 @@ class TestRunner extends Controller {
Debug::loadErrorHandlers();
if(!Director::is_cli()) self::$default_reporter->writeFooter();
// Todo: we should figure out how to pass this data back through Director more cleanly
if(Director::is_cli() && ($testResult->failureCount() + $testResult->errorCount()) > 0) exit(2);
if(Director::is_cli() && ($results->failureCount() + $results->errorCount()) > 0) exit(2);
}
}