Index: modules/simpletest/tests/mail.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/mail.test,v
retrieving revision 1.5
diff -u -p -r1.5 mail.test
--- modules/simpletest/tests/mail.test	5 Aug 2010 23:53:38 -0000	1.5
+++ modules/simpletest/tests/mail.test	31 Aug 2010 20:36:44 -0000
@@ -64,3 +64,297 @@ class MailTestCase extends DrupalWebTest
   }
 }
 
+/**
+ * Unit tests for drupal_html_to_text().
+ */
+class DrupalHtmlToTextTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'HTML to text conversion',
+      'description' => 'Tests drupal_html_to_text().',
+      'group' => 'Mail',
+    );
+  }
+
+  /**
+   * Test all supported tags of drupal_html_to_text().
+   */
+  function testTags() {
+    $tests = array(
+      '<a href = "http://drupal.org">Drupal.org</a>' => 'Drupal.org [1]
+
+[1] http://drupal.org
+',
+      '<em>Drupal</em>' => '/Drupal/',
+      '<i>Drupal</i>' => '/Drupal/',
+      '<strong>Drupal</strong>' => '*Drupal*',
+      '<b>Drupal</b>' => '*Drupal*',
+      'Drupal<br />Drupal' => 'Drupal
+Drupal',
+      '<p>Drupal</p>' => 'Drupal
+
+',
+      '<blockquote>Drupal</blockquote>' => '> Drupal
+',
+      '<ul>Drupal</ul>' => 'Drupal
+
+',
+      '<ul><li>Drupal</li></ul>' => ' * Drupal
+
+',
+      '<ul><li>Drupal</li><li>Drupal</li></ul>' => ' * Drupal
+ * Drupal
+
+',
+      '<ol>Drupal</ol>' => 'Drupal
+
+',
+      '<ol><li>Drupal</li></ol>' => ' 1) Drupal
+
+',
+      '<ol><li>Drupal</li><li>Drupal</li></ol>' => ' 1) Drupal
+ 2) Drupal
+
+',
+      '<ul><li>Drupal</li><li><ol><li>Drupal</li><li>Drupal</li></ol></li></ul>' => ' * Drupal
+ *  1) Drupal
+    2) Drupal
+    
+
+',
+      '<ol><li>Drupal</li><li><ul><li>Drupal</li><li>Drupal</li></ul></li></ol>' => ' 1) Drupal
+ 2)  * Drupal
+     * Drupal
+    
+
+',
+      '<dl>Drupal</dl>' => 'Drupal
+
+',
+      '<dt>Drupal</dt>' => 'Drupal
+',
+      '<dl><dt>Drupal</dl>' => 'Drupal
+
+
+',
+      '<dl><dt>Drupal<dd>Drupal</dl>' => 'Drupal
+    Drupal
+
+',
+      '<dl><dt>Drupal</dt><dd>Drupal</dd></dl>' => 'Drupal
+    Drupal
+
+',
+      '<h1>Drupal</h1>' => '======== DRUPAL ' . str_repeat('=', 62) . "\n\n",
+      '<h2>Drupal</h2>' => '-------- DRUPAL ' . str_repeat('-', 62) . "\n\n",
+      '<h3>Drupal</h3>' => '.... Drupal
+
+',
+      '<h4>Drupal</h4>' => '.. Drupal
+
+',
+      '<h5>Drupal</h5>' => 'Drupal
+
+',
+      '<h6>Drupal</h6>' => 'Drupal
+
+',
+      'Drupal<hr />' => "Drupal\n" . str_repeat('-', 78) . "\n",
+      'Drupal<hr>Drupal' => "Drupal\n" . str_repeat('-', 78) . "\nDrupal",
+      // Tests malformed HTML tags.
+      'Drupal<br>Drupal' => 'Drupal
+Drupal',
+      '<ul><li>Drupal<li>Drupal</ul>' => ' * Drupal
+ * Drupal
+
+',
+      '<ol><li>Drupal<li>Drupal</ol>' => ' 1) Drupal
+ 2) Drupal
+
+',
+      '<ul><li>Drupal<li>Drupal</ol>' => ' * Drupal
+ * Drupal
+
+',
+      // Tests some unsupported HTML tags.
+      '<div>Drupal</div>' => 'Drupal',
+      '<html>Drupal</html>' => 'Drupal',
+      '<script type="text/javascript">Drupal</script>' => 'Drupal',
+    );
+
+    foreach ($tests as $html => $text) {
+      $result = drupal_html_to_text($html);
+      $this->assertEqual($result, $text, t('@html:<br />!first<br />is equal to<br />!second', array(
+        '@html' => var_export($html, TRUE),
+        '!first' => nl2br(check_plain(var_export($result, TRUE))),
+        '!second' => nl2br(check_plain(var_export($text, TRUE))),
+      )));
+    }
+  }
+
+  /**
+   * 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>
+
+<p>
+A second paragraph.
+</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).
+    $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.
+
+A second paragraph.
+
+> 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('HTML document properly converted to text.'));
+  }
+
+  /**
+   * 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*', t('Allowed tag found.'));
+
+    $result = drupal_html_to_text('<h1>Drupal</h1>', array('b'));
+    $this->assertEqual($result, 'Drupal', t('Disallowed tag not found.'));
+
+    $result = drupal_html_to_text('<b>Drupal</b>', array('a', 'br', 'h1'));
+    $this->assertEqual($result, 'Drupal', t('Disallowed tags not found.'));
+  }
+}
