Index: devel.drush.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/devel/devel.drush.inc,v
retrieving revision 1.7
diff -u -p -r1.7 devel.drush.inc
--- devel.drush.inc	26 Aug 2010 12:23:29 -0000	1.7
+++ devel.drush.inc	30 Sep 2010 04:30:57 -0000
@@ -50,6 +50,12 @@ function devel_drush_command() {
     'aliases' => array('token'),
     'core' => array(7), // Remove once 3.0 is released.
   );
+  $items['devel-test'] = array(
+    'description' => dt('Run one single simpletest'),
+    'aliases' => array('test'),
+    'drupal dependencies' => array('simpletest'),
+    // 'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_FULL,
+  );
   return $items;
 }
 
@@ -182,6 +188,80 @@ function drush_devel_token() {
   drush_print_table($rows, TRUE);
 }
 
+/**
+ * A Drush command callback.
+ */
+function drush_devel_test($test_class = FALSE) {
+  // This function doesn't exist in older versions of simpletest.  For now they are not supported.
+  $groups = simpletest_test_get_all();
+  // var_export($classes);
+  // return;
+
+  // Check that the test class parameter has been set.
+  if (!$test_class) {
+    $translated_title = dt('Available test groups');
+    $table = array(array($translated_title, dt('Tests')));
+    $longest_group_name = strlen($translated_title);
+
+    foreach ($groups as $group_name => $tests) {
+      $test_names = array();
+      foreach ($tests as $test) {
+        $test_names[] = $test['name'];
+      }
+      $table[] = array($group_name, implode(', ', $test_names));
+      $longest_group_name = max($longest_group_name, strlen($group_name));
+    }
+    drush_print_table($table, TRUE, array($longest_group_name));
+    return;
+  }
+
+  // Check the parameter is valid.
+  if (!$groups[$test_class]) {
+    drush_set_error('simpletest test case does not exist', dt("Test case !case not found.  Perhaps you spelled it wrong or need to enable the module?\nUse the drush test command with no arguments to see a list of available test cases.  E.g.\n\n\tdrush test\n", array('!case' => $test_class)));
+    return;
+  }
+
+  $test_list = array_keys($groups[$test_class]);
+
+  $test_id = db_insert('simpletest_test_id')
+    ->useDefaults(array('test_id'))
+    ->execute();
+
+  // Clear out the previous verbose files.
+  file_unmanaged_delete_recursive('public://simpletest/verbose');
+
+  foreach ($test_list as $test_class) {
+    print "$test_class\n";
+    $test = new $test_class($test_id);
+    $test->run();
+    $info = $test->getInfo();
+
+    module_invoke_all('test_finished', $test->results);
+
+    // dt() variables.
+    $vars = array(
+      '!passes' => $test->results['#pass'],
+      '!fails' => $test->results['#fail'],
+    );
+
+    // Just print a summary if there were no fails.
+    if (!$test->results['#fail']) {
+      return dt('!passes tests passed.', $vars);
+    }
+
+    // Print detailed results if there were fails.
+    module_load_include('pages.inc', 'simpletest');
+    $table = array(array(dt('Status'), dt('Message')));
+    $results = simpletest_result_get($id);
+    foreach ($results[$test_class] as $result) {
+      $status = $result->status == 'fail' ? 'FAIL' : $result->status;
+      $row = array($status, $result->message);
+      $table[] = $row;
+    }
+    $table = drush_print_table($table, TRUE);
+    return dt('!fails tests FAILED. !passes tests passed', $vars);
+  }
+}
 
 /**
  * Print the specified function, including any
