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	27 May 2009 17:34:08 -0000
@@ -0,0 +1,231 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Test for mail.inc.
+ */
+
+class MailIncTestCase extends DrupalUnitTestCase {
+  function getInfo() {
+    return array(
+      'name'  => t('HTML to Text Filter'),
+      'description' => t('Test mail.inc function drupal_html_to_text().'),
+      'group' => t('Mail'),
+    );
+  }
+
+  /**
+   * Test all supported tags of html_to_text().
+   */
+  function testDrupalHtmlToText() {
+    $html_to_text_cases = array(
+      // Tests for 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 for 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 ($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))));
+    }
+  }
+
+  /**
+   * Tests html_to_text() with a full mail example.
+   */
+  function testDrupalHtmlToTextFull() {
+    // This is the 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 html_to_text($html).
+     * Do not remove the trailing whitespaces, as these are generated, and
+     * will otherwise fail this test.
+     */
+    $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 of drupal_html_to_text() with a long html text.'));
+  }
+
+  /**
+   * Test $allowed_tags argument of html_to_text().
+   */
+  function testDrupalHtmlToTextArgs() {
+    // The second parameter of 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() for the 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() for the exclusion of the tags not given by the parameter $allowed_tags.'));
+
+    $result = drupal_html_to_text('<b>Drupal</b>', array('a', 'br'));
+    $this->assertEqual($result, 'Drupal' . "\n", t('Tests drupal_html_to_text() with a limited array of allowed tags.'));
+  }
+}
