Index: modules/simpletest/tests/mail.test
===================================================================
RCS file: modules/simpletest/tests/mail.test
diff -N modules/simpletest/tests/mail.test
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/mail.test	16 Jun 2009 20:43:53 -0000
@@ -0,0 +1,232 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Tests for mail.inc.
+ */
+
+/**
+ * Functional tests for the HTML to Text filter.
+ */
+class DrupalHtmlToTextTestCase extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name'  => t('HTML to Text filter'),
+      'description' => t('Test drupal_html_to_text() with a wide range of tags, both as single tags and as a full e-mail example.'),
+      'group' => t('Mail'),
+    );
+  }
+
+  /**
+   * Test all supported tags of drupal_html_to_text().
+   */
+  function testDrupalHtmlToText() {
+    $drupal_html_to_text_cases = array(
+      // Tests all supported HTML tags.
+      '<a href = "http://drupal.org">Drupal.org</a>'   => 'Drupal.org [1]' . "\n\n" . '[1] http://drupal.org' . "\n",
+      '<em>Drupal</em>'                                => '/Drupal/' . "\n",
+      '<i>Drupal</i>'                                  => '/Drupal/' . "\n",
+      '<strong>Drupal</strong>'                        => '*Drupal*' . "\n",
+      '<b>Drupal</b>'                                  => '*Drupal*' . "\n",
+      'Drupal<br />Drupal'                               => 'Drupal' . "\n" . 'Drupal' . "\n",
+      '<p>Drupal</p>'                                  => 'Drupal' . "\n\n",
+      '<blockquote>Drupal</blockquote>'                => '>Drupal' . "\n",
+      '<ul>Drupal</ul>'                                => 'Drupal' . "\n\n",
+      '<ul><li>Drupal</li></ul>'                       => ' * Drupal' . "\n\n",
+      '<ul><li>Drupal</li><li>Drupal</li></ul>'        => ' * Drupal' . "\n" . ' * Drupal' . "\n\n",
+      '<ol>Drupal</ol>'                                => 'Drupal' . "\n" . "\n",
+      '<ol><li>Drupal</li></ol>'                       => ' 1) Drupal' . "\n" . "\n",
+      '<ol><li>Drupal</li><li>Drupal</li></ol>'        => ' 1) Drupal' . "\n" . ' 2) Drupal' . "\n\n",
+      '<ul><li>Drupal</li><li><ol><li>Drupal</li><li>Drupal</li></ol></li></ul>' => ' * Drupal' . "\n" . ' *  1) Drupal' . "\n" . '    2) Drupal' . "\n" . '   ' . "\n\n",
+      '<ol><li>Drupal</li><li><ul><li>Drupal</li><li>Drupal</li></ul></li></ol>' => ' 1) Drupal' . "\n" . ' 2)  * Drupal' . "\n" . '     * Drupal' . "\n" . '    ' . "\n\n",
+      '<dl>Drupal</dl>'                                => 'Drupal' . "\n\n",
+      '<dt>Drupal</dt>'                                => 'Drupal' . "\n",
+      '<dl><dt>Drupal</dl>'                            => 'Drupal' . "\n\n",
+      '<dl><dt>Drupal<dd>Drupal</dl>'                  => 'Drupal' . "\n" . '    Drupal' . "\n\n" ,
+      '<dl><dt>Drupal</dt><dd>Drupal</dd></dl>'        => 'Drupal' . "\n" . '    Drupal' . "\n\n" ,
+      '<h1>Drupal</h1>'                                => '======== DRUPAL ' . str_repeat("=", 62) . "\n\n",
+      '<h2>Drupal</h2>'                                => '-------- DRUPAL ' . str_repeat("-", 62) . "\n\n",
+      '<h3>Drupal</h3>'                                => '.... Drupal' . "\n\n",
+      '<h4>Drupal</h4>'                                => '.. Drupal' . "\n\n" ,
+      '<h5>Drupal</h5>'                                => 'Drupal' . "\n\n",
+      '<h6>Drupal</h6>'                                => 'Drupal' . "\n\n",
+      'Drupal<hr>'                                     => 'Drupal' . "\n" . str_repeat("-", 78) . "\n",
+      'Drupal<hr>Drupal'                               => 'Drupal' . "\n" . str_repeat("-", 78) . "\n" . 'Drupal' . "\n",
+      // Tests malformed HTML tags.
+      'Drupal<br>Drupal'                               => 'Drupal' . "\n" . 'Drupal' . "\n",
+      '<ul><li>Drupal<li>Drupal</ul>'                  => ' * Drupal' . "\n" . ' * Drupal' . "\n\n",
+      '<ol><li>Drupal<li>Drupal</ol>'                  => ' 1) Drupal' . "\n" . ' 2) Drupal' . "\n\n",
+      // Tests some unsupported HTML tags.
+      '<div>Drupal</div>'                              => 'Drupal' . "\n",
+      '<html>Drupal</html>'                            => 'Drupal' . "\n",
+      '<script type="text/javascript">Drupal</script>' => 'Drupal' . "\n",
+    );
+
+    foreach ($drupal_html_to_text_cases as $html_string => $expected_text) {
+      $result = drupal_html_to_text($html_string);
+      $this->assertEqual($result, $expected_text, t('drupal_html_to_text(@func_call ...)', array('@func_call' => drupal_substr($html_string, 0, 15))));
+    }
+  }
+
+  /**
+   * Test drupal_html_to_text() with a full e-mail example.
+   */
+  function testDrupalHtmlToTextFull() {
+    // HTML code to test.
+    $html = <<<EOS
+<h1>Testing headline</h1>
+
+<h2>Sub-headline</h2>
+
+<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, <a href="http://drupal.org">quis nostrud exercitation</a> ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+<blockquote>
+  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+  <ul>
+    <li>Unordered List item</li>
+    <li>List item</li>
+    <li>List item that is really long. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+    </li>
+    <li>List item</li>
+  </ul>
+
+  <blockquote>
+    <ol>
+      <li>Ordered List item</li>
+      <li>List item</li>
+      <li><p>List item that is really long. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        <blockquote>
+        <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure</p>
+        <hr />
+        <p>Dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </blockquote>
+      </li>
+      <li>List item</li>
+    </ol>
+  </blockquote>
+</blockquote>
+
+<h2><a href="http://drupal.org/user">Testing linked headline</a></h2>
+
+<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+
+<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+<dl>
+  <dt>Definition list item</dt>
+  <dd>Definition list body Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.</dd>
+  <dt>Definition list item</dt>
+  <dd>Definition list body Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.</dd>
+</dl>
+
+<h2>Really really long sub-headline lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.</h2>
+
+<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+EOS;
+    // The expected result after drupal_html_to_text($html).
+    // Trailing white-space is required to match the output of drupal_html_to_text().
+    $expected_result =<<< EOS
+======== TESTING HEADLINE ====================================================
+
+-------- SUB-HEADLINE --------------------------------------------------------
+
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod  
+tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,  
+quis nostrud exercitation [1] ullamco laboris nisi ut aliquip ex ea commodo  
+consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse  
+cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non  
+proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod  
+>tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,  
+>quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo  
+>consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse  
+>cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat  
+>non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+>
+> * Unordered List item
+> * List item
+> * List item that is really long. Lorem ipsum dolor sit amet, consectetur
+>   adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore
+>   magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
+>   laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
+>   reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+>   pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa
+>   qui officia deserunt mollit anim id est laborum.
+> * List item
+>
+>> 1) Ordered List item
+>> 2) List item
+>> 3) List item that is really long. Lorem ipsum dolor sit amet, consectetur
+>>    adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore
+>>    magna aliqua.
+>>    
+>>     "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+>>      nisi ut aliquip ex ea commodo consequat. Duis aute irure
+>>      
+>>      ----------------------------------------------------------------------
+>>      Dolor in reprehenderit in voluptate velit esse cillum dolore eu
+>>      fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+>>      proident, sunt in culpa qui officia deserunt mollit anim id est
+>>      laborum."
+>>    
+>> 4) List item
+>>
+-------- TESTING LINKED HEADLINE [2] -----------------------------------------
+
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod  
+tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,  
+quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo  
+consequat.
+
+Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore  
+eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,  
+sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+Definition list item
+    Definition list body Lorem ipsum dolor sit amet, consectetur adipisicing
+    elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+    ut.
+Definition list item
+    Definition list body Lorem ipsum dolor sit amet, consectetur adipisicing
+    elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+    ut.
+
+-------- REALLY REALLY LONG SUB-HEADLINE LOREM IPSUM DOLOR SIT AMET,
+         CONSECTETUR ADIPISICING ELIT, SED DO EIUSMOD TEMPOR INCIDIDUNT UT
+         LABORE ET DOLORE MAGNA ALIQUA. UT ENIM AD MINIM VENIAM. -------------
+
+Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore  
+eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,  
+sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+[1] http://drupal.org
+[2] http://drupal.org/user
+
+EOS;
+
+    $result = drupal_html_to_text($html);
+    $this->assertEqual($result, $expected_result, t('Test drupal_html_to_text() with a long HTML e-mail.'));
+  }
+
+  /**
+   * Test $allowed_tags argument of drupal_html_to_text().
+   */
+  function testDrupalHtmlToTextArgs() {
+    // The second parameter of drupal_html_to_text() overrules the allowed tags.
+    $result = drupal_html_to_text('<b>Drupal</b>', array('b'));
+    $this->assertEqual($result, '*Drupal*' . "\n", t('Tests drupal_html_to_text() basic working of the parameter $allowed_tags.'));
+
+    $result = drupal_html_to_text('<h1>Drupal</h1>', array('b'));
+    $this->assertEqual($result, 'Drupal' . "\n", t('Tests drupal_html_to_text() basic working of the parameter $allowed_tags.'));
+
+    $result = drupal_html_to_text('<b>Drupal</b>', array('a', 'br', 'h1'));
+    $this->assertEqual($result, 'Drupal' . "\n", t('Tests drupal_html_to_text() with a limited array of allowed tags.'));
+  }
+}
\ No newline at end of file
Index: modules/simpletest/simpletest.info
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.info,v
retrieving revision 1.6
diff -u -p -r1.6 simpletest.info
--- modules/simpletest/simpletest.info	8 Jun 2009 09:23:53 -0000	1.6
+++ modules/simpletest/simpletest.info	16 Jun 2009 20:43:53 -0000
@@ -22,6 +22,7 @@ files[] = tests/file.test
 files[] = tests/form.test
 files[] = tests/graph.test
 files[] = tests/image.test
+files[] = tests/mail.test
 files[] = tests/menu.test
 files[] = tests/module.test
 files[] = tests/registry.test
