Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.246
diff -u -p -r1.246 filter.module
--- modules/filter/filter.module	30 Mar 2009 03:15:40 -0000	1.246
+++ modules/filter/filter.module	31 Mar 2009 10:55:17 -0000
@@ -371,18 +371,33 @@ function filter_format_allowcache($forma
 
 /**
  * Retrieve a list of filters for a certain format.
+ *
+ * @param $format
+ *   The ID of the format for which filters will be retrieved.
+ * @param $reset
+ *   Whether to reset this function's internal cache.
  */
-function filter_list_format($format) {
+function filter_list_format($format, $reset = FALSE) {
   static $filters = array();
+  if ($reset) {
+    $filters = array();
+  }
 
   if (!isset($filters[$format])) {
-    $filters[$format] = array();
-    $result = db_query("SELECT * FROM {filter} WHERE format = %d ORDER BY weight, module, delta", $format);
-    while ($filter = db_fetch_object($result)) {
-      $list = module_invoke($filter->module, 'filter', 'list');
-      if (isset($list) && is_array($list) && isset($list[$filter->delta])) {
-        $filter->name = $list[$filter->delta];
-        $filters[$format][$filter->module . '/' . $filter->delta] = $filter;
+    $filter_list = db_query("SELECT * FROM {filter} WHERE format = :format ORDER BY weight, module, delta", array(':format' => $format))->fetchAllAssoc('fid');
+    if (empty($filter_list) && !db_result(db_query("SELECT 1 FROM {filter_format} WHERE format = :format", array(':format' => $format)))) {
+      // The format has no filters and does not exist, so use the default
+      // text format.
+      $filters[$format] = filter_list_format(variable_get('filter_default_format', 1));
+    }
+    else {
+      $filters[$format] = array();
+      foreach ($filter_list as $filter) {
+        $list = module_invoke($filter->module, 'filter', 'list');
+        if (isset($list) && is_array($list) && isset($list[$filter->delta])) {
+          $filter->name = $list[$filter->delta];
+          $filters[$format][$filter->module . '/' . $filter->delta] = $filter;
+        }
       }
     }
   }
Index: modules/filter/filter.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.test,v
retrieving revision 1.18
diff -u -p -r1.18 filter.test
--- modules/filter/filter.test	31 Mar 2009 01:49:52 -0000	1.18
+++ modules/filter/filter.test	31 Mar 2009 10:55:17 -0000
@@ -1,6 +1,67 @@
 <?php
 // $Id: filter.test,v 1.18 2009/03/31 01:49:52 webchick Exp $
 
+class FilterHelperTestCase extends DrupalWebTestCase {
+
+  /**
+   * Create a new text format.
+   *
+   * @param $filters
+   *   An array containing the combined 'module/delta' value for each filter
+   *   to be added to this text format.
+   * @param $roles
+   *   An array of role IDs which will have access to this text format.
+   * @param $name
+   *   The name of the text format. (If not set, a random name is used.)
+   * @return
+   *   An object representing the new text format.
+   */
+  protected function drupalCreateTextFormat($filters = array(), $roles = array(), $name = NULL) {
+    $edit = array();
+
+    // The filters for the default text format are automatically enabled
+    // on the form for adding a new format. So we need to explicitly disable
+    // them.
+    foreach (array_keys(filter_list_format(variable_get('filter_default_format', 1))) as $filter) {
+      $edit['filters[' . $filter . ']'] = FALSE;
+    }
+
+    // Now add the parameters that were provided.
+    foreach ($filters as $filter) {
+      $edit['filters[' . $filter . ']'] = TRUE;
+    }
+    foreach ($roles as $role) {
+      $edit['roles[' . $role . ']'] = TRUE;
+    }
+    $edit['name'] = !isset($name) ? $this->randomName() : $name;
+
+    // Submit the form.
+    $this->drupalPost('admin/settings/filter/add', $edit, t('Save configuration'));
+
+    // Verify that the text format exists in the database.
+    $format = db_query("SELECT * FROM {filter_format} WHERE name = :name", array(':name' => $edit['name']))->fetchObject();
+    $this->assertTrue($format, t('New text format successfully loaded.'));
+
+    return $format;
+  }
+
+  /**
+   * Delete a text format.
+   *
+   * @param $format
+   *   The ID of the text format to delete.
+   */
+  protected function drupalDeleteTextFormat($format) {
+    // Submit the form.
+    $this->drupalPost('admin/settings/filter/delete/' . $format, array(), t('Delete'));
+
+    // Verify that the deleted text format does not exist in the database.
+    $format = db_query("SELECT * FROM {filter_format} WHERE format = :format", array(':format' => $format))->fetchObject();
+    $this->assertFalse($format, t('Text format deleted successfully.'));
+  }
+
+}
+
 class FilterAdminTestCase extends DrupalWebTestCase {
   public static function getInfo() {
     return array(
@@ -60,27 +121,17 @@ class FilterAdminTestCase extends Drupal
     }
     $this->assertTrue(($filters[0]->delta == $second_filter && $filters[1]->delta == $first_filter), t('Order confirmed.'));
 
-    // Add filter.
-    $edit = array();
-    $edit['name'] = $this->randomName();
-    $edit['roles[2]'] = TRUE;
-    $edit['filters[filter/' . $second_filter . ']'] = TRUE;
-    $edit['filters[filter/' . $first_filter . ']'] = TRUE;
-    $this->drupalPost('admin/settings/filter/add', $edit, t('Save configuration'));
-    $this->assertRaw(t('Added text format %format.', array('%format' => $edit['name'])), t('New filter created.'));
-
-    $format = $this->getFilter($edit['name']);
-    $this->assertNotNull($format, t('Format found in database.'));
-
-    if ($format !== NULL) {
-      $this->assertFieldByName('roles[2]', '', t('Role found.'));
-      $this->assertFieldByName('filters[filter/' . $second_filter . ']', '', t('Line break filter found.'));
-      $this->assertFieldByName('filters[filter/' . $first_filter . ']', '', t('Url filter found.'));
-
-      // Delete new filter.
-      $this->drupalPost('admin/settings/filter/delete/' . $format->format, array(), t('Delete'));
-      $this->assertRaw(t('Deleted text format %format.', array('%format' => $edit['name'])), t('Format successfully deleted.'));
-    }
+    // Add a text format and check for the expected information on the page.
+    $format = $this->drupalCreateTextFormat(array('filter/' . $second_filter, 'filter/' . $first_filter), array(DRUPAL_AUTHENTICATED_RID));
+    $this->assertRaw(t('Added text format %format.', array('%format' => $format->name)), t('Message about the new text format appears on the page.'));
+    $this->assertFieldByName('roles[' . DRUPAL_AUTHENTICATED_RID . ']', '', t('Role found.'));
+    $this->assertFieldByName('filters[filter/' . $second_filter . ']', '', t('Line break filter found.'));
+    $this->assertFieldByName('filters[filter/' . $first_filter . ']', '', t('Url filter found.'));
+
+    // Delete the text format and check for the expected information on the
+    // page.
+    $this->drupalDeleteTextFormat($format->format);
+    $this->assertRaw(t('Deleted text format %format.', array('%format' => $format->name)), t('Message about the deleted text format appears on the page.'));
 
     // Change default filter back.
     $edit = array();
@@ -166,19 +217,9 @@ class FilterAdminTestCase extends Drupal
 
     return array($filtered, $full);
   }
-
-  /**
-   * Get filter by name.
-   *
-   * @param string $name Name of filter to find.
-   * @return object Filter object.
-   */
-  function getFilter($name) {
-    return db_fetch_object(db_query("SELECT * FROM {filter_format} WHERE name = '%s'", $name));
-  }
 }
 
-class FilterTestCase extends DrupalWebTestCase {
+class FilterTestCase extends FilterHelperTestCase {
   protected $format;
 
   public static function getInfo() {
@@ -216,21 +257,60 @@ class FilterTestCase extends DrupalWebTe
   function testHtmlFilter() {
 
   }
+}
+
+class FilterListFormatTestCase extends FilterHelperTestCase {
+  protected $admin_user;
 
-  function createFormat($filter) {
-    $edit = array(
-      'name' => $this->randomName(),
-      'roles[2]' => TRUE,
-      'filters[filter/' . $filter . ']' => TRUE,
+  function getInfo() {
+    return array(
+      'name' => t('Filter list functionality'),
+      'description' => t('Test that filters for a text format can be retrieved correctly.'),
+      'group' => t('Filter'),
     );
-    $this->drupalPost('admin/settings/filter/add', $edit, t('Save configuration'));
-    return db_fetch_object(db_query("SELECT * FROM {filter_format} WHERE name = '%s'", $edit['name']));
   }
+  
+  function setUp() {
+    parent::setUp();
+    $admin_user = $this->drupalCreateUser(array('administer filters'));
+    $this->drupalLogin($admin_user);
+  }
+
+  function testFilterListFormat() {
+    $line_break_filter = 'filter/1';
+    $url_filter = 'filter/2';
+    $formats = array();
+
+    // Add an empty text format, a text format with one filter, and a text
+    // format with multiple filters.
+    $filters_list = array(
+      'empty' => array(),
+      'one' => array($line_break_filter),
+      'multiple' => array($line_break_filter, $url_filter),
+    );
+    foreach ($filters_list as $label => $filters) {
+      $formats[$label] = $this->drupalCreateTextFormat($filters);
+    }
 
-  function deleteFormat($format) {
-    if ($format !== NULL) {
-      // Delete new filter.
-      $this->drupalPost('admin/settings/filter/delete/' . $format->format, array(), t('Delete'));
+    // Check that each format contains the correct filters.
+    foreach ($formats as $label => $format) {
+      $found_filters = array_keys(filter_list_format($format->format));
+      sort($found_filters);
+      $expected_filters = $filters_list[$label];
+      sort($expected_filters);
+      $this->assertEqual($found_filters, $expected_filters, empty($expected_filters) ? t('The text format contains no filters.') : t('The text format contains the expected filters: %filters', array('%filters' => implode(', ', $expected_filters))));
     }
+
+    // Delete one of the text formats, and check that it now uses the
+    // filters for the default text format. (This is a security feature
+    // that prevents content stored with a deleted text format from
+    // being displayed without any filtering.)
+    $format = $formats['one']->format;
+    $this->drupalDeleteTextFormat($format);
+    // Reset the static cache since we have changed formats in the same
+    // page request.
+    $deleted_format_filters = filter_list_format($format, TRUE);
+    $default_format_filters = filter_list_format(variable_get('filter_default_format', 1));
+    $this->assertEqual($deleted_format_filters, $default_format_filters, t('A deleted text format users the filters from the default text format: %filters', array('%filters' => implode(', ', array_keys($default_format_filters)))));
   }
 }
