MDL-35206 Fix the links list enumeration in the html2text library
[moodle.git] / lib / tests / html2text_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Tests our html2text hacks
19  *
20  * Note: includes original tests from testweblib.php
21  *
22  * @package    core
23  * @category   phpunit
24  * @copyright  2012 Petr Skoda {@link http://skodak.org}
25  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26  */
29 defined('MOODLE_INTERNAL') || die();
32 class html2text_testcase extends basic_testcase {
34     /**
35      * ALT as image replacements
36      */
37     public function test_images() {
38         $this->assertEquals('[edit]', html_to_text('<img src="edit.png" alt="edit" />'));
40         $text = 'xx<img src="gif.gif" alt="some gif" />xx';
41         $result = html_to_text($text, null, false, false);
42         $this->assertSame($result, 'xx[some gif]xx');
43     }
45     /**
46      * No magic quotes messing
47      */
48     public function test_no_strip_slashes() {
49         $this->assertEquals('[\edit]', html_to_text('<img src="edit.png" alt="\edit" />'));
51         $text = '\\magic\\quotes\\are\\\\horrible';
52         $result = html_to_text($text, null, false, false);
53         $this->assertSame($result, $text);
54     }
56     /**
57      * Textlib integration
58      */
59     public function test_textlib() {
60         $text = '<strong>Žluťoučký koníček</strong>';
61         $result = html_to_text($text, null, false, false);
62         $this->assertSame($result, 'ŽLUŤOUČKÝ KONÍČEK');
63     }
65     /**
66      * Protect 0
67      */
68     public function test_zero() {
69         $text = '0';
70         $result = html_to_text($text, null, false, false);
71         $this->assertSame($result, $text);
73         $this->assertSame('0', html_to_text('0'));
74     }
76     /**
77      * Test the links list enumeration.
78      */
79     public function test_build_link_list() {
81         // Note the trailing whitespace left intentionally in the text.
82         $text = 'Total of <a title="List of integrated issues"
83             href="http://tr.mdl.org/sh.jspa?r=1&j=p+%3D+%22I+d%22+%3D">     
84             <strong>27 issues</strong></a> and <a href="http://another.url/?f=a&amp;b=2">some</a> other
85 have been fixed <strong><a href="http://third.url/view.php">last week</a></strong>';
87         // Do not collect links.
88         $result = html_to_text($text, 5000, false);
89         $this->assertSame('Total of 27 ISSUES and some other have been fixed LAST WEEK', $result);
91         // Collect and enumerate links.
92         $result = html_to_text($text, 5000, true);
93         $this->assertSame(0, strpos($result, 'Total of 27 ISSUES [1] and some [2] other have been fixed LAST WEEK [3]'));
94         $this->assertSame(false, strpos($result, '[0]'));
95         $this->assertSame(1, preg_match('|^'.preg_quote('[1] http://tr.mdl.org/sh.jspa?r=1&j=p+%3D+%22I+d%22+%3D').'$|m', $result));
96         $this->assertSame(1, preg_match('|^'.preg_quote('[2] http://another.url/?f=a&amp;b=2').'$|m', $result));
97         $this->assertSame(1, preg_match('|^'.preg_quote('[3] http://third.url/view.php').'$|m', $result));
98         $this->assertSame(false, strpos($result, '[4]'));
99     }
101     // ======= Standard html2text conversion features =======
103     /**
104      * Various invalid HTML typed by users that ignore html strict
105      **/
106     public function test_invalid_html() {
107         $text = 'Gin & Tonic';
108         $result = html_to_text($text, null, false, false);
109         $this->assertSame($result, $text);
111         $text = 'Gin > Tonic';
112         $result = html_to_text($text, null, false, false);
113         $this->assertSame($result, $text);
115         $text = 'Gin < Tonic';
116         $result = html_to_text($text, null, false, false);
117         $this->assertSame($result, $text);
118     }
120     /**
121      * Basic text formatting.
122      */
123     public function test_simple() {
124         $this->assertEquals("_Hello_ WORLD!", html_to_text('<p><i>Hello</i> <b>world</b>!</p>'));
125         $this->assertEquals("All the WORLD’S a stage.\n\n-- William Shakespeare", html_to_text('<p>All the <strong>world’s</strong> a stage.</p><p>-- William Shakespeare</p>'));
126         $this->assertEquals("HELLO WORLD!\n\n", html_to_text('<h1>Hello world!</h1>'));
127         $this->assertEquals("Hello\nworld!", html_to_text('Hello<br />world!'));
128     }
130     /**
131      * Test line wrapping
132      */
133     public function test_text_nowrap() {
134         $long = "Here is a long string, more than 75 characters long, since by default html_to_text wraps text at 75 chars.";
135         $wrapped = "Here is a long string, more than 75 characters long, since by default\nhtml_to_text wraps text at 75 chars.";
136         $this->assertEquals($long, html_to_text($long, 0));
137         $this->assertEquals($wrapped, html_to_text($long));
138     }
140     /**
141      * Whitespace removal
142      */
143     public function test_trailing_whitespace() {
144         $this->assertEquals('With trailing whitespace and some more text', html_to_text("With trailing whitespace   \nand some   more text", 0));
145     }
147     /**
148      * PRE parsing
149      */
150     public function test_html_to_text_pre_parsing_problem() {
151         $strorig = 'Consider the following function:<br /><pre><span style="color: rgb(153, 51, 102);">void FillMeUp(char* in_string) {'.
152             '<br />  int i = 0;<br />  while (in_string[i] != \'\0\') {<br />    in_string[i] = \'X\';<br />    i++;<br />  }<br />'.
153             '}</span></pre>What would happen if a non-terminated string were input to this function?<br /><br />';
155         $strconv = 'Consider the following function:
157 void FillMeUp(char* in_string) {
158  int i = 0;
159  while (in_string[i] != \'\0\') {
160  in_string[i] = \'X\';
161  i++;
162  }
164 What would happen if a non-terminated string were input to this function?
166 ';
168         $this->assertSame($strconv, html_to_text($strorig));
169     }