Index: modules/comment/comment.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.test,v
retrieving revision 1.27
diff -u -r1.27 comment.test
--- modules/comment/comment.test	25 Mar 2009 16:54:24 -0000	1.27
+++ modules/comment/comment.test	30 Mar 2009 05:40:48 -0000
@@ -1,6 +1,41 @@
 <?php
 // $Id: comment.test,v 1.27 2009/03/25 16:54:24 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function comment_test() {
+  $tests = array();
+
+  $tests['CommentInterfaceTest'] = array(
+    'name' => t('Comment interface'),
+    'description' => t('Test comment user interfaces.'),
+    'group' => t('Comment'),
+  );
+  $tests['CommentAnonymous'] = array(
+    'name' => t('Anonymous comments'),
+    'description' => t('Test anonymous comments.'),
+    'group' => t('Comment'),
+  );
+  $tests['CommentApprovalTest'] = array(
+    'name' => t('Comment approval'),
+    'description' => t('Test comment approval functionality.'),
+    'group' => t('Comment'),
+  );
+  $tests['CommentBlockFunctionalTest'] = array(
+    'name' => t('Comment blocks'),
+    'description' => t('Test comment block functionality.'),
+    'group' => t('Comment'),
+  );
+  $tests['CommentRSSUnitTest'] = array(
+    'name' => t('Comment RSS'),
+    'description' => t('Test comments as part of an RSS feed.'),
+    'group' => t('Comment'),
+  );
+
+  return $tests;
+}
+
 class CommentHelperCase extends DrupalWebTestCase {
   protected $admin_user;
   protected $web_user;
@@ -229,13 +264,6 @@
 }
 
 class CommentInterfaceTest extends CommentHelperCase {
-  function getInfo() {
-    return array(
-      'name' => t('Comment interface'),
-      'description' => t('Test comment user interfaces.'),
-      'group' => t('Comment'),
-    );
-  }
 
   /**
    * Test comment interface.
@@ -359,13 +387,6 @@
 }
 
 class CommentAnonymous extends CommentHelperCase {
-  function getInfo() {
-    return array(
-      'name' => t('Anonymous comments'),
-      'description' => t('Test anonymous comments.'),
-      'group' => t('Comment'),
-    );
-  }
 
   /**
    * Test anonymous comment functionality.
@@ -455,13 +476,6 @@
 }
 
 class CommentApprovalTest extends CommentHelperCase {
-  function getInfo() {
-    return array(
-      'name' => t('Comment approval'),
-      'description' => t('Test comment approval functionality.'),
-      'group' => t('Comment'),
-    );
-  }
 
   /**
    * Test comment approval functionality through admin/content/comment.
@@ -537,13 +551,6 @@
  * Functional tests for the comment module blocks.
  */
 class CommentBlockFunctionalTest extends CommentHelperCase {
-  function getInfo() {
-    return array(
-      'name' => t('Comment blocks'),
-      'description' => t('Test comment block functionality.'),
-      'group' => t('Comment'),
-    );
-  }
 
   /**
    * Test the recent comments block.
@@ -606,13 +613,6 @@
  * Unit tests for comment module integration with RSS feeds.
  */
 class CommentRSSUnitTest extends CommentHelperCase {
-  function getInfo() {
-    return array(
-      'name' => t('Comment RSS'),
-      'description' => t('Test comments as part of an RSS feed.'),
-      'group' => t('Comment'),
-    );
-  }
 
   /**
    * Test comments as part of an RSS feed.
Index: modules/help/help.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/help/help.test,v
retrieving revision 1.5
diff -u -r1.5 help.test
--- modules/help/help.test	8 Mar 2009 03:39:57 -0000	1.5
+++ modules/help/help.test	30 Mar 2009 05:40:49 -0000
@@ -1,18 +1,25 @@
 <?php
 // $Id: help.test,v 1.5 2009/03/08 03:39:57 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function help_test() {
+  $tests = array();
+
+  $tests['HelpTestCase'] = array(
+    'name' => t('Help functionality'),
+    'description' => t('Verify help display and user access to help based on persmissions.'),
+    'group' => t('Help'),
+  );
+
+  return $tests;
+}
+
 class HelpTestCase extends DrupalWebTestCase {
   protected $big_user;
   protected $any_user;
 
-  function getInfo() {
-    return array(
-      'name' => t('Help functionality'),
-      'description' => t('Verify help display and user access to help based on persmissions.'),
-      'group' => t('Help'),
-    );
-  }
-
   /**
    * Enable modules and create users with specific permissions.
    */
Index: modules/simpletest/tests/graph.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/graph.test,v
retrieving revision 1.1
diff -u -r1.1 graph.test
--- modules/simpletest/tests/graph.test	14 Jan 2009 12:18:37 -0000	1.1
+++ modules/simpletest/tests/graph.test	30 Mar 2009 05:40:53 -0000
@@ -10,13 +10,6 @@
  * Unit tests for the graph handling features.
  */
 class GraphUnitTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Graph'),
-      'description' => t('Graph handling unit tests.'),
-      'group' => t('System'),
-    );
-  }
 
   /**
    * Test depth-first-search features.
Index: modules/simpletest/tests/common.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v
retrieving revision 1.31
diff -u -r1.31 common.test
--- modules/simpletest/tests/common.test	30 Mar 2009 05:13:45 -0000	1.31
+++ modules/simpletest/tests/common.test	30 Mar 2009 05:40:51 -0000
@@ -6,14 +6,6 @@
  */
 class CommonLUnitTest extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Tests for the l() function'),
-      'description' => t('Confirm that url() works correctly with various input.'),
-      'group' => t('System'),
-    );
-  }
-
   /**
    * Confirm that invalid text given as $path is filtered.
    */
@@ -30,14 +22,6 @@
   protected $exact_test_cases;
   protected $rounded_test_cases;
 
-  function getInfo() {
-    return array(
-      'name' => t('Size parsing test'),
-      'description' => t('Parse a predefined amount of bytes and compare the output with the expected value.'),
-      'group' => t('System')
-    );
-  }
-
   function setUp() {
     $kb = DRUPAL_KILOBYTE;
     $this->exact_test_cases = array(
@@ -134,14 +118,6 @@
     '"Drupal, although it rhymes with sloopal, is as awesome as a troopal!"' => 'Drupal, although it rhymes with sloopal, is as awesome as a troopal!',
   );
 
-  function getInfo() {
-    return array(
-      'name' => t('Drupal tags handling'),
-      'description' => t("Performs tests on Drupal's handling of tags, both explosion and implosion tactics used."),
-      'group' => t('System')
-    );
-  }
-
   /**
    * Explode a series of tags.
    */
@@ -184,13 +160,6 @@
  * Test the Drupal CSS system.
  */
 class CascadingStylesheetsTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Cascading stylesheets'),
-      'description' => t('Tests adding various cascading stylesheets to the page.'),
-      'group' => t('System'),
-    );
-  }
 
   function setUp() {
     parent::setUp('php');
@@ -278,13 +247,6 @@
  * Test drupal_http_request().
  */
 class DrupalHTTPRequestTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Drupal HTTP request'),
-      'description' => t("Performs tests on Drupal's HTTP request mechanism."),
-      'group' => t('System')
-    );
-  }
 
   function setUp() {
     parent::setUp('system_test');
@@ -359,13 +321,6 @@
  * Testing drupal_set_content and drupal_get_content.
  */
 class DrupalSetContentTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Drupal set/get content'),
-      'description' => t('Performs tests on setting and retrieiving content from theme regions.'),
-      'group' => t('System')
-    );
-  }
 
 
   /**
@@ -410,14 +365,6 @@
    */
   var $preprocess_js = NULL;
 
-  function getInfo() {
-    return array(
-      'name' => t('JavaScript'),
-      'description' => t('Tests the JavaScript system.'),
-      'group' => t('System')
-    );
-  }
-
   function setUp() {
     // Enable Locale and SimpleTest in the test environment.
     parent::setUp('locale', 'simpletest');
@@ -562,13 +509,6 @@
  * Tests for drupal_render().
  */
 class DrupalRenderUnitTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Drupal render'),
-      'description' => t('Performs unit tests on drupal_render().'),
-      'group' => t('System'),
-    );
-  }
 
   /**
    * Test sorting by weight.
@@ -627,13 +567,6 @@
  * Tests Drupal error and exception handlers.
  */
 class DrupalErrorHandlerUnitTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Drupal error handlers'),
-      'description' => t('Performs tests on the Drupal error and exception handler.'),
-      'group' => t('System'),
-    );
-  }
 
   function setUp() {
     parent::setUp('system_test');
@@ -739,13 +672,6 @@
  * Test for valid_url().
  */
 class ValidUrlTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Valid Url'),
-      'description' => t("Performs tests on Drupal's valid url function."),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Test valid absolute urls.
@@ -847,13 +773,6 @@
  * Tests for CRUD API functions.
  */
 class DrupalDataApiTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Data API functions'),
-      'description' => t('Tests the performance of CRUD APIs.'),
-      'group' => t('System'),
-    );
-  }
 
   function setUp() {
     parent::setUp('taxonomy');
@@ -904,14 +823,6 @@
    */
   protected $collectedErrors = array();
 
-  function getInfo() {
-    return array(
-      'name' => t('SimpleTest error collecter'),
-      'description' => t('Performs tests on the Simpletest error and exception collecter.'),
-      'group' => t('SimpleTest'),
-    );
-  }
-
   function setUp() {
     parent::setUp('system_test');
   }
Index: modules/simpletest/tests/actions.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/actions.test,v
retrieving revision 1.2
diff -u -r1.2 actions.test
--- modules/simpletest/tests/actions.test	25 Nov 2008 13:14:28 -0000	1.2
+++ modules/simpletest/tests/actions.test	30 Mar 2009 05:40:51 -0000
@@ -2,13 +2,6 @@
 // $Id: actions.test,v 1.2 2008/11/25 13:14:28 dries Exp $
 
 class ActionsConfigurationTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Actions configuration'),
-      'description' => t('Tests complex actions configuration by adding, editing, and deleting a complex action.'),
-      'group' => t('System'),
-    );
-  }
 
   /**
    * Test the configuration of advanced actions through the administration
Index: modules/simpletest/tests/database_test.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/database_test.test,v
retrieving revision 1.46
diff -u -r1.46 database_test.test
--- modules/simpletest/tests/database_test.test	14 Mar 2009 17:45:55 -0000	1.46
+++ modules/simpletest/tests/database_test.test	30 Mar 2009 05:40:52 -0000
@@ -171,14 +171,6 @@
  */
 class DatabaseConnectionTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Connection tests'),
-      'description' => t('Tests of the core database system.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test that connections return appropriate connection objects.
    */
@@ -239,14 +231,6 @@
  */
 class DatabaseFetchTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Fetch tests'),
-      'description' => t('Test the Database system\'s various fetch capabilities.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that we can fetch a record properly in default object mode.
    */
@@ -320,14 +304,6 @@
  */
 class DatabaseFetch2TestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Fetch tests, part 2'),
-      'description' => t('Test the Database system\'s various fetch capabilities.'),
-      'group' => t('Database'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
   }
@@ -385,14 +361,6 @@
  */
 class DatabaseInsertTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Insert tests'),
-      'description' => t('Test the Insert query builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test the very basic insert functionality.
    */
@@ -519,14 +487,6 @@
  */
 class DatabaseInsertLOBTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Insert tests, LOB fields'),
-      'description' => t('Test the Insert query builder with LOB fields.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test that we can insert a single blob field successfully.
    */
@@ -559,14 +519,6 @@
  */
 class DatabaseInsertDefaultsTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Insert tests, default fields'),
-      'description' => t('Test the Insert query builder with default values.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test that we can run a query that is "default values for everything".
    */
@@ -612,14 +564,6 @@
  */
 class DatabaseUpdateTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Update tests'),
-      'description' => t('Test the Update query builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that we can update a single record successfully.
    */
@@ -683,14 +627,6 @@
  */
 class DatabaseUpdateComplexTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Update tests, Complex'),
-      'description' => t('Test the Update query builder, complex queries.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test updates with OR conditionals.
    */
@@ -804,14 +740,6 @@
  */
 class DatabaseUpdateLOBTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Update tests, LOB'),
-      'description' => t('Test the Update query builder with LOB fields.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that we can update a blob column.
    */
@@ -856,14 +784,6 @@
  */
 class DatabaseDeleteTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Delete tests'),
-      'description' => t('Test the Delete query builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that we can delete a single record successfully.
    */
@@ -883,14 +803,6 @@
  */
 class DatabaseMergeTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Merge tests'),
-      'description' => t('Test the Merge query builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that we can merge-insert a record successfully.
    */
@@ -1071,14 +983,6 @@
  */
 class DatabaseSelectTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Select tests'),
-      'description' => t('Test the Select query builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test rudimentary SELECT statements.
    */
@@ -1242,14 +1146,6 @@
  */
 class DatabaseSelectSubqueryTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Select tests, subqueries'),
-      'description' => t('Test the Select query builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test that we can use a subquery in a FROM clause.
    */
@@ -1308,14 +1204,6 @@
  */
 class DatabaseSelectOrderedTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Select tests, ordered'),
-      'description' => t('Test the Select query builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test basic order by.
    */
@@ -1395,14 +1283,6 @@
  */
 class DatabaseSelectComplexTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Select tests, complex'),
-      'description' => t('Test the Select query builder with more complex queries.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test simple JOIN statements.
    */
@@ -1598,14 +1478,6 @@
 
 class DatabaseSelectPagerDefaultTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Pager query tests'),
-      'description' => t('Test the pager query extender.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that a pager query returns the correct results.
    *
@@ -1678,14 +1550,6 @@
 
 class DatabaseSelectTableSortDefaultTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Tablesort query tests'),
-      'description' => t('Test the tablesort query extender.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that a tablesort query returns the correct results.
    *
@@ -1723,14 +1587,6 @@
  */
 class DatabaseTaggingTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Query tagging tests'),
-      'description' => t('Test the tagging capabilities of the Select builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Confirm that a query has a "tag" added to it.
    */
@@ -1806,14 +1662,6 @@
  */
 class DatabaseAlterTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Query altering tests'),
-      'description' => t('Test the hook_query_alter capabilities of the Select builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test that we can do basic alters.
    */
@@ -1890,14 +1738,6 @@
  */
 class DatabaseAlter2TestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Query altering tests, part 2'),
-      'description' => t('Test the hook_query_alter capabilities of the Select builder.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test that we can alter the fields of a query.
    */
@@ -1952,14 +1792,6 @@
  */
 class DatabaseRegressionTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Regression tests'),
-      'description' => t('Regression tests cases for the database layer.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Regression test for #310447.
    *
@@ -2002,14 +1834,6 @@
  */
 class DatabaseLoggingTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Query logging'),
-      'description' => t('Test the query logging facility.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Test that we can log the existence of a query.
    */
@@ -2127,13 +1951,6 @@
  * Range query tests.
  */
 class DatabaseRangeQueryTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Range query test'),
-      'description' => t('Test the Range query functionality.'),
-      'group' => t('Database'),
-    );
-  }
 
   function setUp() {
     parent::setUp('database_test');
@@ -2158,13 +1975,6 @@
  * Temporary query tests.
  */
 class DatabaseTemporaryQueryTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Temporary query test'),
-      'description' => t('Test the temporary query functionality.'),
-      'group' => t('Database'),
-    );
-  }
 
   function setUp() {
     parent::setUp('database_test');
@@ -2208,13 +2018,6 @@
  * database system interprets SQL syntax in an expected fashion.
  */
 class DatabaseAnsiSyntaxTestCase extends DatabaseTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('ANSI SQL syntax tests'),
-      'description' => t('Test ANSI SQL syntax interpretation.'),
-      'group' => t('Database'),
-    );
-  }
 
   function setUp() {
     parent::setUp('database_test');
@@ -2249,13 +2052,6 @@
  * Test invalid data handling.
  */
 class DatabaseInvalidDataTestCase extends DatabaseTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Invalid data'),
-      'description' => t('Test handling of some invalid data.'),
-      'group' => t('Database'),
-    );
-  }
 
   function setUp() {
     parent::setUp('database_test');
@@ -2322,13 +2118,6 @@
  * Drupal-specific SQL syntax tests.
  */
 class DatabaseQueryTestCase extends DatabaseTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Custom query syntax tests'),
-      'description' => t('Test Drupal\'s extended prepared statement syntax..'),
-      'group' => t('Database'),
-    );
-  }
 
   function setUp() {
     parent::setUp('database_test');
@@ -2366,14 +2155,6 @@
  */
 class DatabaseTransactionTestCase extends DatabaseTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Transaction tests'),
-      'description' => t('Test the transaction abstraction system.'),
-      'group' => t('Database'),
-    );
-  }
-
   /**
    * Helper method for transaction unit test. This "outer layer" transaction
    * starts and then encapsulates the "inner layer" transaction. This nesting
Index: modules/simpletest/tests/form.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/form.test,v
retrieving revision 1.6
diff -u -r1.6 form.test
--- modules/simpletest/tests/form.test	28 Mar 2009 18:09:11 -0000	1.6
+++ modules/simpletest/tests/form.test	30 Mar 2009 05:40:53 -0000
@@ -8,14 +8,6 @@
 
 class FormsTestCase extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Required field validation'),
-      'description' => t('Carriage returns, tabs, and spaces are not valid content for a required field.'),
-      'group' => t('Form API'),
-    );
-  }
-
   /**
    * Check several empty values for required forms elements.
    *
@@ -78,13 +70,6 @@
  * Test form type functions for expected behavior.
  */
 class FormsTestTypeCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Form type-specific tests'),
-      'description' => t('Test form type functions for expected behavior.'),
-      'group' => t('Form API'),
-    );
-  }
 
   /**
    * Test form_type_checkbox_value() function for expected behavior.
@@ -116,14 +101,6 @@
  */
 class FormsElementsTableSelectFunctionalTest extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Tableselect form element type test'),
-      'description' => t('Test the tableselect element for expected behavior'),
-      'group' => t('Form API'),
-    );
-  }
-
   function setUp() {
     parent::setUp('form_test');
   }
@@ -320,14 +297,6 @@
  */
 class FormsFormCleanIdFunctionalTest extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('form_clean_id() test'),
-      'description' => t('Test the function form_clean_id() for expected behavior'),
-      'group' => t('Form API'),
-    );
-  }
-
   function setUp() {
     parent::setUp('form_test');
   }
@@ -350,14 +319,6 @@
  */
 class FormAPITestCase extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Drupal Execute and Batch API'),
-      'description' => t('Tests the compatibility of drupal_execute and the Batch API'),
-      'group' => t('Form API'),
-    );
-  }
-
   /**
    * Check that we can run drupal_execute during a batch.
    */
Index: modules/simpletest/tests/unicode.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/unicode.test,v
retrieving revision 1.2
diff -u -r1.2 unicode.test
--- modules/simpletest/tests/unicode.test	2 Jan 2009 22:09:53 -0000	1.2
+++ modules/simpletest/tests/unicode.test	30 Mar 2009 05:40:53 -0000
@@ -18,14 +18,6 @@
    */
   protected $extendedMode = FALSE;
 
-  function getInfo() {
-    return array(
-      'name' => t('Unicode handling'),
-      'description' => t('Tests Drupal Unicode handling.'),
-      'group' => t('System'),
-    );
-  }
-
   /**
    * Test full unicode features implemented using the mbstring extension.
    */
Index: modules/simpletest/tests/menu.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/menu.test,v
retrieving revision 1.7
diff -u -r1.7 menu.test
--- modules/simpletest/tests/menu.test	14 Mar 2009 20:56:06 -0000	1.7
+++ modules/simpletest/tests/menu.test	30 Mar 2009 05:40:53 -0000
@@ -7,13 +7,6 @@
  */
 
 class MenuIncTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Hook menu tests'),
-      'description' => t('Test menu hook functionality.'),
-      'group' => t('Menu'),
-    );
-  }
 
   function setUp() {
     // Enable dummy module that implements hook_menu.
@@ -65,13 +58,6 @@
  * Tests rebuilding the menu by setting 'menu_rebuild_needed.'
  */
 class MenuRebuildTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Menu rebuild test'),
-      'description' => t('Test rebuilding of menu.'),
-      'group' => t('Menu'),
-    );
-  }
 
   /**
    * Test if the 'menu_rebuild_needed' variable triggers a menu_rebuild() call.
Index: modules/simpletest/tests/registry.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/registry.test,v
retrieving revision 1.5
diff -u -r1.5 registry.test
--- modules/simpletest/tests/registry.test	8 Dec 2008 21:41:54 -0000	1.5
+++ modules/simpletest/tests/registry.test	30 Mar 2009 05:40:53 -0000
@@ -2,13 +2,6 @@
 // $Id: registry.test,v 1.5 2008/12/08 21:41:54 dries Exp $
 
 class RegistryParseFileTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Registry parse file test'),
-      'description' => t('Parse a simple file and check that its resources are saved to the database.'),
-      'group' => t('System')
-    );
-  }
 
   function setUp() {
     $this->fileName = 'registry_test_' . md5(rand());
@@ -51,14 +44,6 @@
 class RegistryParseFilesTestCase extends DrupalWebTestCase {
   protected $fileTypes = array('new', 'existing_changed');
 
-  function getInfo() {
-    return array(
-      'name' => t('Registry parse files test'),
-      'description' => t('Read two a simple files from disc, and check that their resources are saved to the database.'),
-      'group' => t('System')
-    );
-  }
-
   function setUp() {
     parent::setUp();
     // Create files with some php to parse - one 'new', one 'existing' so
Index: modules/simpletest/tests/file.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/file.test,v
retrieving revision 1.26
diff -u -r1.26 file.test
--- modules/simpletest/tests/file.test	14 Mar 2009 23:01:37 -0000	1.26
+++ modules/simpletest/tests/file.test	30 Mar 2009 05:40:53 -0000
@@ -249,13 +249,6 @@
  *  This will run tests against the file_space_used() function.
  */
 class FileSpaceUsedTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File space used tests'),
-      'description' => t('Tests the file_space_used() function.'),
-      'group' => t('File'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -309,13 +302,6 @@
  *  This will run tests against the file validation functions (file_validate_*).
  */
 class FileValidatorTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File validator tests'),
-      'description' => t('Tests the functions used to validate uploaded files.'),
-      'group' => t('File'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -467,13 +453,6 @@
  *  Tests the file_unmanaged_save_data() function.
  */
 class FileUnmanagedSaveDataTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Unmanaged file save data'),
-      'description' => t('Tests the unmanaged file save data function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Test the file_unmanaged_save_data() function.
@@ -511,14 +490,6 @@
    */
   var $maxFidBefore;
 
-  function getInfo() {
-    return array(
-      'name' => t('File uploading'),
-      'description' => t('Tests the file uploading functions.'),
-      'group' => t('File'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
     $account = $this->drupalCreateUser(array('access content'));
@@ -639,13 +610,6 @@
  * Directory related tests.
  */
 class FileDirectoryTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File paths and directories'),
-      'description' => t('Tests operations dealing with directories.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Test the file_directory_path() function.
@@ -804,13 +768,6 @@
  * Tests the file_scan_directory() function.
  */
 class FileScanDirectoryTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File scan directory'),
-      'description' => t('Tests the file_scan_directory() function.'),
-      'group' => t('File'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -932,13 +889,6 @@
  * Deletion related tests.
  */
 class FileUnmanagedDeleteTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Unmanaged file delete'),
-      'description' => t('Tests the unmanaged file delete function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Delete a normal file.
@@ -978,13 +928,6 @@
  * Deletion related tests.
  */
 class FileUnmanagedDeleteRecursiveTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Unmanaged recursive file delete'),
-      'description' => t('Tests the unmanaged file delete recursive function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Delete a normal file.
@@ -1055,13 +998,6 @@
  * Unmanaged move related tests.
  */
 class FileUnmanagedMoveTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Unmanaged file moving'),
-      'description' => t('Tests the unmanaged file move function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Move a normal file.
@@ -1127,13 +1063,6 @@
  * Unmanaged copy related tests.
  */
 class FileUnmanagedCopyTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Unmanaged file copying'),
-      'description' => t('Tests the unmanaged file copy function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Copy a normal file.
@@ -1214,13 +1143,6 @@
  * Deletion related tests.
  */
 class FileDeleteTest extends FileHookTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File delete'),
-      'description' => t('Tests the file delete function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Try deleting a normal file (as opposed to a directory, symlink, etc).
@@ -1245,13 +1167,6 @@
  * Move related tests
  */
 class FileMoveTest extends FileHookTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File moving'),
-      'description' => t('Tests the file move function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Move a normal file.
@@ -1406,13 +1321,6 @@
  * Copy related tests.
  */
 class FileCopyTest extends FileHookTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File copying'),
-      'description' => t('Tests the file copy function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Test file copying in the normal, base case.
@@ -1552,13 +1460,6 @@
  * Tests the file_load() function.
  */
 class FileLoadTest extends FileHookTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File loading'),
-      'description' => t('Tests the file_load() function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Try to load a non-existent file by fid.
@@ -1649,13 +1550,6 @@
  * Tests the file_save() function.
  */
 class FileSaveTest extends FileHookTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File saving'),
-      'description' => t('Tests the file_save() function.'),
-      'group' => t('File'),
-    );
-  }
 
   function testFileSave() {
     // Create a new file object.
@@ -1705,13 +1599,6 @@
  * Tests the file_validate() function..
  */
 class FileValidateTest extends FileHookTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File validate'),
-      'description' => t('Tests the file_validate() function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Test that the validators passed into are checked.
@@ -1744,13 +1631,6 @@
  *  Tests the file_save_data() function.
  */
 class FileSaveDataTest extends FileHookTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File save data'),
-      'description' => t('Tests the file save data function.'),
-      'group' => t('File'),
-    );
-  }
 
   /**
    * Test the file_save_data() function when no filename is provided.
@@ -1875,13 +1755,6 @@
  * Tests for download/file transfer functions.
  */
 class FileDownloadTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File download'),
-      'description' => t('Tests for file download/transfer functions.'),
-      'group' => t('File'),
-    );
-  }
 
   function setUp() {
     parent::setUp('file_test');
@@ -1921,13 +1794,6 @@
  * Tests for file_munge_filename() and file_unmunge_filename().
  */
 class FileNameMungingTest extends FileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('File naming'),
-      'description' => t('Test filename munging and unmunging.'),
-      'group' => t('File'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
Index: modules/simpletest/tests/schema.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/schema.test,v
retrieving revision 1.4
diff -u -r1.4 schema.test
--- modules/simpletest/tests/schema.test	14 Mar 2009 20:34:17 -0000	1.4
+++ modules/simpletest/tests/schema.test	30 Mar 2009 05:40:53 -0000
@@ -10,13 +10,6 @@
  * Unit tests for the Schema API.
  */
 class SchemaTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Schema API'),
-      'description' => t('Tests table creation and modification via the schema API.'),
-      'group' => t('Database'),
-    );
-  }
 
   /**
    *
Index: modules/simpletest/tests/module.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/module.test,v
retrieving revision 1.1
diff -u -r1.1 module.test
--- modules/simpletest/tests/module.test	3 Jan 2009 08:45:28 -0000	1.1
+++ modules/simpletest/tests/module.test	30 Mar 2009 05:40:53 -0000
@@ -10,13 +10,6 @@
  * Unit tests for the module API.
  */
 class ModuleUnitTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Module API'),
-      'description' => t('Test low-level module functions.'),
-      'group' => t('Module'),
-    );
-  }
 
   /**
    * The basic functionality of module_list().
Index: modules/simpletest/tests/cache.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/cache.test,v
retrieving revision 1.3
diff -u -r1.3 cache.test
--- modules/simpletest/tests/cache.test	8 Dec 2008 21:41:54 -0000	1.3
+++ modules/simpletest/tests/cache.test	30 Mar 2009 05:40:51 -0000
@@ -102,13 +102,6 @@
 }
 
 class CacheSavingCase extends CacheTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Cache saving test'),
-      'description' => t('Check our variables are saved and restored the right way.'),
-      'group' => t('Cache')
-    );
-  }
 
   /**
    * Test the saving and restoring of a string.
@@ -163,13 +156,6 @@
 }
 
 class CacheClearCase extends CacheTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Cache clear test'),
-      'description' => t('Check our clearing is done the proper way.'),
-      'group' => t('Cache')
-    );
-  }
 
   function setUp() {
     $this->default_table = 'cache_page';
Index: modules/simpletest/tests/bootstrap.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/bootstrap.test,v
retrieving revision 1.12
diff -u -r1.12 bootstrap.test
--- modules/simpletest/tests/bootstrap.test	31 Jan 2009 16:50:57 -0000	1.12
+++ modules/simpletest/tests/bootstrap.test	30 Mar 2009 05:40:51 -0000
@@ -3,14 +3,6 @@
 
 class BootstrapIPAddressTestCase extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('IP address and HTTP_HOST test'),
-      'description' => t('Get the IP address from the current visitor from the server variables, check hostname validation.'),
-      'group' => t('Bootstrap')
-    );
-  }
-
   function setUp() {
     $this->oldserver = $_SERVER;
 
@@ -82,14 +74,6 @@
 
 class BootstrapPageCacheTestCase extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Page cache test'),
-      'description' => t('Enable the page cache and test it with conditional HTTP requests.'),
-      'group' => t('Bootstrap')
-    );
-  }
-
   /**
    * Enable cache and examine HTTP headers.
    */
@@ -136,14 +120,6 @@
     parent::setUp('system_test');
   }
 
-  function getInfo() {
-    return array(
-      'name' => t('Variable test'),
-      'description' => t('Make sure the variable system functions correctly.'),
-      'group' => t('Bootstrap')
-    );
-  }
-
   /**
    * testVariable
    */
@@ -182,14 +158,6 @@
  */
 class HookBootExitTestCase extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Boot and exit hook invocation'),
-      'description' => t('Test that hook_boot() and hook_exit() are called correctly.'),
-      'group' => t('Bootstrap'),
-    );
-  }
-
   function setUp() {
     parent::setUp('system_test', 'dblog');
   }
Index: modules/simpletest/tests/xmlrpc.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/xmlrpc.test,v
retrieving revision 1.6
diff -u -r1.6 xmlrpc.test
--- modules/simpletest/tests/xmlrpc.test	30 Dec 2008 16:43:18 -0000	1.6
+++ modules/simpletest/tests/xmlrpc.test	30 Mar 2009 05:40:53 -0000
@@ -2,13 +2,6 @@
 // $Id: xmlrpc.test,v 1.6 2008/12/30 16:43:18 dries Exp $
 
 class XMLRPCValidator1IncTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name'  => t('XML-RPC validator'),
-      'description'  => t('See !validator-link.', array('!validator-link' => l('the xmlrpc validator1 specification', 'http://www.xmlrpc.com/validator1Docs'))),
-      'group' => t('XML-RPC'),
-    );
-  }
 
   function setUp() {
     parent::setUp('xmlrpc_test');
@@ -122,13 +115,6 @@
 }
 
 class XMLRPCMessagesTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name'  => t('XML-RPC message'),
-      'description' => t('Test large messages.'),
-      'group' => t('XML-RPC'),
-    );
-  }
 
   function setUp() {
     parent::setUp('xmlrpc_test');
Index: modules/simpletest/tests/session.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/session.test,v
retrieving revision 1.11
diff -u -r1.11 session.test
--- modules/simpletest/tests/session.test	20 Mar 2009 19:18:10 -0000	1.11
+++ modules/simpletest/tests/session.test	30 Mar 2009 05:40:53 -0000
@@ -7,13 +7,6 @@
  */
 
 class SessionTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Session tests'),
-      'description' => t('Drupal session handling tests.'),
-      'group' => t('Session')
-    );
-  }
 
   function setUp() {
     parent::setUp('session_test');
Index: modules/simpletest/tests/image.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/image.test,v
retrieving revision 1.2
diff -u -r1.2 image.test
--- modules/simpletest/tests/image.test	10 Mar 2009 09:43:01 -0000	1.2
+++ modules/simpletest/tests/image.test	30 Mar 2009 05:40:53 -0000
@@ -14,14 +14,6 @@
   protected $file;
   protected $image;
 
-  function getInfo() {
-    return array(
-      'name' => t('Image toolkit tests'),
-      'description' => t('Check image tookit functions.'),
-      'group' => t('Image API'),
-    );
-  }
-
   function setUp() {
     parent::setUp('image_test');
 
@@ -203,14 +195,6 @@
   protected $width = 40;
   protected $height = 20;
 
-  function getInfo() {
-    return array(
-      'name' => t('Image GD manipulation tests'),
-      'description' => t('Check that core image manipulations work properly: scale, resize, rotate, crop, scale and crop, and desaturate.'),
-      'group' => t('Image API'),
-    );
-  }
-
   /**
    * Function to compare two colors by RGBa.
    */
Index: modules/contact/contact.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.test,v
retrieving revision 1.15
diff -u -r1.15 contact.test
--- modules/contact/contact.test	8 Mar 2009 05:08:22 -0000	1.15
+++ modules/contact/contact.test	30 Mar 2009 05:40:48 -0000
@@ -2,16 +2,29 @@
 // $Id: contact.test,v 1.15 2009/03/08 05:08:22 webchick Exp $
 
 /**
+ * Implementation of hook_test().
+ */
+function contact_test() {
+  $tests = array();
+
+  $tests['ContactSitewideTestCase'] = array(
+    'name' => t('Site-wide contact form'),
+    'description' => t('Tests site-wide contact form functionality.'),
+    'group' => t('Contact'),
+  );
+  $tests['ContactPersonalTestCase'] = array(
+    'name' => t('Personal contact form'),
+    'description' => t('Tests personal contact form functionality.'),
+    'group' => t('Contact'),
+  );
+
+  return $tests;
+}
+
+/**
  * Test the sitewide contact form.
  */
 class ContactSitewideTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Site-wide contact form'),
-      'description' => t('Tests site-wide contact form functionality.'),
-      'group' => t('Contact'),
-    );
-  }
 
   function setUp() {
     parent::setUp('contact');
@@ -256,13 +269,6 @@
  * Test the personal contact form.
  */
 class ContactPersonalTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Personal contact form'),
-      'description' => t('Tests personal contact form functionality.'),
-      'group' => t('Contact'),
-    );
-  }
 
   function setUp() {
     parent::setUp('contact');
Index: modules/tracker/tracker.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/tracker/tracker.test,v
retrieving revision 1.6
diff -u -r1.6 tracker.test
--- modules/tracker/tracker.test	9 Feb 2009 16:27:35 -0000	1.6
+++ modules/tracker/tracker.test	30 Mar 2009 05:40:54 -0000
@@ -1,19 +1,26 @@
 <?php
 // $Id: tracker.test,v 1.6 2009/02/09 16:27:35 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function tracker_test() {
+  $tests = array();
+
+  $tests['TrackerTest'] = array(
+    'name' => t('Tracker'),
+    'description' => t('Create nodes and check for their display in the tracker listings.'),
+    'group' => t('Tracker'),
+  );
+
+  return $tests;
+}
+
 class TrackerTest extends DrupalWebTestCase {
   protected $user;
   protected $other_user;
   protected $new_node;
 
-  function getInfo() {
-    return array(
-      'name' => t('Tracker'),
-      'description' => t('Create nodes and check for their display in the tracker listings.'),
-      'group' => t('Tracker')
-    );
-  }
-
   function setUp() {
     parent::setUp('comment', 'tracker');
 
Index: modules/user/user.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.test,v
retrieving revision 1.32
diff -u -r1.32 user.test
--- modules/user/user.test	25 Mar 2009 16:31:18 -0000	1.32
+++ modules/user/user.test	30 Mar 2009 05:40:55 -0000
@@ -1,14 +1,62 @@
 <?php
 // $Id: user.test,v 1.32 2009/03/25 16:31:18 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function user_test() {
+  $tests = array();
+
+  $tests['UserRegistrationTestCase'] = array(
+    'name' => t('User registration'),
+    'description' => t('Registers a user, fails login, resets password, successfully logs in with the one time password, changes password, logs out, successfully logs in with the new password, visits profile page.'),
+    'group' => t('User'),
+  );
+  $tests['UserValidationTestCase'] = array(
+    'name' => t('Username/e-mail validation'),
+    'description' => t('Verify that username/email validity checks behave as designed.'),
+    'group' => t('User'),
+  );
+  $tests['UserCancelTestCase'] = array(
+    'name' => t('Cancel account'),
+    'description' => t('Ensure that account cancellation methods work as expected.'),
+    'group' => t('User'),
+  );
+  $tests['UserPictureTestCase'] = array(
+    'name' => t('Upload user picture'),
+    'description' => t('Assure that dimension check, extension check and image scaling work as designed.'),
+    'group' => t('User'),
+  );
+  $tests['UserPermissionsTestCase'] = array(
+    'name' => t('Role permissions'),
+    'description' => t('Verify that role permissions can be added and removed via the permissions page.'),
+    'group' => t('User'),
+  );
+  $tests['UserAdminTestCase'] = array(
+    'name' => t('User admininstration'),
+    'description' => t('Test user admininstration page functionality.'),
+    'group' => t('User'),
+  );
+  $tests['UserTimeZoneFunctionalTest'] = array(
+    'name' => t('User time zones'),
+    'description' => t('Set a user time zone and verify that dates are displayed in local time.'),
+    'group' => t('User'),
+  );
+  $tests['UserAutocompleteTestCase'] = array(
+    'name' => t('User autocompletion'),
+    'description' => t('Test user autocompletion functionality.'),
+    'group' => t('User'),
+  );
+  $tests['UserBlocksUnitTests'] = array(
+    'name' => t('User blocks'),
+    'description' => t('Test user blocks.'),
+    'group' => t('User'),
+  );
+
+  return $tests;
+}
+
 class UserRegistrationTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('User registration'),
-      'description' => t('Registers a user, fails login, resets password, successfully logs in with the one time password, changes password, logs out, successfully logs in with the new password, visits profile page.'),
-      'group' => t('User')
-    );
-  }
 
   /**
    * Registers a user, fails login, resets password, successfully logs in with the one time password,
@@ -102,13 +150,6 @@
 
 
 class UserValidationTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Username/e-mail validation'),
-      'description' => t('Verify that username/email validity checks behave as designed.'),
-      'group' => t('User')
-    );
-  }
 
   // Username validation.
   function testUsernames() {
@@ -153,13 +194,6 @@
 }
 
 class UserCancelTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Cancel account'),
-      'description' => t('Ensure that account cancellation methods work as expected.'),
-      'group' => t('User'),
-    );
-  }
 
   /**
    * Attempt to cancel account without permission.
@@ -494,14 +528,6 @@
   protected $user;
   protected $_directory_test;
 
-  function getInfo() {
-    return array(
-      'name' => t('Upload user picture'),
-      'description' => t('Assure that dimension check, extension check and image scaling work as designed.'),
-      'group' => t('User')
-    );
-  }
-
   function setUp() {
     parent::setUp();
     // Enable user pictures.
@@ -714,14 +740,6 @@
   protected $admin_user;
   protected $rid;
 
-  function getInfo() {
-    return array(
-      'name' => t('Role permissions'),
-      'description' => t('Verify that role permissions can be added and removed via the permissions page.'),
-      'group' => t('User')
-    );
-  }
-
   function setUp() {
     parent::setUp();
 
@@ -761,13 +779,6 @@
 }
 
 class UserAdminTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('User admininstration'),
-      'description' => t('Test user admininstration page functionality.'),
-      'group' => t('User')
-    );
-  }
 
   /**
    * Registers a user and deletes it.
@@ -814,13 +825,6 @@
  * Tests for user-configurable time zones.
  */
 class UserTimeZoneFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('User time zones'),
-      'description' => t('Set a user time zone and verify that dates are displayed in local time.'),
-      'group' => t('User'),
-    );
-  }
 
   /**
    * Tests the display of dates and time when user-configurable time zones are set.
@@ -874,13 +878,6 @@
  * Test user autocompletion.
  */
 class UserAutocompleteTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('User autocompletion'),
-      'description' => t('Test user autocompletion functionality.'),
-      'group' => t('User')
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -914,13 +911,6 @@
  * Test user blocks.
  */
 class UserBlocksUnitTests extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('User blocks'),
-      'description' => t('Test user blocks.'),
-      'group' => t('User')
-    );
-  }
 
   /**
    * Test the Who's Online block.
Index: modules/path/path.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/path/path.test,v
retrieving revision 1.6
diff -u -r1.6 path.test
--- modules/path/path.test	9 Jan 2009 07:44:00 -0000	1.6
+++ modules/path/path.test	30 Mar 2009 05:40:50 -0000
@@ -1,14 +1,27 @@
 <?php
 // $Id: path.test,v 1.6 2009/01/09 07:44:00 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function path_test() {
+  $tests = array();
+
+  $tests['PathTestCase'] = array(
+    'name' => t('Path alias functionality'),
+    'description' => t('Add, edit, delete, and change alias and verify its consistency in the database.'),
+    'group' => t('Path'),
+  );
+  $tests['PathLanguageTestCase'] = array(
+    'name' => t('Path aliases with translated nodes'),
+    'description' => t('Confirm that paths work with translated nodes'),
+    'group' => t('Path'),
+  );
+
+  return $tests;
+}
+
 class PathTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Path alias functionality'),
-      'description' => t('Add, edit, delete, and change alias and verify its consistency in the database.'),
-      'group' => t('Path'),
-    );
-  }
 
   /**
    * Create user, setup permissions, log user in, and create a node.
@@ -126,13 +139,6 @@
 }
 
 class PathLanguageTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Path aliases with translated nodes'),
-      'description' => t('Confirm that paths work with translated nodes'),
-      'group' => t('Path'),
-    );
-  }
 
   /**
    * Create user, setup permissions, log user in, and create a node.
Index: modules/blog/blog.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/blog/blog.test,v
retrieving revision 1.7
diff -u -r1.7 blog.test
--- modules/blog/blog.test	20 Mar 2009 19:18:10 -0000	1.7
+++ modules/blog/blog.test	30 Mar 2009 05:40:47 -0000
@@ -1,19 +1,26 @@
 <?php
 // $Id: blog.test,v 1.7 2009/03/20 19:18:10 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function blog_test() {
+  $tests = array();
+
+  $tests['BlogTestCase'] = array(
+    'name' => t('Blog functionality'),
+    'description' => t('Create, view, edit, delete, and change blog entries and verify its consistency in the database.'),
+    'group' => t('Blog'),
+  );
+
+  return $tests;
+}
+
 class BlogTestCase extends DrupalWebTestCase {
   protected $big_user;
   protected $own_user;
   protected $any_user;
 
-  function getInfo() {
-    return array(
-      'name' => t('Blog functionality'),
-      'description' => t('Create, view, edit, delete, and change blog entries and verify its consistency in the database.'),
-      'group' => t('Blog'),
-    );
-  }
-
   /**
    * Enable modules and create users with specific permissions.
    */
Index: modules/field/modules/field_sql_storage/field_sql_storage.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/field_sql_storage/field_sql_storage.test,v
retrieving revision 1.1
diff -u -r1.1 field_sql_storage.test
--- modules/field/modules/field_sql_storage/field_sql_storage.test	3 Feb 2009 17:30:11 -0000	1.1
+++ modules/field/modules/field_sql_storage/field_sql_storage.test	30 Mar 2009 05:40:49 -0000
@@ -2,13 +2,6 @@
 // $Id: field_sql_storage.test,v 1.1 2009/02/03 17:30:11 dries Exp $
 
 class FieldSqlStorageTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name'  => t('Field SQL storage tests'),
-      'description'  => t("Test field SQL storage module."),
-      'group' => t('Field')
-    );
-  }
 
   function setUp() {
     parent::setUp('field_sql_storage', 'field', 'field_test');
Index: modules/block/block.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.test,v
retrieving revision 1.13
diff -u -r1.13 block.test
--- modules/block/block.test	20 Mar 2009 19:18:09 -0000	1.13
+++ modules/block/block.test	30 Mar 2009 05:40:47 -0000
@@ -1,17 +1,29 @@
 <?php
 // $Id: block.test,v 1.13 2009/03/20 19:18:09 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function block_test() {
+  $tests = array();
+
+  $tests['BlockTestCase'] = array(
+    'name' => t('Block functionality'),
+    'description' => t('Add, edit and delete custom block. Configure and move a module-defined block.'),
+    'group' => t('Block'),
+  );
+  $tests['NonDefaultBlockAdmin'] = array(
+    'name' => t('Non default theme admin'),
+    'description' => t('Check the administer page for non default theme.'),
+    'group' => t('Block'),
+  );
+
+  return $tests;
+}
+
 class BlockTestCase extends DrupalWebTestCase {
   protected $regions;
 
-  function getInfo() {
-    return array(
-      'name' => t('Block functionality'),
-      'description' => t('Add, edit and delete custom block. Configure and move a module-defined block.'),
-      'group' => t('Block'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
 
@@ -152,13 +164,6 @@
 }
 
 class NonDefaultBlockAdmin extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Non default theme admin'),
-      'description' => t('Check the administer page for non default theme.'),
-      'group' => t('Block'),
-    );
-  }
 
   /**
    * Test non-default theme admin.
Index: modules/book/book.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.test,v
retrieving revision 1.7
diff -u -r1.7 book.test
--- modules/book/book.test	23 Dec 2008 14:32:08 -0000	1.7
+++ modules/book/book.test	30 Mar 2009 05:40:47 -0000
@@ -1,17 +1,29 @@
 <?php
 // $Id: book.test,v 1.7 2008/12/23 14:32:08 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function book_test() {
+  $tests = array();
+
+  $tests['BookTestCase'] = array(
+    'name' => t('Book functionality'),
+    'description' => t('Create a book, add pages, and test book interface.'),
+    'group' => t('Book'),
+  );
+  $tests['BookBlockTestCase'] = array(
+    'name' => t('Block availability'),
+    'description' => t('Check if the book navigation block is available.'),
+    'group' => t('Book'),
+  );
+
+  return $tests;
+}
+
 class BookTestCase extends DrupalWebTestCase {
   protected $book;
 
-  function getInfo() {
-    return array(
-      'name' => t('Book functionality'),
-      'description' => t('Create a book, add pages, and test book interface.'),
-      'group' => t('Book'),
-    );
-  }
-
   function setUp() {
     parent::setUp('book');
   }
@@ -174,13 +186,6 @@
 }
 
 class BookBlockTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Block availability'),
-      'description' => t('Check if the book navigation block is available.'),
-      'group' => t('Book'),
-    );
-  }
 
   function setUp() {
     parent::setUp('book');
Index: modules/menu/menu.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.test,v
retrieving revision 1.7
diff -u -r1.7 menu.test
--- modules/menu/menu.test	16 Mar 2009 20:31:11 -0000	1.7
+++ modules/menu/menu.test	30 Mar 2009 05:40:49 -0000
@@ -1,20 +1,27 @@
 <?php
 // $Id: menu.test,v 1.7 2009/03/16 20:31:11 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function menu_test() {
+  $tests = array();
+
+  $tests['MenuTestCase'] = array(
+    'name' => t('Menu link creation/deletion'),
+    'description' => t('Add a custom menu, add menu links to the custom menu and Navigation menu, check their data, and delete them using the menu module UI.'),
+    'group' => t('Menu'),
+  );
+
+  return $tests;
+}
+
 class MenuTestCase extends DrupalWebTestCase {
   protected $big_user;
   protected $std_user;
   protected $menu;
   protected $items;
 
-  function getInfo() {
-    return array(
-      'name' => t('Menu link creation/deletion'),
-      'description' => t('Add a custom menu, add menu links to the custom menu and Navigation menu, check their data, and delete them using the menu module UI.'),
-      'group' => t('Menu')
-    );
-  }
-
   function setUp() {
     parent::setUp('menu');
     // Create users.
Index: modules/node/node.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.test,v
retrieving revision 1.18
diff -u -r1.18 node.test
--- modules/node/node.test	30 Mar 2009 05:35:35 -0000	1.18
+++ modules/node/node.test	30 Mar 2009 05:40:50 -0000
@@ -2,18 +2,75 @@
 // $Id: node.test,v 1.18 2009/03/30 05:35:35 webchick Exp $
 
 /**
+ * Implementation of hook_test().
+ */
+function node_test() {
+  $tests = array();
+
+  $tests['NodeLoadMultipleUnitTest'] = array(
+    'name' => t('Load multiple nodes'),
+    'description' => t('Test the loading of multiple nodes.'),
+    'group' => t('Node'),
+  );
+  $tests['NodeRevisionsTestCase'] = array(
+    'name' => t('Node revisions'),
+    'description' => t('Create a node with revisions and test viewing, reverting, and deleting revisions.'),
+    'group' => t('Node'),
+  );
+  $tests['NodeTeaserTestCase'] = array(
+    'name' => t('Node teaser'),
+    'description' => t('Test node_teaser() with different strings and lengths.'),
+    'group' => t('Node'),
+  );
+  $tests['PageEditTestCase'] = array(
+    'name' => t('Node edit'),
+    'description' => t('Create a node and test node edit functionality.'),
+    'group' => t('Node'),
+  );
+  $tests['PagePreviewTestCase'] = array(
+    'name' => t('Node preview'),
+    'description' => t('Test node preview functionality.'),
+    'group' => t('Node'),
+  );
+  $tests['PageCreationTestCase'] = array(
+    'name' => t('Node creation'),
+    'description' => t('Create a node and test saving it.'),
+    'group' => t('Node'),
+  );
+  $tests['PageViewTestCase'] = array(
+    'name' => t('Node edit permissions'),
+    'description' => t('Create a node and test edit permissions.'),
+    'group' => t('Node'),
+  );
+  $tests['NodeTitleXSSTestCase'] = array(
+    'name' => t('Node title XSS filtering'),
+    'description' => t('Create a node with dangerous tags in its title and test that they are escaped.'),
+    'group' => t('Node'),
+  );
+  $tests['NodeBlockTestCase'] = array(
+    'name' => t('Block availability'),
+    'description' => t('Check if the syndicate block is available.'),
+    'group' => t('Node'),
+  );
+  $tests['NodePostSettingsTestCase'] = array(
+    'name' => t('Node post information display'),
+    'description' => t('Check that the post information (submitted by Username on date) text displays appropriately.'),
+    'group' => t('Node'),
+  );
+  $tests['NodeRSSContentTestCase'] = array(
+    'name' => t('Node RSS Content'),
+    'description' => t('Ensure that data added to nodes by other modules appears in RSS feeds.'),
+    'group' => t('Node'),
+  );
+
+  return $tests;
+}
+
+/**
  * Test the node_load_multiple() function.
  */
 class NodeLoadMultipleUnitTest extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Load multiple nodes'),
-      'description' => t('Test the loading of multiple nodes.'),
-      'group' => t('Node'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
     $web_user = $this->drupalCreateUser(array('create article content', 'create page content'));
@@ -85,14 +142,6 @@
   protected $nodes;
   protected $logs;
 
-  function getInfo() {
-    return array(
-      'name' => t('Node revisions'),
-      'description' => t('Create a node with revisions and test viewing, reverting, and deleting revisions.'),
-      'group' => t('Node'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
 
@@ -167,13 +216,6 @@
 }
 
 class NodeTeaserTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Node teaser'),
-      'description' => t('Test node_teaser() with different strings and lengths.'),
-      'group' => t('Node'),
-    );
-  }
 
   /**
    * Tests an edge case where if the first sentence is a question and
@@ -312,13 +354,6 @@
 }
 
 class PageEditTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Node edit'),
-      'description' => t('Create a node and test node edit functionality.'),
-      'group' => t('Node'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -366,13 +401,6 @@
 }
 
 class PagePreviewTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Node preview'),
-      'description' => t('Test node preview functionality.'),
-      'group' => t('Node'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -403,13 +431,6 @@
 }
 
 class PageCreationTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Node creation'),
-      'description' => t('Create a node and test saving it.'),
-      'group' => t('Node'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -438,13 +459,6 @@
 }
 
 class PageViewTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Node edit permissions'),
-      'description' => t('Create a node and test edit permissions.'),
-      'group' => t('Node'),
-    );
-  }
 
   /**
    * Creates a node and then an anonymous and unpermissioned user attempt to edit the node.
@@ -477,13 +491,6 @@
 }
 
 class NodeTitleXSSTestCase extends DrupalWebTestCase {
-  function getInfo() {
-     return array(
-      'name' => t('Node title XSS filtering'),
-      'description' => t('Create a node with dangerous tags in its title and test that they are escaped.'),
-      'group' => t('Node'),
-    );
-  }
 
   function testNodeTitleXSS() {
     // Prepare a user to do the stuff.
@@ -511,13 +518,6 @@
 }
 
 class NodeBlockTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Block availability'),
-      'description' => t('Check if the syndicate block is available.'),
-      'group' => t('Node'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -544,13 +544,6 @@
  * Check that the post information displays when enabled for a content type.
  */
 class NodePostSettingsTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Node post information display'),
-      'description' => t('Check that the post information (submitted by Username on date) text displays appropriately.'),
-      'group' => t('Node'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -610,13 +603,6 @@
  * sitewide RSS feed at rss.xml.
  */
 class NodeRSSContentTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Node RSS Content'),
-      'description' => t('Ensure that data added to nodes by other modules appears in RSS feeds.'),
-      'group' => t('Node'),
-    );
-  }
 
   function setUp() {
     // Enable dummy module that implements hook_node_view.
Index: modules/php/php.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/php/php.test,v
retrieving revision 1.7
diff -u -r1.7 php.test
--- modules/php/php.test	21 Jan 2009 16:58:42 -0000	1.7
+++ modules/php/php.test	30 Mar 2009 05:40:50 -0000
@@ -2,6 +2,26 @@
 // $Id: php.test,v 1.7 2009/01/21 16:58:42 dries Exp $
 
 /**
+ * Implementation of hook_test().
+ */
+function php_test() {
+  $tests = array();
+
+  $tests['PHPFilterTestCase'] = array(
+    'name' => t('PHP filter functionality'),
+    'description' => t('Make sure that PHP filter properly evaluates PHP code when enabled.'),
+    'group' => t('PHP'),
+  );
+  $tests['PHPAccessTestCase'] = array(
+    'name' => t('PHP filter access check'),
+    'description' => t('Make sure that users who don\'t have access to the PHP filter can\'t see it.'),
+    'group' => t('PHP'),
+  );
+
+  return $tests;
+}
+
+/**
  * Base PHP test case class.
  */
 class PHPTestCase extends DrupalWebTestCase {
@@ -37,13 +57,6 @@
  * Tests to make sure the PHP filter actually evaluates PHP code when used.
  */
 class PHPFilterTestCase extends PHPTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('PHP filter functionality'),
-      'description' => t('Make sure that PHP filter properly evaluates PHP code when enabled.'),
-      'group' => t('PHP'),
-    );
-  }
 
   /**
    * Make sure that the PHP filter evaluates PHP code when used.
@@ -80,13 +93,6 @@
  * Tests to make sure access to the PHP filter is properly restricted.
  */
 class PHPAccessTestCase extends PHPTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('PHP filter access check'),
-      'description' => t('Make sure that users who don\'t have access to the PHP filter can\'t see it.'),
-      'group' => t('PHP'),
-    );
-  }
 
   /**
    * Make sure that user can't use the PHP filter when not given access.
Index: modules/forum/forum.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.test,v
retrieving revision 1.15
diff -u -r1.15 forum.test
--- modules/forum/forum.test	13 Feb 2009 05:42:24 -0000	1.15
+++ modules/forum/forum.test	30 Mar 2009 05:40:49 -0000
@@ -1,6 +1,21 @@
 <?php
 // $Id: forum.test,v 1.15 2009/02/13 05:42:24 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function forum_test() {
+  $tests = array();
+
+  $tests['ForumTestCase'] = array(
+    'name' => t('Forum functionality'),
+    'description' => t('Create, view, edit, delete, and change forum entries and verify its consistency in the database.'),
+    'group' => t('Forum'),
+  );
+
+  return $tests;
+}
+
 class ForumTestCase extends DrupalWebTestCase {
   protected $big_user;
   protected $own_user;
@@ -11,14 +26,6 @@
   protected $root_forum;
   protected $nids;
 
-  function getInfo() {
-    return array(
-      'name' => t('Forum functionality'),
-      'description' => t('Create, view, edit, delete, and change forum entries and verify its consistency in the database.'),
-      'group' => t('Forum'),
-    );
-  }
-
   /**
    * Enable modules and create users with specific permissions.
    */
Index: modules/system/system.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.test,v
retrieving revision 1.39
diff -u -r1.39 system.test
--- modules/system/system.test	11 Feb 2009 05:33:18 -0000	1.39
+++ modules/system/system.test	30 Mar 2009 05:40:54 -0000
@@ -2,6 +2,91 @@
 // $Id: system.test,v 1.39 2009/02/11 05:33:18 webchick Exp $
 
 /**
+ * Implementation of hook_test().
+ */
+function system_test() {
+  $tests = array();
+
+  $tests['EnableDisableTestCase'] = array(
+    'name' => t('Enable/disable modules'),
+    'description' => t('Enable/disable core module and confirm table creation/deletion.'),
+    'group' => t('Module'),
+  );
+  $tests['ModuleDependencyTestCase'] = array(
+    'name' => t('Module dependencies'),
+    'description' => t('Enable module without dependency enabled.'),
+    'group' => t('Module'),
+  );
+  $tests['ModuleRequiredTestCase'] = array(
+    'name' => t('Required modules'),
+    'description' => t('Attempt disabling of required modules.'),
+    'group' => t('Module'),
+  );
+  $tests['IPAddressBlockingTestCase'] = array(
+    'name' => t('IP address blocking'),
+    'description' => t('Test IP address blocking.'),
+    'group' => t('System'),
+  );
+  $tests['CronRunTestCase'] = array(
+    'name' => t('Cron run'),
+    'description' => t('Test cron run.'),
+    'group' => t('System'),
+  );
+  $tests['AdminOverviewTestCase'] = array(
+    'name' => t('Admin overview'),
+    'description' => t('Confirm that the admin overview page appears as expected.'),
+    'group' => t('System'),
+  );
+  $tests['AdminMetaTagTestCase'] = array(
+    'name' => t('Fingerprinting meta tag'),
+    'description' => t('Confirm that the fingerprinting meta tag appears as expected.'),
+    'group' => t('System'),
+  );
+  $tests['AccessDeniedTestCase'] = array(
+    'name' => t('403 functionality'),
+    'description' => t('Tests page access denied functionality, including custom 403 pages.'),
+    'group' => t('System'),
+  );
+  $tests['PageNotFoundTestCase'] = array(
+    'name' => t('404 functionality'),
+    'description' => t('Tests page not found functionality, including custom 404 pages.'),
+    'group' => t('System'),
+  );
+  $tests['DateTimeFunctionalTest'] = array(
+    'name' => t('Date and time'),
+    'description' => t('Configure date and time settings. Test date formatting and time zone handling, including daylight saving time.'),
+    'group' => t('System'),
+  );
+  $tests['PageTitleFiltering'] = array(
+    'name' => t('HTML in page titles'),
+    'description' => t('Tests correct handling or conversion by drupal_set_title() and drupal_get_title().'),
+    'group' => t('System'),
+  );
+  $tests['FrontPageTestCase'] = array(
+    'name' => t('Front page'),
+    'description' => t('Tests front page functionality and administration.'),
+    'group' => t('System'),
+  );
+  $tests['SystemBlockTestCase'] = array(
+    'name' => t('Block functionality'),
+    'description' => t('Configure and move powered-by block.'),
+    'group' => t('System'),
+  );
+  $tests['SystemSettingsForm'] = array(
+    'name' => t('System setting forms'),
+    'description' => t('Tests correctness of system_settings_form() processing.'),
+    'group' => t('System'),
+  );
+  $tests['SystemThemeFunctionalTest'] = array(
+    'name' => t('Theme interface functionality'),
+    'description' => t('Tests the theme interface functionality by enabling and switching themes, and using an administration theme.'),
+    'group' => t('System'),
+  );
+
+  return $tests;
+}
+
+/**
  * Helper class for module test cases.
  */
 class ModuleTestCase extends DrupalWebTestCase {
@@ -58,13 +143,6 @@
  * Test module enabling/disabling functionality.
  */
 class EnableDisableTestCase extends ModuleTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Enable/disable modules'),
-      'description' => t('Enable/disable core module and confirm table creation/deletion.'),
-      'group' => t('Module'),
-    );
-  }
 
   /**
    * Enable a module, check the database for related tables, disable module,
@@ -118,13 +196,6 @@
  * Test module dependency functionality.
  */
 class ModuleDependencyTestCase extends ModuleTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Module dependencies'),
-      'description' => t('Enable module without dependency enabled.'),
-      'group' => t('Module'),
-    );
-  }
 
   /**
    * Attempt to enable translation module without locale enabled.
@@ -157,13 +228,6 @@
  * Test required modules functionality.
  */
 class ModuleRequiredTestCase extends ModuleTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Required modules'),
-      'description' => t('Attempt disabling of required modules.'),
-      'group' => t('Module'),
-    );
-  }
 
   /**
    * Assert that core required modules cannot be disabled.
@@ -184,13 +248,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('IP address blocking'),
-      'description' => t('Test IP address blocking.'),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Implementation of setUp().
@@ -254,13 +311,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('Cron run'),
-      'description' => t('Test cron run.'),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Test cron runs.
@@ -325,13 +375,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('Admin overview'),
-      'description' => t('Confirm that the admin overview page appears as expected.'),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Test the overview page by task.
@@ -392,13 +435,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('Fingerprinting meta tag'),
-      'description' => t('Confirm that the fingerprinting meta tag appears as expected.'),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Verify that the meta tag HTML is generated correctly.
@@ -420,13 +456,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('403 functionality'),
-      'description' => t("Tests page access denied functionality, including custom 403 pages."),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Implementation of setUp().
@@ -481,13 +510,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('404 functionality'),
-      'description' => t("Tests page not found functionality, including custom 404 pages."),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Implementation of setUp().
@@ -540,13 +562,6 @@
  * Tests generic date and time handling capabilities of Drupal.
  */
 class DateTimeFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Date and time'),
-      'description' => t('Configure date and time settings. Test date formatting and time zone handling, including daylight saving time.'),
-      'group' => t('System'),
-    );
-  }
 
   /**
    * Test time zones and DST handling.
@@ -587,13 +602,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('HTML in page titles'),
-      'description' => t('Tests correct handling or conversion by drupal_set_title() and drupal_get_title().'),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Implementation of setUp().
@@ -649,14 +657,6 @@
  */
 class FrontPageTestCase extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Front page'),
-      'description' => t('Tests front page functionality and administration.'),
-      'group' => t('System'),
-    );
-  }
-
   function setUp() {
     parent::setUp('system_test');
 
@@ -700,13 +700,6 @@
 }
 
 class SystemBlockTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Block functionality'),
-      'description' => t('Configure and move powered-by block.'),
-      'group' => t('System'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -754,13 +747,6 @@
   /**
    * Implementation of getInfo().
    */
-  function getInfo() {
-    return array(
-      'name' => t('System setting forms'),
-      'description' => t('Tests correctness of system_settings_form() processing.'),
-      'group' => t('System')
-    );
-  }
 
   /**
    * Implementation of setUp().
@@ -833,13 +819,6 @@
  * Tests for the theme interface functionality.
  */
 class SystemThemeFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Theme interface functionality'),
-      'description' => t('Tests the theme interface functionality by enabling and switching themes, and using an administration theme.'),
-      'group' => t('System'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
Index: modules/trigger/trigger.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/trigger/trigger.test,v
retrieving revision 1.6
diff -u -r1.6 trigger.test
--- modules/trigger/trigger.test	8 Mar 2009 04:25:07 -0000	1.6
+++ modules/trigger/trigger.test	30 Mar 2009 05:40:54 -0000
@@ -1,18 +1,25 @@
 <?php
 // $Id: trigger.test,v 1.6 2009/03/08 04:25:07 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function trigger_test() {
+  $tests = array();
+
+  $tests['TriggerContentTestCase'] = array(
+    'name' => t('Trigger content (node) actions'),
+    'description' => t('Perform various tests with content actions.'),
+    'group' => t('Trigger'),
+  );
+
+  return $tests;
+}
+
 class TriggerContentTestCase extends DrupalWebTestCase {
   var $_cleanup_roles = array();
   var $_cleanup_users = array();
 
-  function getInfo() {
-    return array(
-      'name' => t('Trigger content (node) actions'),
-      'description' => t('Perform various tests with content actions.') ,
-      'group' => t('Trigger'),
-    );
-  }
-
   function setUp() {
     parent::setUp('trigger');
   }
Index: modules/dblog/dblog.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/dblog/dblog.test,v
retrieving revision 1.16
diff -u -r1.16 dblog.test
--- modules/dblog/dblog.test	14 Mar 2009 23:01:36 -0000	1.16
+++ modules/dblog/dblog.test	30 Mar 2009 05:40:48 -0000
@@ -1,18 +1,25 @@
 <?php
 // $Id: dblog.test,v 1.16 2009/03/14 23:01:36 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function dblog_test() {
+  $tests = array();
+
+  $tests['DBLogTestCase'] = array(
+    'name' => t('DBLog functionality'),
+    'description' => t('Generate events and verify dblog entries; verify user access to log reports based on persmissions.'),
+    'group' => t('DBLog'),
+  );
+
+  return $tests;
+}
+
 class DBLogTestCase extends DrupalWebTestCase {
   protected $big_user;
   protected $any_user;
 
-  function getInfo() {
-    return array(
-      'name' => t('DBLog functionality'),
-      'description' => t('Generate events and verify dblog entries; verify user access to log reports based on persmissions.'),
-      'group' => t('DBLog'),
-    );
-  }
-
   /**
    * Enable modules and create users with specific permissions.
    */
Index: modules/simpletest/simpletest.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.module,v
retrieving revision 1.38
diff -u -r1.38 simpletest.module
--- modules/simpletest/simpletest.module	22 Feb 2009 17:55:30 -0000	1.38
+++ modules/simpletest/simpletest.module	30 Mar 2009 05:40:50 -0000
@@ -2,6 +2,11 @@
 // $Id: simpletest.module,v 1.38 2009/02/22 17:55:30 dries Exp $
 
 /**
+ * @file
+ * Provides testing framework module base.
+ */
+
+/**
  * Implementation of hook_help().
  */
 function simpletest_help($path, $arg) {
@@ -89,7 +94,7 @@
     $header = array(t('Message'), t('Group'), t('Filename'), t('Line'), t('Function'), array('colspan' => 2, 'data' => t('Status')));
     while ($result = db_fetch_object($results)) {
       $class = $result->test_class;
-      $info = $uncategorized_tests[$class]->getInfo();
+      $info = $uncategorized_tests[$class];
       $group = $info['group'];
       $selected_tests[$group][$class] = TRUE;
       if (!isset($group_summary[$group])) {
@@ -130,7 +135,7 @@
     foreach ($form['results'] as $group => &$elements) {
       $group_ok = TRUE;
       foreach ($elements as $class => &$element) {
-        $info = $uncategorized_tests[$class]->getInfo();
+        $info = $uncategorized_tests[$class];
         $ok = $element['summary']['#fail'] + $element['summary']['#exception'] == 0;
         $element += array(
           '#type' => 'fieldset',
@@ -166,9 +171,7 @@
     $form['tests']['table'][$group_name] = array(
       '#collapsed' => TRUE,
     );
-    foreach ($test_group as $test) {
-      $test_info = $test->getInfo();
-      $test_class = get_class($test);
+    foreach ($test_group as $test_class => $test_info) {
       $is_selected = isset($selected_tests[$group_name][$test_class]);
       $form['tests']['table'][$group_name][$test_class] = array(
         '#type' => 'checkbox',
@@ -321,21 +324,26 @@
  * Run selected tests.
  */
 function simpletest_test_form_submit($form, &$form_state) {
-  // Ensure that all classes are loaded before we create instances to get test information and run.
-  simpletest_get_all_tests();
-
   // Get list of tests.
-  $tests_list = array();
-  foreach ($form_state['values'] as $class_name => $value) {
-    if (class_exists($class_name) && $value === 1) {
-      $tests_list[] = $class_name;
+  $test_classes = array();
+  foreach ($form_state['values'] as $test_class => $value) {
+    if ($value === 1) {
+      // Load test file and ensure that test class exists.
+      simpletest_load_test($test_class);
+      if (class_exists($test_class)) {
+        $test_classes[] = $test_class;
+      }
+      else {
+        drupal_set_message(t('No such test class @class.', array('@class' => $test_class)), 'error');
+      }
     }
   }
-  if (count($tests_list) > 0 ) {
-    simpletest_run_tests($tests_list, 'drupal');
+
+  if ($test_classes) {
+    simpletest_run_tests($test_classes, 'drupal');
   }
   else {
-    drupal_set_message(t('No test(s) selected.'), 'error');
+    drupal_set_message(t('No test(s) to run.'), 'error');
   }
 }
 
@@ -350,13 +358,13 @@
  */
 function simpletest_run_tests($test_list, $reporter = 'drupal') {
   cache_clear_all();
+  $tests = simpletest_get_all_tests();
   $test_id = db_insert('simpletest_test_id')->useDefaults(array('test_id'))->execute();
 
   // Get the info for the first test being run.
   $first_test = array_shift($test_list);
-  $first_instance = new $first_test();
+  $info = $tests[$first_test];
   array_unshift($test_list, $first_test);
-  $info = $first_instance->getInfo();
 
   $batch = array(
     'title' => t('Running SimpleTests'),
@@ -383,9 +391,6 @@
  * Batch operation callback.
  */
 function _simpletest_batch_operation($test_list_init, $test_id, &$context) {
-  // Ensure that all classes are loaded before we unserialize some instances.
-  simpletest_get_all_tests();
-
   // Get working values.
   if (!isset($context['sandbox']['max'])) {
     // First iteration: initialize working values.
@@ -402,10 +407,15 @@
 
   // Perform the next test.
   $test_class = array_shift($test_list);
+
+  // Get test info and load test file.
+  $tests = simpletest_get_all_tests();
+  $info = $tests[$test_class];
+  simpletest_load_test($test_class);
+
   $test = new $test_class($test_id);
   $test->run();
   $size = count($test_list);
-  $info = $test->getInfo();
 
   // Gather results and compose the report.
   $test_results[$test_class] = $test->results;
@@ -443,52 +453,41 @@
   }
 }
 
-/**
- * Get a list of all of the tests.
+/* Get a list of all of the tests.
  *
  * @return
- *   An array of tests, with the class name as the keys and the instantiated
- *   versions of the classes as the values.
+ *   An array of tests, with the test class name as the keys and the test
+ *   information as the value.
+ * @see hook_test()
  */
 function simpletest_get_all_tests() {
-  static $formatted_classes;
-  if (!isset($formatted_classes)) {
-    require_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'simpletest') . '/drupal_web_test_case.php';
-    $files = array();
-    foreach (array_keys(module_rebuild_cache()) as $module) {
-      $module_path = drupal_get_path('module', $module);
-      $test = $module_path . "/$module.test";
-      if (file_exists($test)) {
-        $files[] = $test;
-      }
+  static $tests;
+
+  if (!isset($tests)) {
+    module_load_include('php', 'simpletest', 'drupal_web_test_case');
 
-      $tests_directory = $module_path . '/tests';
-      if (is_dir($tests_directory)) {
-        foreach (file_scan_directory($tests_directory, '/\.test$/') as $file) {
-          $files[] = $file->filepath;
+    // Manually call each module so that we can know which module a given test
+    // came from.
+    $tests = array();
+    foreach (array_keys(module_rebuild_cache()) as $module) {
+      module_load_include('test', $module);
+      $function = $module . '_test';
+      if (function_exists($function)) {
+        $test_classes = $function();
+        if ($test_classes) {
+          foreach (array_keys($test_classes) as $test_class) {
+            $test_classes[$test_class]['module'] = $module;
+          }
+          $tests = array_merge($tests, $test_classes);
         }
-      }
-    }
+       }
+     }
+   }
 
-    $existing_classes = get_declared_classes();
-    foreach ($files as $file) {
-      include_once DRUPAL_ROOT . '/' . $file;
-    }
-    $classes = array_values(array_diff(get_declared_classes(), $existing_classes));
-    $formatted_classes = array();
-    foreach ($classes as $key => $class) {
-      if (method_exists($class, 'getInfo')) {
-        $formatted_classes[$class] = new $class;
-      }
-    }
-  }
-  if (count($formatted_classes) == 0) {
-    drupal_set_message('No test cases found.', 'error');
-    return FALSE;
-  }
-  return $formatted_classes;
+  return $tests;
 }
 
+
 /**
  * Categorize the tests into groups.
  *
@@ -498,15 +497,29 @@
  */
 function simpletest_categorize_tests($tests) {
   $groups = array();
-  foreach ($tests as $test => $instance) {
-    $info = $instance->getInfo();
-    $groups[$info['group']][$test] = $instance;
+  foreach ($tests as $test_case => $info) {
+    $groups[$info['group']][$test_case] = $info;
   }
   uksort($groups, 'strnatcasecmp');
   return $groups;
 }
 
 /**
+ * Load test file of specified test class. Also includes the DrupalWebTestCase.
+ *
+ * @param $test_class
+ *   Test class to load file for.
+ */
+function simpletest_load_test($test_class) {
+  module_load_include('php', 'simpletest', 'drupal_web_test_case');
+  $tests = simpletest_get_all_tests();
+
+  $info = $tests[$test_class];
+  $filename = (isset($info['file']) ? 'tests/' . $info['file'] : $info['module']);
+  require_once drupal_get_path('module', $info['module']) . '/' . $filename . '.test';
+}
+
+/**
  * Remove all temporary database tables and directories.
  */
 function simpletest_clean_environment() {
Index: modules/simpletest/simpletest.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.test,v
retrieving revision 1.16
diff -u -r1.16 simpletest.test
--- modules/simpletest/simpletest.test	22 Jan 2009 12:46:06 -0000	1.16
+++ modules/simpletest/simpletest.test	30 Mar 2009 05:40:51 -0000
@@ -1,6 +1,528 @@
 <?php
 // $Id: simpletest.test,v 1.16 2009/01/22 12:46:06 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function simpletest_test() {
+  $tests = array();
+
+  $tests['SimpleTestFunctionalTest'] = array(
+    'name' => t('SimpleTest functionality'),
+    'description' => t('Test SimpleTest\'s web interface: check that the intended tests were
+                            run and ensure that test reports display the intended results. Also
+                            test SimpleTest\'s internal browser and API\'s both explicitly and
+                            implicitly.'),
+    'group' => t('SimpleTest'),
+  );
+  $tests['FormsTestCase'] = array(
+    'name' => t('Required field validation'),
+    'description' => t('Carriage returns, tabs, and spaces are not valid content for a required field.'),
+    'group' => t('Form API'),
+    'file' => 'form',
+  );
+  $tests['FormsTestTypeCase'] = array(
+    'name' => t('Form type-specific tests'),
+    'description' => t('Test form type functions for expected behavior.'),
+    'group' => t('Form API'),
+    'file' => 'form',
+  );
+  $tests['FormsElementsTableSelectFunctionalTest'] = array(
+    'name' => t('Tableselect form element type test'),
+    'description' => t('Test the tableselect element for expected behavior'),
+    'group' => t('Form API'),
+    'file' => 'form',
+  );
+  $tests['FormsFormCleanIdFunctionalTest'] = array(
+    'name' => t('form_clean_id() test'),
+    'description' => t('Test the function form_clean_id() for expected behavior'),
+    'group' => t('Form API'),
+    'file' => 'form',
+  );
+  $tests['FormAPITestCase'] = array(
+    'name' => t('Drupal Execute and Batch API'),
+    'description' => t('Tests the compatibility of drupal_execute and the Batch API'),
+    'group' => t('Form API'),
+    'file' => 'form',
+  );
+  $tests['SessionTestCase'] = array(
+    'name' => t('Session tests'),
+    'description' => t('Drupal session handling tests.'),
+    'group' => t('Session'),
+    'file' => 'session',
+  );
+  $tests['RegistryParseFileTestCase'] = array(
+    'name' => t('Registry parse file test'),
+    'description' => t('Parse a simple file and check that its resources are saved to the database.'),
+    'group' => t('System'),
+    'file' => 'registry',
+  );
+  $tests['RegistryParseFilesTestCase'] = array(
+    'name' => t('Registry parse files test'),
+    'description' => t('Read two a simple files from disc, and check that their resources are saved to the database.'),
+    'group' => t('System'),
+    'file' => 'registry',
+  );
+  $tests['ModuleUnitTest'] = array(
+    'name' => t('Module API'),
+    'description' => t('Test low-level module functions.'),
+    'group' => t('Module'),
+    'file' => 'module',
+  );
+  $tests['UnicodeUnitTest'] = array(
+    'name' => t('Unicode handling'),
+    'description' => t('Tests Drupal Unicode handling.'),
+    'group' => t('System'),
+    'file' => 'unicode',
+  );
+  $tests['BootstrapIPAddressTestCase'] = array(
+    'name' => t('IP address and HTTP_HOST test'),
+    'description' => t('Get the IP address from the current visitor from the server variables, check hostname validation.'),
+    'group' => t('Bootstrap'),
+    'file' => 'bootstrap',
+  );
+  $tests['BootstrapPageCacheTestCase'] = array(
+    'name' => t('Page cache test'),
+    'description' => t('Enable the page cache and test it with conditional HTTP requests.'),
+    'group' => t('Bootstrap'),
+    'file' => 'bootstrap',
+  );
+  $tests['BootstrapVariableTestCase'] = array(
+    'name' => t('Variable test'),
+    'description' => t('Make sure the variable system functions correctly.'),
+    'group' => t('Bootstrap'),
+    'file' => 'bootstrap',
+  );
+  $tests['HookBootExitTestCase'] = array(
+    'name' => t('Boot and exit hook invocation'),
+    'description' => t('Test that hook_boot() and hook_exit() are called correctly.'),
+    'group' => t('Bootstrap'),
+    'file' => 'bootstrap',
+  );
+  $tests['MenuIncTestCase'] = array(
+    'name' => t('Hook menu tests'),
+    'description' => t('Test menu hook functionality.'),
+    'group' => t('Menu'),
+    'file' => 'menu',
+  );
+  $tests['MenuRebuildTestCase'] = array(
+    'name' => t('Menu rebuild test'),
+    'description' => t('Test rebuilding of menu.'),
+    'group' => t('Menu'),
+    'file' => 'menu',
+  );
+  $tests['DatabaseConnectionTestCase'] = array(
+    'name' => t('Connection tests'),
+    'description' => t('Tests of the core database system.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseFetchTestCase'] = array(
+    'name' => t('Fetch tests'),
+    'description' => t('Test the Database system\'s various fetch capabilities.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseFetch2TestCase'] = array(
+    'name' => t('Fetch tests, part 2'),
+    'description' => t('Test the Database system\'s various fetch capabilities.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseInsertTestCase'] = array(
+    'name' => t('Insert tests'),
+    'description' => t('Test the Insert query builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseInsertLOBTestCase'] = array(
+    'name' => t('Insert tests, LOB fields'),
+    'description' => t('Test the Insert query builder with LOB fields.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseInsertDefaultsTestCase'] = array(
+    'name' => t('Insert tests, default fields'),
+    'description' => t('Test the Insert query builder with default values.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseUpdateTestCase'] = array(
+    'name' => t('Update tests'),
+    'description' => t('Test the Update query builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseUpdateComplexTestCase'] = array(
+    'name' => t('Update tests, Complex'),
+    'description' => t('Test the Update query builder, complex queries.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseUpdateLOBTestCase'] = array(
+    'name' => t('Update tests, LOB'),
+    'description' => t('Test the Update query builder with LOB fields.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseDeleteTestCase'] = array(
+    'name' => t('Delete tests'),
+    'description' => t('Test the Delete query builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseMergeTestCase'] = array(
+    'name' => t('Merge tests'),
+    'description' => t('Test the Merge query builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseSelectTestCase'] = array(
+    'name' => t('Select tests'),
+    'description' => t('Test the Select query builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseSelectSubqueryTestCase'] = array(
+    'name' => t('Select tests, subqueries'),
+    'description' => t('Test the Select query builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseSelectOrderedTestCase'] = array(
+    'name' => t('Select tests, ordered'),
+    'description' => t('Test the Select query builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseSelectComplexTestCase'] = array(
+    'name' => t('Select tests, complex'),
+    'description' => t('Test the Select query builder with more complex queries.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseSelectPagerDefaultTestCase'] = array(
+    'name' => t('Pager query tests'),
+    'description' => t('Test the pager query extender.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseSelectTableSortDefaultTestCase'] = array(
+    'name' => t('Tablesort query tests'),
+    'description' => t('Test the tablesort query extender.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseTaggingTestCase'] = array(
+    'name' => t('Query tagging tests'),
+    'description' => t('Test the tagging capabilities of the Select builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseAlterTestCase'] = array(
+    'name' => t('Query altering tests'),
+    'description' => t('Test the hook_query_alter capabilities of the Select builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseAlter2TestCase'] = array(
+    'name' => t('Query altering tests, part 2'),
+    'description' => t('Test the hook_query_alter capabilities of the Select builder.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseRegressionTestCase'] = array(
+    'name' => t('Regression tests'),
+    'description' => t('Regression tests cases for the database layer.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseLoggingTestCase'] = array(
+    'name' => t('Query logging'),
+    'description' => t('Test the query logging facility.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseRangeQueryTestCase'] = array(
+    'name' => t('Range query test'),
+    'description' => t('Test the Range query functionality.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseTemporaryQueryTestCase'] = array(
+    'name' => t('Temporary query test'),
+    'description' => t('Test the temporary query functionality.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseAnsiSyntaxTestCase'] = array(
+    'name' => t('ANSI SQL syntax tests'),
+    'description' => t('Test ANSI SQL syntax interpretation.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseInvalidDataTestCase'] = array(
+    'name' => t('Invalid data'),
+    'description' => t('Test handling of some invalid data.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseQueryTestCase'] = array(
+    'name' => t('Custom query syntax tests'),
+    'description' => t('Test Drupal\'s extended prepared statement syntax..'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['DatabaseTransactionTestCase'] = array(
+    'name' => t('Transaction tests'),
+    'description' => t('Test the transaction abstraction system.'),
+    'group' => t('Database'),
+    'file' => 'database_test',
+  );
+  $tests['FileSpaceUsedTest'] = array(
+    'name' => t('File space used tests'),
+    'description' => t('Tests the file_space_used() function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileValidatorTest'] = array(
+    'name' => t('File validator tests'),
+    'description' => t('Tests the functions used to validate uploaded files.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileUnmanagedSaveDataTest'] = array(
+    'name' => t('Unmanaged file save data'),
+    'description' => t('Tests the unmanaged file save data function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileSaveUploadTest'] = array(
+    'name' => t('File uploading'),
+    'description' => t('Tests the file uploading functions.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileDirectoryTest'] = array(
+    'name' => t('File paths and directories'),
+    'description' => t('Tests operations dealing with directories.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileScanDirectoryTest'] = array(
+    'name' => t('File scan directory'),
+    'description' => t('Tests the file_scan_directory() function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileUnmanagedDeleteTest'] = array(
+    'name' => t('Unmanaged file delete'),
+    'description' => t('Tests the unmanaged file delete function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileUnmanagedDeleteRecursiveTest'] = array(
+    'name' => t('Unmanaged recursive file delete'),
+    'description' => t('Tests the unmanaged file delete recursive function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileUnmanagedMoveTest'] = array(
+    'name' => t('Unmanaged file moving'),
+    'description' => t('Tests the unmanaged file move function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileUnmanagedCopyTest'] = array(
+    'name' => t('Unmanaged file copying'),
+    'description' => t('Tests the unmanaged file copy function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileDeleteTest'] = array(
+    'name' => t('File delete'),
+    'description' => t('Tests the file delete function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileMoveTest'] = array(
+    'name' => t('File moving'),
+    'description' => t('Tests the file move function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileCopyTest'] = array(
+    'name' => t('File copying'),
+    'description' => t('Tests the file copy function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileLoadTest'] = array(
+    'name' => t('File loading'),
+    'description' => t('Tests the file_load() function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileSaveTest'] = array(
+    'name' => t('File saving'),
+    'description' => t('Tests the file_save() function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileValidateTest'] = array(
+    'name' => t('File validate'),
+    'description' => t('Tests the file_validate() function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileSaveDataTest'] = array(
+    'name' => t('File save data'),
+    'description' => t('Tests the file save data function.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileDownloadTest'] = array(
+    'name' => t('File download'),
+    'description' => t('Tests for file download/transfer functions.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['FileNameMungingTest'] = array(
+    'name' => t('File naming'),
+    'description' => t('Test filename munging and unmunging.'),
+    'group' => t('File'),
+    'file' => 'file',
+  );
+  $tests['CommonLUnitTest'] = array(
+    'name' => t('Tests for the l() function'),
+    'description' => t('Confirm that url() works correctly with various input.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['CommonSizeTestCase'] = array(
+    'name' => t('Size parsing test'),
+    'description' => t('Parse a predefined amount of bytes and compare the output with the expected value.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['DrupalTagsHandlingTestCase'] = array(
+    'name' => t('Drupal tags handling'),
+    'description' => t('Performs tests on Drupal\'s handling of tags, both explosion and implosion tactics used.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['CascadingStylesheetsTestCase'] = array(
+    'name' => t('Cascading stylesheets'),
+    'description' => t('Tests adding various cascading stylesheets to the page.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['DrupalHTTPRequestTestCase'] = array(
+    'name' => t('Drupal HTTP request'),
+    'description' => t('Performs tests on Drupal\'s HTTP request mechanism.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['DrupalSetContentTestCase'] = array(
+    'name' => t('Drupal set/get content'),
+    'description' => t('Performs tests on setting and retrieiving content from theme regions.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['JavaScriptTestCase'] = array(
+    'name' => t('JavaScript'),
+    'description' => t('Tests the JavaScript system.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['DrupalRenderUnitTestCase'] = array(
+    'name' => t('Drupal render'),
+    'description' => t('Performs unit tests on drupal_render().'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['DrupalErrorHandlerUnitTest'] = array(
+    'name' => t('Drupal error handlers'),
+    'description' => t('Performs tests on the Drupal error and exception handler.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['ValidUrlTestCase'] = array(
+    'name' => t('Valid Url'),
+    'description' => t('Performs tests on Drupal\'s valid url function.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['DrupalDataApiTest'] = array(
+    'name' => t('Data API functions'),
+    'description' => t('Tests the performance of CRUD APIs.'),
+    'group' => t('System'),
+    'file' => 'common',
+  );
+  $tests['DrupalErrorCollectionUnitTest'] = array(
+    'name' => t('SimpleTest error collecter'),
+    'description' => t('Performs tests on the Simpletest error and exception collecter.'),
+    'group' => t('SimpleTest'),
+    'file' => 'common',
+  );
+  $tests['XMLRPCValidator1IncTestCase'] = array(
+    'name' => t('XML-RPC validator'),
+    'description' => t('See <a href="http://www.xmlrpc.com/validator1Docs">the xmlrpc validator1 specification</a>.'),
+    'group' => t('XML-RPC'),
+    'file' => 'xmlrpc',
+  );
+  $tests['XMLRPCMessagesTestCase'] = array(
+    'name' => t('XML-RPC message'),
+    'description' => t('Test large messages.'),
+    'group' => t('XML-RPC'),
+    'file' => 'xmlrpc',
+  );
+  $tests['SchemaTestCase'] = array(
+    'name' => t('Schema API'),
+    'description' => t('Tests table creation and modification via the schema API.'),
+    'group' => t('Database'),
+    'file' => 'schema',
+  );
+  $tests['ImageToolkitTestCase'] = array(
+    'name' => t('Image toolkit tests'),
+    'description' => t('Check image tookit functions.'),
+    'group' => t('Image API'),
+    'file' => 'image',
+  );
+  $tests['ImageToolkitGdTestCase'] = array(
+    'name' => t('Image GD manipulation tests'),
+    'description' => t('Check that core image manipulations work properly: scale, resize, rotate, crop, scale and crop, and desaturate.'),
+    'group' => t('Image API'),
+    'file' => 'image',
+  );
+  $tests['ActionsConfigurationTestCase'] = array(
+    'name' => t('Actions configuration'),
+    'description' => t('Tests complex actions configuration by adding, editing, and deleting a complex action.'),
+    'group' => t('System'),
+    'file' => 'actions',
+  );
+  $tests['CacheSavingCase'] = array(
+    'name' => t('Cache saving test'),
+    'description' => t('Check our variables are saved and restored the right way.'),
+    'group' => t('Cache'),
+    'file' => 'cache',
+  );
+  $tests['CacheClearCase'] = array(
+    'name' => t('Cache clear test'),
+    'description' => t('Check our clearing is done the proper way.'),
+    'group' => t('Cache'),
+    'file' => 'cache',
+  );
+  $tests['GraphUnitTest'] = array(
+    'name' => t('Graph'),
+    'description' => t('Graph handling unit tests.'),
+    'group' => t('System'),
+    'file' => 'graph',
+  );
+
+  return $tests;
+}
+
 class SimpleTestFunctionalTest extends DrupalWebTestCase {
   /**
    * The results array that has been parsed by getTestResults().
@@ -13,17 +535,6 @@
    */
   protected $test_ids = array();
 
-  function getInfo() {
-    return array(
-      'name' => t('SimpleTest functionality'),
-      'description' => t('Test SimpleTest\'s web interface: check that the intended tests were
-                          run and ensure that test reports display the intended results. Also
-                          test SimpleTest\'s internal browser and API\'s both explicitly and
-                          implicitly.'),
-      'group' => t('SimpleTest')
-    );
-  }
-
   function setUp() {
     if (!$this->inCURL()) {
       parent::setUp('simpletest');
@@ -231,7 +742,8 @@
    */
   function getResultFieldSet() {
     $fieldsets = $this->xpath('//fieldset');
-    $info = $this->getInfo();
+    $tests = simpletest_get_all_tests();
+    $info = $tests[get_class($this)];
     foreach ($fieldsets as $fieldset) {
       if ($fieldset->legend == $info['group']) {
         return $fieldset;
@@ -264,3 +776,24 @@
     return preg_match("/^simpletest\d+/", $_SERVER['HTTP_USER_AGENT']);
   }
 }
+
+
+class SimpleTestHookTestCase extends DrupalWebTestCase {
+  
+  function testHook() {
+    // Get this test cases information.
+    $class = get_class($this);
+    $tests = simpletest_test();
+    $test = $tests[$class];
+
+    $admin_user = $this->drupalCreateUser(array('administer unit tests'));
+    $this->drupalLogin($admin_user);
+    
+    $this->drupalGet('admin/build/testing');
+    
+    $this->assertFieldByName($class, '1', t('Found the test case checkbox.'));
+    $this->assertText($test['name'], t('Test case name found.'));
+    $this->assertText($test['description'], t('Test case description found.'));
+    $this->assertText($test['group'], t('Test case group found.'));
+  }
+}
Index: modules/field/modules/text/text.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.test,v
retrieving revision 1.2
diff -u -r1.2 text.test
--- modules/field/modules/text/text.test	26 Mar 2009 13:31:25 -0000	1.2
+++ modules/field/modules/text/text.test	30 Mar 2009 05:40:49 -0000
@@ -4,14 +4,6 @@
 class TextFieldTestCase extends DrupalWebTestCase {
   protected $instance;
 
-  function getInfo() {
-    return array(
-      'name'  => t('Text Field'),
-      'description'  => t("Test the creation of text fields."),
-      'group' => t('Field')
-    );
-  }
-
   function setUp() {
     parent::setUp('field', 'text', 'field_test');
   }
Index: modules/filter/filter.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.test,v
retrieving revision 1.17
diff -u -r1.17 filter.test
--- modules/filter/filter.test	27 Mar 2009 00:40:42 -0000	1.17
+++ modules/filter/filter.test	30 Mar 2009 05:40:49 -0000
@@ -1,14 +1,27 @@
 <?php
 // $Id: filter.test,v 1.17 2009/03/27 00:40:42 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function filter_test() {
+  $tests = array();
+
+  $tests['FilterAdminTestCase'] = array(
+    'name' => t('Filter administration functionality'),
+    'description' => t('Thoroughly test the administrative interface of the filter module.'),
+    'group' => t('Filter'),
+  );
+  $tests['FilterTestCase'] = array(
+    'name' => t('Core filters'),
+    'description' => t('Filter each filter individually: Convert URLs into links, Convert line breaks, Correct broken HTML, Escape all HTML, Limit allowed HTML tags.'),
+    'group' => t('Filter'),
+  );
+
+  return $tests;
+}
+
 class FilterAdminTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Filter administration functionality'),
-      'description' => t('Thoroughly test the administrative interface of the filter module.'),
-      'group' => t('Filter'),
-    );
-  }
 
   /**
    * Test filter administration functionality.
@@ -181,14 +194,6 @@
 class FilterTestCase extends DrupalWebTestCase {
   protected $format;
 
-  function getInfo() {
-    return array(
-      'name' => t('Core filters'),
-      'description' => t('Filter each filter individually: Convert URLs into links, Convert line breaks, Correct broken HTML, Escape all HTML, Limit allowed HTML tags.'),
-      'group' => t('Filter'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
 
Index: modules/field/field.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.test,v
retrieving revision 1.8
diff -u -r1.8 field.test
--- modules/field/field.test	30 Mar 2009 05:24:38 -0000	1.8
+++ modules/field/field.test	30 Mar 2009 05:40:49 -0000
@@ -1,16 +1,44 @@
 <?php
 // $Id: field.test,v 1.8 2009/03/30 05:24:38 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function field_test() {
+  $tests = array();
+
+  $tests['FieldAttachTestCase'] = array(
+    'name' => t('Field attach tests'),
+    'description' => t('Test Field Attach API functions.'),
+    'group' => t('Field'),
+  );
+  $tests['FieldInfoTestCase'] = array(
+    'name' => t('Field info tests'),
+    'description' => t('Get information about existing fields, instances and bundles.'),
+    'group' => t('Field'),
+  );
+  $tests['FieldFormTestCase'] = array(
+    'name' => t('Field form tests'),
+    'description' => t('Test Field form handling.'),
+    'group' => t('Field'),
+  );
+  $tests['FieldTestCase'] = array(
+    'name' => t('Field tests'),
+    'description' => t('Create / read /update a field.'),
+    'group' => t('Field'),
+  );
+  $tests['FieldInstanceTestCase'] = array(
+    'name' => t('Field instance tests'),
+    'description' => t('Create field entities by attaching fields to entities.'),
+    'group' => t('Field'),
+  );
+
+  return $tests;
+}
+
 // TODO : use drupalCreateField() / drupalCreateFieldInstance() all over ?
 
 class FieldAttachTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name'  => t('Field attach tests'),
-      'description'  => t("Test Field Attach API functions."),
-      'group' => t('Field')
-    );
-  }
 
   function setUp() {
     parent::setUp('field_sql_storage', 'field', 'field_test');
@@ -606,14 +634,6 @@
 
 class FieldInfoTestCase extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name'  => t('Field info tests'),
-      'description'  => t("Get information about existing fields, instances and bundles."),
-      'group' => t('Field')
-    );
-  }
-
   function setUp() {
     parent::setUp('field_sql_storage', 'field', 'field_test');
   }
@@ -712,13 +732,6 @@
 }
 
 class FieldFormTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name'  => t('Field form tests'),
-      'description'  => t("Test Field form handling."),
-      'group' => t('Field')
-    );
-  }
 
   function setUp() {
     parent::setUp('field_sql_storage', 'field', 'field_test');
@@ -919,13 +932,6 @@
 }
 
 class FieldTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name'  => t('Field tests'),
-      'description'  => t("Create / read /update a field."),
-      'group' => t('Field')
-    );
-  }
 
   function setUp() {
     parent::setUp('field_sql_storage', 'field', 'field_test');
@@ -1063,14 +1069,6 @@
 class FieldInstanceTestCase extends DrupalWebTestCase {
   protected $field;
 
-  function getInfo() {
-    return array(
-      'name'  => t('Field instance tests'),
-      'description'  => t("Create field entities by attaching fields to entities."),
-      'group' => t('Field')
-    );
-  }
-
   function setUp() {
     parent::setUp('field_sql_storage', 'field', 'field_test');
 
Index: modules/blogapi/blogapi.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/blogapi/blogapi.test,v
retrieving revision 1.9
diff -u -r1.9 blogapi.test
--- modules/blogapi/blogapi.test	22 Feb 2009 17:55:29 -0000	1.9
+++ modules/blogapi/blogapi.test	30 Mar 2009 05:40:47 -0000
@@ -1,14 +1,22 @@
 <?php
 // $Id: blogapi.test,v 1.9 2009/02/22 17:55:29 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function blogapi_test() {
+  $tests = array();
+
+  $tests['BlogAPITestCase'] = array(
+    'name' => t('Blog API functionality'),
+    'description' => t('Create, edit, and delete post; upload file; and set/get categories.'),
+    'group' => t('Blog API'),
+  );
+
+  return $tests;
+}
+
 class BlogAPITestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Blog API functionality'),
-      'description' => t('Create, edit, and delete post; upload file; and set/get categories.'),
-      'group' => t('Blog API'),
-    );
-  }
 
   function setUp() {
     parent::setUp('blog', 'blogapi', 'taxonomy');
Index: modules/taxonomy/taxonomy.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.test,v
retrieving revision 1.27
diff -u -r1.27 taxonomy.test
--- modules/taxonomy/taxonomy.test	30 Mar 2009 05:18:49 -0000	1.27
+++ modules/taxonomy/taxonomy.test	30 Mar 2009 05:40:54 -0000
@@ -2,6 +2,46 @@
 // $Id: taxonomy.test,v 1.27 2009/03/30 05:18:49 webchick Exp $
 
 /**
+ * Implementation of hook_test().
+ */
+function taxonomy_test() {
+  $tests = array();
+
+  $tests['TaxonomyVocabularyFunctionalTest'] = array(
+    'name' => t('Taxonomy vocabulary interface'),
+    'description' => t('Test the taxonomy vocabulary interface.'),
+    'group' => t('Taxonomy'),
+  );
+  $tests['TaxonomyVocabularyUnitTest'] = array(
+    'name' => t('Taxonomy vocabularies'),
+    'description' => t('Test loading, saving and deleting vocabularies.'),
+    'group' => t('Taxonomy'),
+  );
+  $tests['TaxonomyTermUnitTest'] = array(
+    'name' => t('Taxonomy term unit tests'),
+    'description' => t('Unit tests for taxonomy term functions.'),
+    'group' => t('Taxonomy'),
+  );
+  $tests['TaxonomyTermTestCase'] = array(
+    'name' => t('Taxonomy term functions and forms.'),
+    'description' => t('Test load, save and delete for taxonomy terms.'),
+    'group' => t('Taxonomy'),
+  );
+  $tests['TaxonomyLoadMultipleUnitTest'] = array(
+    'name' => t('Taxonomy term multiple loading'),
+    'description' => t('Test the loading of multiple taxonomy terms at once'),
+    'group' => t('Taxonomy'),
+  );
+  $tests['TaxonomyHooksTestCase'] = array(
+    'name' => t('Taxonomy term hooks'),
+    'description' => t('Hooks for taxonomy term load/save/delete.'),
+    'group' => t('Taxonomy'),
+  );
+
+  return $tests;
+}
+
+/**
  * @file
  * Tests for Taxonomy module.
  */
@@ -43,14 +83,6 @@
 */
 class TaxonomyVocabularyFunctionalTest extends TaxonomyWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Taxonomy vocabulary interface'),
-      'description' => t('Test the taxonomy vocabulary interface.'),
-      'group' => t('Taxonomy'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
     $this->admin_user = $this->drupalCreateUser(array('administer taxonomy'));
@@ -173,14 +205,6 @@
  */
 class TaxonomyVocabularyUnitTest extends TaxonomyWebTestCase {
 
-function getInfo() {
-     return array(
-       'name' => t('Taxonomy vocabularies'),
-       'description' => t('Test loading, saving and deleting vocabularies.'),
-       'group' => t('Taxonomy'),
-     );
-   }
-
   function setUp() {
     parent::setUp('taxonomy');
     $admin_user = $this->drupalCreateUser(array('create article content', 'administer taxonomy'));
@@ -282,14 +306,6 @@
  */
 class TaxonomyTermUnitTest extends TaxonomyWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Taxonomy term unit tests'),
-      'description' => t('Unit tests for taxonomy term functions.'),
-      'group' => t('Taxonomy'),
-    );
-  }
-
   /**
    * Tests for taxonomy_term_count_nodes().
    *
@@ -357,14 +373,6 @@
  */
 class TaxonomyTermTestCase extends TaxonomyWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Taxonomy term functions and forms.'),
-      'description' => t('Test load, save and delete for taxonomy terms.'),
-      'group' => t('Taxonomy')
-    );
-  }
-
   function setUp() {
     parent::setUp('taxonomy');
     $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'bypass node access'));
@@ -563,14 +571,6 @@
  */
 class TaxonomyLoadMultipleUnitTest extends TaxonomyWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Taxonomy term multiple loading'),
-      'description' => t('Test the loading of multiple taxonomy terms at once'),
-      'group' => t('Taxonomy'),
-    );
-  }
-
   function setUp() {
     parent::setUp();
     $this->taxonomy_admin = $this->drupalCreateUser(array('administer taxonomy'));
@@ -629,13 +629,6 @@
  * Tests for taxonomy hook invocation.
  */
 class TaxonomyHooksTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Taxonomy term hooks'),
-      'description' => t('Hooks for taxonomy term load/save/delete.'),
-      'group' => t('Taxonomy')
-    );
-  }
 
   function setUp() {
     parent::setUp('taxonomy', 'taxonomy_test');
Index: scripts/run-tests.sh
===================================================================
RCS file: /cvs/drupal/drupal/scripts/run-tests.sh,v
retrieving revision 1.24
diff -u -r1.24 run-tests.sh
--- scripts/run-tests.sh	20 Feb 2009 03:37:58 -0000	1.24
+++ scripts/run-tests.sh	30 Mar 2009 05:40:55 -0000
@@ -52,11 +52,9 @@
   // Display all available tests.
   echo "\nAvailable test groups & classes\n";
   echo   "-------------------------------\n\n";
-  foreach ($groups as $group => $tests) {
-    echo $group . "\n";
-    foreach ($tests as $class_name => $instance) {
-      $info = $instance->getInfo();
-      echo " - " . $info['name'] . ' (' . $class_name . ')' . "\n";
+  foreach ($groups as $group_name => $test_group) {
+    foreach ($test_group as $test_class => $test_info) {
+      echo " - " . $test_info['name'] . ' (' . $class_name . ')' . "\n";
     }
   }
   exit;
@@ -340,10 +338,12 @@
  * Run a single test (assume a Drupal bootstrapped environment).
  */
 function simpletest_script_run_one_test($test_id, $test_class) {
-  simpletest_get_all_tests();
+  simpletest_load_test($test_class);
+  $tests = simpletest_get_all_tests();
+  $info = $tests[$test_class];
+
   $test = new $test_class($test_id);
   $test->run();
-  $info = $test->getInfo();
 
   $status = ((isset($test->results['#fail']) && $test->results['#fail'] > 0)
            || (isset($test->results['#exception']) && $test->results['#exception'] > 0) ? 'fail' : 'pass');
@@ -440,7 +440,7 @@
   else {
     echo "Tests to be run:\n";
     foreach ($test_list as $class_name) {
-      $info = $all_tests[$class_name]->getInfo();
+      $info = $all_tests[$class_name];
       echo " - " . $info['name'] . ' (' . $class_name . ')' . "\n";
     }
     echo "\n";
Index: modules/syslog/syslog.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/syslog/syslog.test,v
retrieving revision 1.5
diff -u -r1.5 syslog.test
--- modules/syslog/syslog.test	25 Nov 2008 13:14:28 -0000	1.5
+++ modules/syslog/syslog.test	30 Mar 2009 05:40:53 -0000
@@ -1,14 +1,22 @@
 <?php
 // $Id: syslog.test,v 1.5 2008/11/25 13:14:28 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function syslog_test() {
+  $tests = array();
+
+  $tests['SyslogTestCase'] = array(
+    'name' => t('Syslog functionality'),
+    'description' => t('Test syslog settings.'),
+    'group' => t('Syslog'),
+  );
+
+  return $tests;
+}
+
 class SyslogTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Syslog functionality'),
-      'description' => t('Test syslog settings.'),
-      'group' => t('Syslog')
-    );
-  }
 
   function setUp() {
     parent::setUp('syslog');
Index: modules/search/search.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/search/search.test,v
retrieving revision 1.16
diff -u -r1.16 search.test
--- modules/search/search.test	8 Mar 2009 05:16:20 -0000	1.16
+++ modules/search/search.test	30 Mar 2009 05:40:50 -0000
@@ -1,19 +1,47 @@
 <?php
 // $Id: search.test,v 1.16 2009/03/08 05:16:20 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function search_test() {
+  $tests = array();
+
+  $tests['SearchMatchTestCase'] = array(
+    'name' => t('Search engine queries'),
+    'description' => t('Indexes content and queries it.'),
+    'group' => t('Search'),
+  );
+  $tests['SearchBikeShed'] = array(
+    'name' => t('Bike shed'),
+    'description' => t('Tests the bike shed text on the no results page.'),
+    'group' => t('Search'),
+  );
+  $tests['SearchAdvancedSearchForm'] = array(
+    'name' => t('Advanced search form'),
+    'description' => t('Indexes content and tests the advanced search form.'),
+    'group' => t('Search'),
+  );
+  $tests['SearchRankingTestCase'] = array(
+    'name' => t('Search engine ranking'),
+    'description' => t('Indexes content and tests ranking factors.'),
+    'group' => t('Search'),
+  );
+  $tests['SearchBlockTestCase'] = array(
+    'name' => t('Block availability'),
+    'description' => t('Check if the search form block is available.'),
+    'group' => t('Search'),
+  );
+
+  return $tests;
+}
+
 // The search index can contain different types of content. Typically the type is 'node'.
 // Here we test with _test_ and _test2_ as the type.
 define('SEARCH_TYPE', '_test_');
 define('SEARCH_TYPE_2', '_test2_');
 
 class SearchMatchTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Search engine queries'),
-      'description' => t('Indexes content and queries it.'),
-      'group' => t('Search'),
-    );
-  }
 
   /**
    * Implementation setUp().
@@ -197,14 +225,6 @@
 class SearchBikeShed extends DrupalWebTestCase {
   protected $searching_user;
 
-  function getInfo() {
-    return array(
-      'name' => t('Bike shed'),
-      'description' => t('Tests the bike shed text on the no results page.'),
-      'group' => t('Search')
-    );
-  }
-
   function setUp() {
     parent::setUp('search');
 
@@ -227,14 +247,6 @@
 class SearchAdvancedSearchForm extends DrupalWebTestCase {
   protected $node;
 
-  function getInfo() {
-    return array(
-      'name' => t('Advanced search form'),
-      'description' => t('Indexes content and tests the advanced search form.'),
-      'group' => t('Search'),
-    );
-  }
-
   function setUp() {
     parent::setUp('search');
     // Create and login user.
@@ -288,13 +300,6 @@
 }
 
 class SearchRankingTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Search engine ranking'),
-      'description' => t('Indexes content and tests ranking factors.'),
-      'group' => t('Search'),
-    );
-  }
 
   /**
    * Implementation setUp().
@@ -371,13 +376,6 @@
 }
 
 class SearchBlockTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Block availability'),
-      'description' => t('Check if the search form block is available.'),
-      'group' => t('Search'),
-    );
-  }
 
   function setUp() {
     parent::setUp('search');
Index: modules/statistics/statistics.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/statistics/statistics.test,v
retrieving revision 1.6
diff -u -r1.6 statistics.test
--- modules/statistics/statistics.test	30 Dec 2008 16:43:18 -0000	1.6
+++ modules/statistics/statistics.test	30 Mar 2009 05:40:53 -0000
@@ -1,14 +1,22 @@
 <?php
 // $Id: statistics.test,v 1.6 2008/12/30 16:43:18 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function statistics_test() {
+  $tests = array();
+
+  $tests['StatisticsBlockVisitorsTestCase'] = array(
+    'name' => t('Top visitor blocking'),
+    'description' => t('Tests blocking of IP addresses via the top visitors report.'),
+    'group' => t('Statistics'),
+  );
+
+  return $tests;
+}
+
 class StatisticsBlockVisitorsTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Top visitor blocking'),
-      'description' => t('Tests blocking of IP addresses via the top visitors report.'),
-      'group' => t('Statistics')
-    );
-  }
 
   function setUp() {
     parent::setUp('statistics');
Index: modules/translation/translation.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/translation/translation.test,v
retrieving revision 1.8
diff -u -r1.8 translation.test
--- modules/translation/translation.test	17 Mar 2009 04:22:50 -0000	1.8
+++ modules/translation/translation.test	30 Mar 2009 05:40:54 -0000
@@ -1,17 +1,24 @@
 <?php
 // $Id: translation.test,v 1.8 2009/03/17 04:22:50 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function translation_test() {
+  $tests = array();
+
+  $tests['TranslationTestCase'] = array(
+    'name' => t('Translation functionality'),
+    'description' => t('Create a page with translation, modify the page outdating translation, and update translation.'),
+    'group' => t('Translation'),
+  );
+
+  return $tests;
+}
+
 class TranslationTestCase extends DrupalWebTestCase {
   protected $book;
 
-  function getInfo() {
-    return array(
-      'name' => t('Translation functionality'),
-      'description' => t('Create a page with translation, modify the page outdating translation, and update translation.'),
-      'group' => t('Translation')
-    );
-  }
-
   function setUp() {
     parent::setUp('locale', 'translation');
   }
Index: modules/upload/upload.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/upload/upload.test,v
retrieving revision 1.13
diff -u -r1.13 upload.test
--- modules/upload/upload.test	22 Feb 2009 17:55:30 -0000	1.13
+++ modules/upload/upload.test	30 Mar 2009 05:40:54 -0000
@@ -1,14 +1,22 @@
 <?php
 // $Id: upload.test,v 1.13 2009/02/22 17:55:30 dries Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function upload_test() {
+  $tests = array();
+
+  $tests['UploadTestCase'] = array(
+    'name' => t('Upload functionality'),
+    'description' => t('Check content uploaded to nodes.'),
+    'group' => t('Upload'),
+  );
+
+  return $tests;
+}
+
 class UploadTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Upload functionality'),
-      'description' => t('Check content uploaded to nodes.'),
-      'group' => t('Upload'),
-    );
-  }
 
   function setUp() {
     parent::setUp('upload');
Index: modules/locale/locale.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.test,v
retrieving revision 1.19
diff -u -r1.19 locale.test
--- modules/locale/locale.test	24 Feb 2009 16:46:52 -0000	1.19
+++ modules/locale/locale.test	30 Mar 2009 05:40:49 -0000
@@ -2,6 +2,66 @@
 // $Id: locale.test,v 1.19 2009/02/24 16:46:52 webchick Exp $
 
 /**
+ * Implementation of hook_test().
+ */
+function locale_test() {
+  $tests = array();
+
+  $tests['LocaleConfigurationTest'] = array(
+    'name' => t('Language configuration'),
+    'description' => t('Adds a new locale and tests changing its status and the default language.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocaleTranslationFunctionalTest'] = array(
+    'name' => t('String translate, search and validate'),
+    'description' => t('Adds a new locale and translates its name. Checks the validation of translation strings and search results.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocaleImportFunctionalTest'] = array(
+    'name' => t('Translation import'),
+    'description' => t('Tests the importation of locale files.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocaleExportFunctionalTest'] = array(
+    'name' => t('Translation export'),
+    'description' => t('Tests the exportation of locale files.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocaleUninstallFunctionalTest'] = array(
+    'name' => t('Locale uninstall (EN)'),
+    'description' => t('Tests the uninstall process using the built-in UI language.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocaleUninstallFrenchFunctionalTest'] = array(
+    'name' => t('Locale uninstall (FR)'),
+    'description' => t('Tests the uninstall process using French as UI language.'),
+    'group' => t('Locale'),
+  );
+  $tests['LanguageSwitchingFunctionalTest'] = array(
+    'name' => t('Language switching'),
+    'description' => t('Tests for the language switching feature.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocaleUserLanguageFunctionalTest'] = array(
+    'name' => t('User language settings'),
+    'description' => t('Tests user\'s ability to change their default language.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocalePathFunctionalTest'] = array(
+    'name' => t('Path language settings'),
+    'description' => t('Checks you can configure a language for individual url aliases.'),
+    'group' => t('Locale'),
+  );
+  $tests['LocaleContentFunctionalTest'] = array(
+    'name' => t('Content language settings'),
+    'description' => t('Checks you can enable multilingual support on content types and configure a language for a node.'),
+    'group' => t('Locale'),
+  );
+
+  return $tests;
+}
+
+/**
  * @file
  * Tests for Locale module.
  *
@@ -23,13 +83,6 @@
  * Functional tests for the language configuration forms.
  */
 class LocaleConfigurationTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Language configuration'),
-      'description' => t('Adds a new locale and tests changing its status and the default language.'),
-      'group' => t('Locale'),
-    );
-  }
 
   function setUp() {
     parent::setUp('locale');
@@ -165,13 +218,6 @@
  * Functional test for string translation and validation.
  */
 class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('String translate, search and validate'),
-      'description' => t('Adds a new locale and translates its name. Checks the validation of translation strings and search results.'),
-      'group' => t('Locale'),
-    );
-  }
 
   function setUp() {
     parent::setUp('locale');
@@ -528,13 +574,6 @@
  * Functional tests for the import of translation files.
  */
 class LocaleImportFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Translation import'),
-      'description' => t('Tests the importation of locale files.'),
-      'group' => t('Locale'),
-    );
-  }
 
   /**
    * A user able to create languages and import translations.
@@ -778,13 +817,6 @@
  * Functional tests for the export of translation files.
  */
 class LocaleExportFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Translation export'),
-      'description' => t('Tests the exportation of locale files.'),
-      'group' => t('Locale'),
-    );
-  }
 
   /**
    * A user able to create languages and export translations.
@@ -860,13 +892,6 @@
  * Locale uninstall with English UI functional test.
  */
 class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Locale uninstall (EN)'),
-      'description' => t('Tests the uninstall process using the built-in UI language.'),
-      'group' => t('Locale'),
-    );
-  }
 
   /**
    * The default language set for the UI before uninstall.
@@ -966,13 +991,6 @@
  * to test with this new language.
  */
 class LocaleUninstallFrenchFunctionalTest extends LocaleUninstallFunctionalTest {
-  function getInfo() {
-    return array(
-      'name' => t('Locale uninstall (FR)'),
-      'description' => t('Tests the uninstall process using French as UI language.'),
-      'group' => t('Locale'),
-    );
-  }
 
   function setUp() {
     parent::setUp();
@@ -986,14 +1004,6 @@
  */
 class LanguageSwitchingFunctionalTest extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Language switching'),
-      'description' => t('Tests for the language switching feature.'),
-      'group' => t('Locale'),
-    );
-  }
-
   function setUp() {
     parent::setUp('locale');
 
@@ -1065,13 +1075,6 @@
  * Functional tests for a user's ability to change their default language.
  */
 class LocaleUserLanguageFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('User language settings'),
-      'description' => t("Tests user's ability to change their default language."),
-      'group' => t('Locale'),
-    );
-  }
 
   function setUp() {
     parent::setUp('locale');
@@ -1160,13 +1163,6 @@
  * Functional tests for configuring a different path alias per language.
  */
 class LocalePathFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Path language settings'),
-      'description' => t('Checks you can configure a language for individual url aliases.'),
-      'group' => t('Locale'),
-    );
-  }
 
   function setUp() {
     parent::setUp('locale', 'path');
@@ -1243,13 +1239,6 @@
  * Functional tests for multilingual support on nodes.
  */
 class LocaleContentFunctionalTest extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Content language settings'),
-      'description' => t('Checks you can enable multilingual support on content types and configure a language for a node.'),
-      'group' => t('Locale'),
-    );
-  }
 
   function setUp() {
     parent::setUp('locale');
Index: modules/aggregator/aggregator.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.test,v
retrieving revision 1.19
diff -u -r1.19 aggregator.test
--- modules/aggregator/aggregator.test	1 Mar 2009 07:21:02 -0000	1.19
+++ modules/aggregator/aggregator.test	30 Mar 2009 05:40:47 -0000
@@ -1,6 +1,51 @@
 <?php
 // $Id: aggregator.test,v 1.19 2009/03/01 07:21:02 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function aggregator_test() {
+  $tests = array();
+
+  $tests['AddFeedTestCase'] = array(
+    'name' => t('Add feed functionality'),
+    'description' => t('Add feed test.'),
+    'group' => t('Aggregator'),
+  );
+  $tests['UpdateFeedTestCase'] = array(
+    'name' => t('Update feed functionality'),
+    'description' => t('Update feed test.'),
+    'group' => t('Aggregator'),
+  );
+  $tests['RemoveFeedTestCase'] = array(
+    'name' => t('Remove feed functionality'),
+    'description' => t('Remove feed test.'),
+    'group' => t('Aggregator'),
+  );
+  $tests['UpdateFeedItemTestCase'] = array(
+    'name' => t('Update feed item functionality'),
+    'description' => t('Update feed items from a feed.'),
+    'group' => t('Aggregator'),
+  );
+  $tests['RemoveFeedItemTestCase'] = array(
+    'name' => t('Remove feed item functionality'),
+    'description' => t('Remove feed items from a feed.'),
+    'group' => t('Aggregator'),
+  );
+  $tests['CategorizeFeedItemTestCase'] = array(
+    'name' => t('Categorize feed item functionality'),
+    'description' => t('Test feed item categorization.'),
+    'group' => t('Aggregator'),
+  );
+  $tests['ImportOPMLTestCase'] = array(
+    'name' => t('Import feeds from OPML functionality'),
+    'description' => t('Test OPML import.'),
+    'group' => t('Aggregator'),
+  );
+
+  return $tests;
+}
+
 class AggregatorTestCase extends DrupalWebTestCase {
   private static $prefix = 'simpletest_aggregator_';
 
@@ -243,13 +288,6 @@
 }
 
 class AddFeedTestCase extends AggregatorTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Add feed functionality'),
-      'description' => t('Add feed test.'),
-      'group' => t('Aggregator')
-    );
-  }
 
   /**
    * Create a feed, ensure that it is unique, check the source, and delete the feed.
@@ -272,13 +310,6 @@
 }
 
 class UpdateFeedTestCase extends AggregatorTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Update feed functionality'),
-      'description' => t('Update feed test.'),
-      'group' => t('Aggregator')
-    );
-  }
 
   /**
    * Create a feed and attempt to update it.
@@ -314,13 +345,6 @@
 }
 
 class RemoveFeedTestCase extends AggregatorTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Remove feed functionality'),
-      'description' => t('Remove feed test.'),
-      'group' => t('Aggregator')
-    );
-  }
 
   /**
    * Remove a feed and ensure that all it services are removed.
@@ -342,13 +366,6 @@
 }
 
 class UpdateFeedItemTestCase extends AggregatorTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Update feed item functionality'),
-      'description' => t('Update feed items from a feed.'),
-      'group' => t('Aggregator')
-    );
-  }
 
   /**
    * Test running "update items" from the 'admin/content/aggregator' page.
@@ -403,13 +420,6 @@
 }
 
 class RemoveFeedItemTestCase extends AggregatorTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Remove feed item functionality'),
-      'description' => t('Remove feed items from a feed.'),
-      'group' => t('Aggregator')
-    );
-  }
 
   /**
    * Test running "remove items" from the 'admin/content/aggregator' page.
@@ -443,14 +453,6 @@
 class CategorizeFeedItemTestCase extends AggregatorTestCase {
   private static $prefix = 'simpletest_aggregator_';
 
-  function getInfo() {
-    return array(
-      'name' => t('Categorize feed item functionality'),
-      'description' => t('Test feed item categorization.'),
-      'group' => t('Aggregator')
-    );
-  }
-
   /**
    * If a feed has a category, make sure that the children inherit that
    * categorization.
@@ -502,14 +504,6 @@
 class ImportOPMLTestCase extends AggregatorTestCase {
   private static $prefix = 'simpletest_aggregator_';
 
-  function getInfo() {
-    return array(
-      'name' => t('Import feeds from OPML functionality'),
-      'description' => t('Test OPML import.'),
-      'group' => t('Aggregator'),
-    );
-  }
-
   /**
    * Open OPML import form.
    */
Index: modules/poll/poll.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.test,v
retrieving revision 1.15
diff -u -r1.15 poll.test
--- modules/poll/poll.test	1 Feb 2009 06:48:15 -0000	1.15
+++ modules/poll/poll.test	30 Mar 2009 05:40:50 -0000
@@ -1,6 +1,36 @@
 <?php
 // $Id: poll.test,v 1.15 2009/02/01 06:48:15 webchick Exp $
 
+/**
+ * Implementation of hook_test().
+ */
+function poll_test() {
+  $tests = array();
+
+  $tests['PollCreateTestCase'] = array(
+    'name' => t('Poll create'),
+    'description' => t('Adds "more choices", previews and creates a poll.'),
+    'group' => t('Poll'),
+  );
+  $tests['PollVoteTestCase'] = array(
+    'name' => t('Poll vote'),
+    'description' => t('Vote on a poll'),
+    'group' => t('Poll'),
+  );
+  $tests['PollBlockTestCase'] = array(
+    'name' => t('Block availability'),
+    'description' => t('Check if the most recent poll block is available.'),
+    'group' => t('Poll'),
+  );
+  $tests['PollJSAddChoice'] = array(
+    'name' => t('Poll add choice'),
+    'description' => t('Submits a POST request for an additional poll choice.'),
+    'group' => t('Poll'),
+  );
+
+  return $tests;
+}
+
 class PollTestCase extends DrupalWebTestCase {
 
   /**
@@ -74,9 +104,6 @@
 }
 
 class PollCreateTestCase extends PollTestCase {
-  function getInfo() {
-    return array('name' => t('Poll create'), 'description' => 'Adds "more choices", previews and creates a poll.', 'group' => t('Poll'));
-  }
 
   function setUp() {
     parent::setUp('poll');
@@ -90,9 +117,6 @@
 }
 
 class PollVoteTestCase extends PollTestCase {
-  function getInfo() {
-    return array('name' => t('Poll vote'), 'description' => 'Vote on a poll', 'group' => t('Poll'));
-  }
 
   function setUp() {
     parent::setUp('poll');
@@ -125,13 +149,6 @@
 }
 
 class PollBlockTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Block availability'),
-      'description' => t('Check if the most recent poll block is available.'),
-      'group' => t('Poll'),
-    );
-  }
 
   function setUp() {
     parent::setUp('poll');
@@ -159,14 +176,6 @@
  */
 class PollJSAddChoice extends DrupalWebTestCase {
 
-  function getInfo() {
-    return array(
-      'name' => t('Poll add choice'),
-      'description' => t('Submits a POST request for an additional poll choice.'),
-      'group' => t('Poll')
-    );
-  }
-
   function setUp() {
     parent::setUp('poll');
   }
Index: modules/profile/profile.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.test,v
retrieving revision 1.11
diff -u -r1.11 profile.test
--- modules/profile/profile.test	8 Jan 2009 19:09:49 -0000	1.11
+++ modules/profile/profile.test	30 Mar 2009 05:40:50 -0000
@@ -2,6 +2,46 @@
 // $Id: profile.test,v 1.11 2009/01/08 19:09:49 dries Exp $
 
 /**
+ * Implementation of hook_test().
+ */
+function profile_test() {
+  $tests = array();
+
+  $tests['ProfileTestFields'] = array(
+    'name' => t('Test single fields'),
+    'description' => t('Testing profile module with add/edit/delete textfield, textarea, list, checkbox, and url fields into profile page'),
+    'group' => t('Profile'),
+  );
+  $tests['ProfileTestSelect'] = array(
+    'name' => t('Test select field'),
+    'description' => t('Testing profile module with add/edit/delete a select field'),
+    'group' => t('Profile'),
+  );
+  $tests['ProfileTestDate'] = array(
+    'name' => t('Test date field'),
+    'description' => t('Testing profile module with add/edit/delete a date field'),
+    'group' => t('Profile'),
+  );
+  $tests['ProfileTestWeights'] = array(
+    'name' => t('Test field weights'),
+    'description' => t('Testing profile modules weigting of fields'),
+    'group' => t('Profile'),
+  );
+  $tests['ProfileTestAutocomplete'] = array(
+    'name' => t('Autocompletion'),
+    'description' => t('Test profile fields with autocompletion.'),
+    'group' => t('Profile'),
+  );
+  $tests['ProfileBlockTestCase'] = array(
+    'name' => t('Block availability'),
+    'description' => t('Check if the author-information block is available.'),
+    'group' => t('Profile'),
+  );
+
+  return $tests;
+}
+
+/**
  * A class for common methods for testing profile fields.
  */
 class ProfileTestCase extends DrupalWebTestCase {
@@ -114,12 +154,6 @@
 }
 
 class ProfileTestFields extends ProfileTestCase {
-  function getInfo() {
-    return array(
-      'name' => 'Test single fields',
-      'description' => t('Testing profile module with add/edit/delete textfield, textarea, list, checkbox, and url fields into profile page') ,
-      'group' => t('Profile'));
-  }
 
   /**
    * Test each of the field types. List selection and date fields are tested
@@ -149,12 +183,6 @@
 }
 
 class ProfileTestSelect extends ProfileTestCase {
-  function getInfo() {
-    return array(
-      'name' => 'Test select field',
-      'description' => t('Testing profile module with add/edit/delete a select field') ,
-      'group' => t('Profile'));
-  }
 
   /**
    * Create a list selection field, give it a value, and delete the field.
@@ -174,12 +202,6 @@
 }
 
 class ProfileTestDate extends ProfileTestCase {
-  function getInfo() {
-    return array(
-      'name' => 'Test date field',
-      'description' => t('Testing profile module with add/edit/delete a date field') ,
-      'group' => t('Profile'));
-  }
 
   /**
    * Create a date field, give it a value, and delete the field.
@@ -210,12 +232,6 @@
 }
 
 class ProfileTestWeights extends ProfileTestCase {
-  function getInfo() {
-    return array(
-      'name' => 'Test field weights',
-      'description' => t('Testing profile modules weigting of fields') ,
-      'group' => t('Profile'));
-  }
 
   function testProfileFieldWeights() {
     $this->drupalLogin($this->admin_user);
@@ -239,13 +255,6 @@
  * Test profile field autocompletion and access.
  */
 class ProfileTestAutocomplete extends ProfileTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Autocompletion'),
-      'description' => t('Test profile fields with autocompletion.'),
-      'group' => t('Profile')
-    );
-  }
 
   /**
    * Tests profile field autocompletion and access.
@@ -292,13 +301,6 @@
 }
 
 class ProfileBlockTestCase extends DrupalWebTestCase {
-  function getInfo() {
-    return array(
-      'name' => t('Block availability'),
-      'description' => t('Check if the author-information block is available.'),
-      'group' => t('Profile'),
-    );
-  }
 
   function setUp() {
     parent::setUp('profile');
Index: modules/simpletest/simpletest.api.php
===================================================================
RCS file: modules/simpletest/simpletest.api.php
diff -N modules/simpletest/simpletest.api.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/simpletest.api.php	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,53 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Hooks provided by the SimpleTest module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Define tests provided.
+ *
+ * This hook allows modules to add tests to global list available for use. The
+ * hook is executed before listing tests and before running tests.
+ *
+ * @return
+ *   The test case class name related to the item should be specified in the
+ *   array key.
+ *   - "name": Required. The translated formal name of the test.
+ *   - "description": Required. The translated description of what the test does.
+ *   - "group": Required. The translated group name to categorize the test in.
+ *   - "file": The name of the file the test case is located in, excluding the
+ *     test extension. If specified the file should be located in a tests
+ *     folder in the module root, /path/to/modules/tests. Deaults to
+ *     MODULENAME.test.
+ */
+function hook_test() {
+  $tests = array();
+
+  $tests['ExampleTestCase'] = array(
+    'name' => t('Example'),
+    'description' => t('Tests example stuff.'),
+    'group' => t('Example'),
+  );
+
+  // File additional_example.test found in /path/to/module/tests directory.
+  $tests['AdditionalExampleTestCase'] = array(
+    'name' => t('Additional example'),
+    'description' => t('Tests additional example stuff.'),
+    'group' => t('Example'),
+    'file' => 'additional_example',
+  );
+
+  return $tests;
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
