From 71af1261712492225c7cb846f3224834fd1df640 Mon Sep 17 00:00:00 2001
From: mark_story <mark@mark-story.com>
Date: Wed, 14 Jul 2010 22:58:42 -0400
Subject: [PATCH] Changing HtmlReporter to print out testname and stack trace
 instead of trying to guess where things went wrong.

---
 .../tests/lib/reporter/cake_base_reporter.php |  4 +-
 .../tests/lib/reporter/cake_html_reporter.php | 42 ++++++++++---------
 2 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/cake/tests/lib/reporter/cake_base_reporter.php b/cake/tests/lib/reporter/cake_base_reporter.php
index c7d7a7648..7f1eea9d7 100644
--- a/cake/tests/lib/reporter/cake_base_reporter.php
+++ b/cake/tests/lib/reporter/cake_base_reporter.php
@@ -159,7 +159,7 @@ class CakeBaseReporter implements PHPUnit_Framework_TestListener {
 * @param  float                  $time
 */
 	public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) {
-		$this->paintException($e);
+		$this->paintException($e, $test);
 	}
 
 /**
@@ -170,7 +170,7 @@ class CakeBaseReporter implements PHPUnit_Framework_TestListener {
 * @param  float $time
 */
 	public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) {
-		$this->paintFail($e);
+		$this->paintFail($e, $test);
 	}
 
 /**
diff --git a/cake/tests/lib/reporter/cake_html_reporter.php b/cake/tests/lib/reporter/cake_html_reporter.php
index 27a482a87..e8c51e69e 100755
--- a/cake/tests/lib/reporter/cake_html_reporter.php
+++ b/cake/tests/lib/reporter/cake_html_reporter.php
@@ -227,29 +227,16 @@ class CakeHtmlReporter extends CakeBaseReporter {
  *   the context of the other tests.
  * @return void
  */
-	public function paintFail($message) {
-		$context = $message->getTrace();
-		$realContext = $context[3];
-		$class = new ReflectionClass($realContext['class']);
-
-		$deeper = false;
-		if ($class->getParentClass()) {
-			$deeper = $class->getParentClass()->getName() === 'PHPUnit_Framework_TestCase';
-		}
-		$deeper = $deeper || !$class->isSubclassOf('PHPUnit_Framework_TestCase');
-		if ($deeper) {
-			$realContext = $context[4];
-			$context = $context[3];
-		} else {
-			$context = $context[2];
-		}
+	public function paintFail($message, $test) {
+		$trace = $this->_getStackTrace($message);
+		$testName = get_class($test) . '(' . $test->getName() . ')';
 
 		echo "<li class='fail'>\n";
 		echo "<span>Failed</span>";
 		echo "<div class='msg'><pre>" . $this->_htmlEntities($message->toString()) . "</pre></div>\n";
-		echo "<div class='msg'>" . sprintf(__('File: %s'), $context['file']) . "</div>\n";
-		echo "<div class='msg'>" . sprintf(__('Method: %s'), $realContext['function']) . "</div>\n";
-		echo "<div class='msg'>" . sprintf(__('Line: %s'), $context['line']) . "</div>\n";
+
+		echo "<div class='msg'>" . sprintf(__('Test case: %s'), $testName) . "</div>\n";
+		echo "<div class='msg'>" . __('Stack trace:') . '<br />' . $trace . "</div>\n";
 		echo "</li>\n";
 	}
 
@@ -278,7 +265,7 @@ class CakeHtmlReporter extends CakeBaseReporter {
  * @param Exception $exception Exception to display.
  * @return void
  */
-	public function paintException($exception) {
+	public function paintException($exception, $test) {
 		echo "<li class='fail'>\n";
 		echo "<span>Exception</span>";
 		$message = 'Unexpected exception of type [' . get_class($exception) .
@@ -323,6 +310,21 @@ class CakeHtmlReporter extends CakeBaseReporter {
 		return htmlentities($message, ENT_COMPAT, $this->_characterSet);
 	}
 
+/**
+ * Gets a formatted stack trace.
+ *
+ * @param Exception $e Exception to get a stack trace for.
+ * @return string Generated stack trace.
+ */
+	protected function _getStackTrace(Exception $e) {
+		$trace = $e->getTrace();
+		$out = array();
+		foreach ($trace as $frame) {
+			$out[] = $frame['file'] . ' : ' . $frame['line'];
+		}
+		return implode('<br />', $out);
+	}
+
 /**
  * A test suite started.
  *