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

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

      * Called when a test run starts.
      *
      * @param   unittest.TestSuite suite
Index: skeleton/unittest/TestNotRun.class.php
===================================================================
--- skeleton/unittest/TestNotRun.class.php	(revision 0)
+++ skeleton/unittest/TestNotRun.class.php	(revision 0)
@@ -0,0 +1,54 @@
+<?php
+/* This class is part of the XP framework
+ *
+ * $Id$
+ */
+
+  uses('unittest.TestSkipped');
+
+  /**
+   * Indicates a test was ignored
+   *
+   * @see      xp://unittest.TestSkipped
+   */
+  class TestNotRun extends Object implements TestSkipped {
+    public
+      $reason   = '',
+      $test     = NULL;
+      
+    /**
+     * Constructor
+     *
+     * @param   unittest.TestCase test
+     * @param   string reason
+     */
+    public function __construct(TestCase $test, $reason) {
+      $this->test= $test;
+      $this->reason= $reason;
+    }
+
+    /**
+     * Returns elapsed time
+     *
+     * @return  float
+     */
+    public function elapsed() {
+      return 0.0;
+    }
+
+    /**
+     * Return a string representation of this class
+     *
+     * @return  string
+     */
+    public function toString() {
+      return (
+        $this->getClassName().
+        '(test= '.$this->test->getClassName().'::'.$this->test->getName().
+        sprintf(', time= %.3f seconds', $this->elapsed).") {\n  ".
+        str_replace("\n", "\n  ", $this->reason)."\n".
+        ' }'
+      );
+    }
+  }
+?>
Index: skeleton/unittest/TestFailure.class.php
===================================================================
--- skeleton/unittest/TestFailure.class.php	(revision 13659)
+++ skeleton/unittest/TestFailure.class.php	(working copy)
@@ -9,41 +9,10 @@
   /**
    * Indicates a test failed
    *
-   * @see      xp://unittest.TestResult
-   * @purpose  Result wrapper
+   * @see      xp://unittest.TestAssertionFailed
+   * @see      xp://unittest.TestError
    */
-  class TestFailure extends Object implements TestOutcome {
-    public
-      $reason   = NULL,
-      $test     = NULL,
-      $elapsed  = 0.0;
-      
-    /**
-     * Constructor
-     *
-     * @param   unittest.TestCase test
-     * @param   mixed reason
-     * @param   float elapsed
-     */
-    public function __construct($test, $reason, $elapsed) {
-      $this->test= $test;
-      $this->reason= $reason;
-      $this->elapsed= $elapsed;
-    }
-
-    /**
-     * Return a string representation of this class
-     *
-     * @return  string
-     */
-    public function toString() {
-      return (
-        $this->getClassName().
-        '(test= '.$this->test->getClassName().'::'.$this->test->getName().
-        sprintf(', time= %.3f seconds', $this->elapsed).") {\n  ".
-        str_replace("\n", "\n  ", xp::stringOf($this->reason))."\n".
-        ' }'
-      );
-    }
+  interface TestFailure extends TestOutcome {
+    
   }
 ?>
Index: skeleton/unittest/TestSuite.class.php
===================================================================
--- skeleton/unittest/TestSuite.class.php	(revision 13659)
+++ skeleton/unittest/TestSuite.class.php	(working copy)
@@ -9,6 +9,9 @@
     'unittest.TestCase',
     'unittest.TestResult',
     'unittest.TestListener',
+    'unittest.TestNotRun',
+    'unittest.TestError',
+    'unittest.TestWarning',
     'util.NoSuchElementException',
     'lang.MethodNotImplementedException'
   );
@@ -169,16 +172,24 @@
       
       // Check for @ignore
       if ($method->hasAnnotation('ignore')) {
-        $this->notifyListeners('testSkipped', array(
-          $result->setSkipped($test, $method->getAnnotation('ignore'), 0.0)
+        $this->notifyListeners('testNotRun', array(
+          $result->set($test, new TestNotRun($test, $method->getAnnotation('ignore')))
         ));
         return;
       }
 
       // Check for @expect
       $expected= NULL;
