? sites/default/files
? sites/default/settings.php
Index: modules/simpletest/drupal_reporter.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/drupal_reporter.php,v
retrieving revision 1.1
diff -u -r1.1 drupal_reporter.php
--- modules/simpletest/drupal_reporter.php	20 Apr 2008 18:34:43 -0000	1.1
+++ modules/simpletest/drupal_reporter.php	23 Apr 2008 04:04:15 -0000
@@ -58,10 +58,11 @@
   function paintPass($message, $group) {
     parent::paintPass($message);
     if ($group == 'Other') {
-      $group = t($group);
+      $info = $this->test_info_stack[count($this->test_info_stack) - 1];
+      $group = $info['name'];
     }
     $this->test_stack[] = array(
-      'data' => array($message,  "<strong>[$group]</strong>", t('Pass'), theme('image', 'misc/watchdog-ok.png')),
+      'data' => array($message,  array('data' => "<strong>[$group]</strong>", 'class' => 'simpletest-group'), t('Pass'), theme('image', 'misc/watchdog-ok.png')),
       'class' => 'simpletest-pass',
     );
   }
@@ -77,10 +78,11 @@
   function paintFail($message, $group) {
     parent::paintFail($message);
     if ($group == 'Other') {
-      $group = t($group);
+      $info = $this->test_info_stack[count($this->test_info_stack) - 1];
+      $group = $info['name'];
     }
     $this->test_stack[] = array(
-      'data' => array($message, "<strong>[$group]</strong>", t('Fail'), theme('image', 'misc/watchdog-error.png')),
+      'data' => array($message, array('data' => "<strong>[$group]</strong>", 'class' => 'simpletest-group'), t('Fail'), theme('image', 'misc/watchdog-error.png')),
       'class' => 'simpletest-fail',
     );
   }
@@ -94,7 +96,7 @@
   function paintError($message) {
     parent::paintError($message);
     $this->test_stack[] = array(
-      'data' => array($message, '<strong>[PHP]</strong>', t('Exception'), theme('image', 'misc/watchdog-warning.png')),
+      'data' => array($message, array('data' => "<strong>[PHP]</strong>", 'class' => 'simpletest-group'), t('Exception'), theme('image', 'misc/watchdog-warning.png')),
       'class' => 'simpletest-exception',
     );
   }
@@ -124,13 +126,15 @@
       '#weight' => $this->weight++,
     ), $this->form_depth);
 
-    if (! isset($this->_size)) {
+    if (!isset($this->_size)) {
       $this->_size = $size;
     }
 
     if (($c = count($this->test_info_stack)) > 0) {
       $info = $this->test_info_stack[$c - 1];
-      $this->writeContent('<strong>' . $info['name'] . '</strong>: ' . $info['description'], $this->getParentWeight() );
+      $this->writeContent('<strong>' . $info['name'] . '</strong>: ' . $info['description'], $this->getParentWeight());
+      $options = array();
+      $this->writeContent(drupal_get_form('simpletest_filter_form'));
     }
 
     $this->_test_stack[] = $test_name;
@@ -174,7 +178,7 @@
       $this->writeToLastField($this->form, $write, $this->form_depth);
     $this->writeContent('<strong>' . $this->getPassCount() . '</strong> passes, <strong>' . $this->getFailCount() . '</strong> fails and <strong>' . $this->getExceptionCount() . '</strong> exceptions.', $parent_weight, $class);
     if (count($this->test_stack) != 0) {
-        $this->writeContent(theme('table', array(), $this->test_stack));
+        $this->writeContent(theme('table', array(t('Details'), t('Category'), t('Outcome')), $this->test_stack));
         $this->test_stack = array();
       }
     array_pop($this->form_depth);
Index: modules/simpletest/simpletest.js
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.js,v
retrieving revision 1.1
diff -u -r1.1 simpletest.js
--- modules/simpletest/simpletest.js	20 Apr 2008 18:23:29 -0000	1.1
+++ modules/simpletest/simpletest.js	23 Apr 2008 04:43:26 -0000
@@ -27,6 +27,7 @@
     }
   });
 }
+
 Drupal.behaviors.simpleTestSelectAll = function() {
   $('td.simpletest-select-all').each(function() {
     var checkboxes = Drupal.settings.simpleTest['simpletest-test-group-'+ $(this).attr('id')].testNames,
@@ -55,4 +56,40 @@
     }
     $(this).append(checkbox);
   });
+};
+
+Drupal.behaviors.simpleTestFilterForm = function() {
+  var toggleTrs = function(outcome, self) {
+    var parent_fieldset = $(self).parents('fieldset.collapsible');
+    if ($(self).is(':checked')) {
+      $(parent_fieldset).find('tr.simpletest-' + outcome).show();
+    }
+    else {
+      $(parent_fieldset).find('tr.simpletest-' + outcome).hide();
+    }
+  };
+  $('input.simpletest-pass-checkbox').change(function() {
+    toggleTrs('pass', this);
+  });
+  $('input.simpletest-fail-checkbox').change(function() {
+    toggleTrs('fail', this);
+  });
+  $('input.simpletest-exception-checkbox').change(function() {
+    toggleTrs('exception', this);
+  });
+  $('input.simpletest-group-filter').keyup(function() {
+    var text = $(this).val();
+    var parent_fieldset = $(this).parents('fieldset.collapsible');
+    $(parent_fieldset).find('tr > td.simpletest-group > strong').each(function() {
+      var group = $(this).text();
+      group = group.substr(1, group.length - 2);
+      group = group.toLowerCase();
+      if (group.indexOf(text.toLowerCase()) == -1) {
+        $(this).parent().parent().hide();
+      }
+      else {
+        $(this).parent().parent().show();
+      }
+    });
+  });
 };
\ No newline at end of file
Index: modules/simpletest/simpletest.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.module,v
retrieving revision 1.1
diff -u -r1.1 simpletest.module
--- modules/simpletest/simpletest.module	20 Apr 2008 18:23:29 -0000	1.1
+++ modules/simpletest/simpletest.module	23 Apr 2008 04:21:59 -0000
@@ -474,5 +474,34 @@
   );
 
   return system_settings_form($form);
-
 }
+
+/**
+ * FAPI callback for the SimpleTest filter-test-results form.
+ */
+function simpletest_filter_form() {
+  $form = array();
+  $form['outcome'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Filter by outcome'),
+    '#options' => array(),
+    '#attributes' => array('class' => 'container-inline'),
+    '#default_value' => array(),
+  );
+  $categories = array('pass' => t('Passes'), 'fail' => t('Fails'), 'exception' => t('Exceptions'));
+  foreach ($categories as $outcome => $readable) {
+    $form['outcome'][$outcome] = array(
+      '#type' => 'checkbox',
+      '#title' => t($readable),
+      '#attributes' => array('class' => "simpletest-$outcome-checkbox"),
+      '#default_value' => TRUE,
+    );
+  }
+  $form['group'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Filter by category'),
+    '#default_value' => '',
+    '#attributes' => array('class' => 'container-inline simpletest-group-filter'),
+  );
+  return $form;
+}
\ No newline at end of file