        } else if (sizeof(xp::registry('errors')) > 0) {
 -        $this->notifyListeners('testFailed', array(
 -          $result->setFailed($test, new AssertionFailedError('Errors', '<Non-clean error stack>', '<no errors>'), $timer->elapsedTime())
++        $w= array();
++        foreach (xp::registry('errors') as $file => $lookup) {
++          foreach ($lookup as $line => $messages) {
++            foreach ($messages as $message => $detail) {
++              $w[]= sprintf(
++                '"%s" in %s::%s() (%s, line %d, occured %s)',
++                $message,
++                $detail['class'],
++                $detail['method'],
++                basename($file),
++                $line,
++                1 === $detail['cnt'] ? 'once' : $detail['cnt'].' times'
++              );
++            }
++          }
++        }
 +        $this->notifyListeners('testError', array(
-+          $result->setFailed(
-+            $test, 
-+            new AssertionFailedError('Errors', '<Non-clean error stack>', '<no errors>'), 
-+            $timer->elapsedTime()
-+          )
++          $result->set($test, new TestWarning($test, $w, $timer->elapsedTime()))
          ));
        } else if ($eta && $timer->elapsedTime() > $eta) {
          $this->notifyListeners('testFailed', array(

+     * @param   unittest.TestSkipped ignore
+     */
+    public function testNotRun(TestSkipped $ignore) {
+      $this->invocations[__FUNCTION__]= new ArrayList($ignore);
+    }
+

+        $this->suite->runTest($case);
+        $this->assertEquals($this->suite, $this->invocations['testRunStarted'][0]);
+        $this->assertEquals($case, $this->invocations['testStarted'][0]);
+        $this->assertSubclass($this->invocations['testError'][0], 'unittest.TestFailure');
+        $this->assertEquals($this->suite, $this->invocations['testRunFinished'][0]);
+        $this->assertClass($this->invocations['testRunFinished'][1], 'unittest.TestResult');
+      }
