Make the tests build again.
[grantlee:grantlee.git] / tests / htmlbuildertest.cpp
1 /*
2     This file is part of KDE.
3
4     Copyright (c) 2008 Stephen Kelly <steveire@gmail.com>
5
6     This library is free software; you can redistribute it and/or modify it
7     under the terms of the GNU Library General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or (at your
9     option) any later version.
10
11     This library is distributed in the hope that it will be useful, but WITHOUT
12     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
14     License for more details.
15
16     You should have received a copy of the GNU Library General Public License
17     along with this library; see the file COPYING.LIB.  If not, write to the
18     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19     02110-1301, USA.
20 */
21
22 #include <QtTest>
23 #include <QtCore>
24 #include <qtest_kde.h>
25 #include <qtestevent.h>
26 #include <QRegExp>
27 #include <QTextCursor>
28 #include <QTextDocument>
29 #include <QTextEdit>
30
31 #include "markupdirector.h"
32 #include "texthtmlbuilder.h"
33
34 using namespace Grantlee;
35
36 class TestHtmlOutput: public QObject
37 {
38     Q_OBJECT
39 private slots:
40
41 // Test paragraph contents:
42     void testSingleFormat();
43     void testDoubleFormat();
44     void testDoubleStartDifferentFinish();
45     void testDoubleStartDifferentFinishReverseOrder();
46     void testDifferentStartDoubleFinish();
47     void testDifferentStartDoubleFinishReverseOrder();
48     void testOverlap();
49     void testAnchor();
50     void testAnchorWithFormattedContent();
51     void testAdjacentAnchors();
52     void testNestedFormatting();
53     void testSpan();
54     void testDoubleSpan();
55     void testSpanNesting();
56     void testEdgeCaseLeft();
57     void testEdgeCaseRight();
58     void testImage();
59     void testImageResized();
60     void testEachFormatTagSingly();
61     void testHorizontalRule();
62     void testNewlines();
63     void testEmptyParagraphs();
64     void testNewlinesThroughQTextEdit();
65     void testBrInsideParagraph();
66
67 };
68
69 void TestHtmlOutput::testSingleFormat()
70 {
71     QTextDocument *doc = new QTextDocument();
72
73     // One format
74     doc->setHtml("This <b>text</b> is bold.");
75
76     TextHtmlOutputter outputter;
77     outputter.processDocument( doc );
78     QString result = outputter.getResult();
79     QRegExp regex(QString("^<p>This <strong>text</strong> is bold.</p>\\n$"));
80
81     QVERIFY(regex.exactMatch(result));
82
83 }
84
85 void TestHtmlOutput::testDoubleFormat()
86 {
87     QTextDocument *doc = new QTextDocument();
88
89     // One format
90     doc->setHtml("Some <b><i>formatted</i></b> text.");
91
92     TextHtmlOutputter outputter;
93     outputter.processDocument( doc );
94     QString result = outputter.getResult();
95     QRegExp regex(QString("^<p>Some (<strong><em>|<em><strong>)formatted(</em></strong>|</strong></em>) text.</p>\\n$"));
96
97     QVERIFY(regex.exactMatch(result));
98
99 }
100
101 void TestHtmlOutput::testAnchor()
102 {
103     QTextDocument *doc = new QTextDocument();
104     doc->setHtml("A <a href=\"http://www.kde.org\">link</a> to KDE.");
105
106     TextHtmlOutputter outputter;
107     outputter.processDocument( doc );
108     QString result = outputter.getResult();
109
110     QRegExp regex(QString("^<p>A <a href=\"http://www.kde.org\">link</a> to KDE.</p>\\n$"));
111
112     QVERIFY(regex.exactMatch(result));
113
114 }
115
116 void TestHtmlOutput::testAnchorWithFormattedContent()
117 {
118     QTextDocument *doc = new QTextDocument();
119     doc->setHtml("A <a href=\"http://www.kde.org\"><b>formatted</b> link</a> to KDE.");
120
121     TextHtmlOutputter outputter;
122     outputter.processDocument( doc );
123     QString result = outputter.getResult();
124
125 //     kDebug() << result;
126
127     QRegExp regex(QString("^<p>A <a href=\"http://www.kde.org\"><strong>formatted</strong> link</a> to KDE.</p>\\n$"));
128
129     QVERIFY(regex.exactMatch(result));
130
131 }
132
133 void TestHtmlOutput::testAdjacentAnchors()
134 {
135     QTextDocument *doc = new QTextDocument();
136     doc->setHtml("Two <a href=\"http://www.kde.org\">links</a><a href=\"http://www.google.com\">next</a> to eachother.");
137
138     TextHtmlOutputter outputter;
139     outputter.processDocument( doc );
140     QString result = outputter.getResult();
141
142     QRegExp regex(QString("^<p>Two <a href=\"http://www.kde.org\">links</a><a href=\"http://www.google.com\">next</a> to eachother.</p>\\n$"));
143
144     QVERIFY(regex.exactMatch(result));
145 }
146
147 void TestHtmlOutput::testNestedFormatting()
148 {
149     QTextDocument *doc = new QTextDocument();
150     doc->setHtml("This <b>text is <i>italic</i> and</b> bold.");
151
152     TextHtmlOutputter outputter;
153     outputter.processDocument( doc );
154     QString result = outputter.getResult();
155
156     QRegExp regex(QString("^<p>This <strong>text is <em>italic</em> and</strong> bold.</p>\\n$"));
157
158     QVERIFY(regex.exactMatch(result));
159 }
160
161 void TestHtmlOutput::testSpan()
162 {
163     QTextDocument *doc = new QTextDocument();
164     doc->setHtml("Some <span style=\"color:#ff0000;\">formatted</span> text.");
165
166     TextHtmlOutputter outputter;
167     outputter.processDocument( doc );
168     QString result = outputter.getResult();
169
170     QRegExp regex = QRegExp("^<p>Some <span style=\"color:#ff0000;\">formatted</span> text.</p>\\n$");
171
172     QVERIFY(regex.exactMatch(result));
173 }
174
175 void TestHtmlOutput::testDoubleSpan()
176 {
177     QTextDocument *doc = new QTextDocument();
178     doc->setHtml("Some <span style=\"color:#ff0000;background-color:#00ff00;\">formatted</span> text.");
179
180     TextHtmlOutputter outputter;
181     outputter.processDocument( doc );
182     QString result = outputter.getResult();
183
184     QRegExp regex = QRegExp("^<p>Some <span style=\"(color:#ff0000|background-color:#00ff00);\"><span style=\"(color:#ff0000|background-color:#00ff00);\">formatted</span></span> text.</p>\\n$");
185
186     QVERIFY(regex.exactMatch(result));
187
188 }
189
190 void TestHtmlOutput::testSpanNesting()
191 {
192     QTextDocument *doc = new QTextDocument();
193     doc->setHtml("Paragraph <span style=\"background-color:#00ff00;\">with some <span style=\"color:#ff0000;\">formatted</span> nested</span> text.");
194
195     TextHtmlOutputter outputter;
196     outputter.processDocument( doc );
197     QString result = outputter.getResult();
198
199     QRegExp regex = QRegExp("^<p>Paragraph <span style=\"background-color:#00ff00;\">with some <span style=\"color:#ff0000;\">formatted</span> nested</span> text.</p>\\n$");
200
201     QVERIFY(regex.exactMatch(result));
202 }
203
204 void TestHtmlOutput::testDoubleStartDifferentFinish()
205 {
206     QTextDocument *doc = new QTextDocument();
207     doc->setHtml("Paragraph <i><b>with</b> some formatted</i> text.");
208
209     TextHtmlOutputter outputter;
210     outputter.processDocument( doc );
211     QString result = outputter.getResult();
212
213     QRegExp regex = QRegExp("^<p>Paragraph <em><strong>with</strong> some formatted</em> text.</p>\\n$");
214
215     QVERIFY(regex.exactMatch(result));
216 }
217
218 void TestHtmlOutput::testDoubleStartDifferentFinishReverseOrder()
219 {
220     QTextDocument *doc = new QTextDocument();
221     doc->setHtml("Paragraph <b><i>with</i> some formatted</b> text.");
222
223     TextHtmlOutputter outputter;
224     outputter.processDocument( doc );
225     QString result = outputter.getResult();
226
227     QRegExp regex = QRegExp("^<p>Paragraph <strong><em>with</em> some formatted</strong> text.</p>\\n$");
228
229     QVERIFY(regex.exactMatch(result));
230
231 }
232
233 void TestHtmlOutput::testDifferentStartDoubleFinish()
234 {
235     QTextDocument *doc = new QTextDocument();
236     doc->setHtml("Paragraph <i>with some <b>formatted<b></i> text.");
237
238     TextHtmlOutputter outputter;
239     outputter.processDocument( doc );
240     QString result = outputter.getResult();
241
242     QRegExp regex = QRegExp("^<p>Paragraph <em>with some <strong>formatted</strong></em> text.</p>\\n$");
243
244     QVERIFY(regex.exactMatch(result));
245 }
246
247 void TestHtmlOutput::testDifferentStartDoubleFinishReverseOrder()
248 {
249     QTextDocument *doc = new QTextDocument();
250     doc->setHtml("Paragraph <b>with some <i>formatted</i></b> text.");
251
252     TextHtmlOutputter outputter;
253     outputter.processDocument( doc );
254     QString result = outputter.getResult();
255
256     QRegExp regex = QRegExp("^<p>Paragraph <strong>with some <em>formatted</em></strong> text.</p>\\n$");
257
258     QVERIFY(regex.exactMatch(result));
259
260 }
261
262 void TestHtmlOutput::testOverlap()
263 {
264     QTextDocument *doc = new QTextDocument();
265     doc->setHtml("Paragraph <b>with <i>some</i></b><i> formatted</i> text.");
266
267     TextHtmlOutputter outputter;
268     outputter.processDocument( doc );
269     QString result = outputter.getResult();
270
271     QRegExp regex = QRegExp("^<p>Paragraph <strong>with <em>some</em></strong><em> formatted</em> text.</p>\\n$");
272
273     QVERIFY(regex.exactMatch(result));
274
275 }
276
277 void TestHtmlOutput::testEdgeCaseLeft()
278 {
279     QTextDocument *doc = new QTextDocument();
280     doc->setHtml("Paragraph <b>with some formatted text.</b>");
281
282     TextHtmlOutputter outputter;
283     outputter.processDocument( doc );
284     QString result = outputter.getResult();
285
286     QRegExp regex = QRegExp("^<p>Paragraph <strong>with some formatted text.</strong></p>\\n$");
287
288     QVERIFY(regex.exactMatch(result));
289 }
290
291 void TestHtmlOutput::testEdgeCaseRight()
292 {
293     QTextDocument *doc = new QTextDocument();
294     doc->setHtml("<b>Paragraph with some formatted</b> text.");
295
296     TextHtmlOutputter outputter;
297     outputter.processDocument( doc );
298     QString result = outputter.getResult();
299
300     QRegExp regex = QRegExp("^<p><strong>Paragraph with some formatted</strong> text.</p>\\n$");
301
302     QVERIFY(regex.exactMatch(result));
303 }
304
305 void TestHtmlOutput::testImage()
306 {
307     QTextDocument *doc = new QTextDocument();
308     doc->setHtml("Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" /> image.");
309
310     TextHtmlOutputter outputter;
311     outputter.processDocument( doc );
312     QString result = outputter.getResult();
313
314     QRegExp regex = QRegExp("^<p>Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" /> image.</p>\\n$");
315
316     QVERIFY(regex.exactMatch(result));
317 }
318
319 void TestHtmlOutput::testImageResized()
320 {
321     QString result;
322     QRegExp regex;
323     QTextDocument *doc = new QTextDocument();
324
325     // width
326     doc->setHtml("Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" width=\"10\" /> image.");
327
328     TextHtmlOutputter outputter;
329     outputter.processDocument( doc );
330     result = outputter.getResult();
331
332     regex = QRegExp("^<p>Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" width=\"10\" /> image.</p>\\n$");
333     QVERIFY(regex.exactMatch(result));
334
335     // height
336     doc->setHtml("Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" height=\"10\" /> image.");
337
338     outputter.processDocument( doc );
339     result = outputter.getResult();
340
341     regex = QRegExp("^<p>Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" height=\"10\" /> image.</p>\\n$");
342     QVERIFY(regex.exactMatch(result));
343
344     // height and width
345     doc->setHtml("Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" height=\"10\" width=\"10\" /> image.");
346
347     outputter.processDocument( doc );
348     result = outputter.getResult();
349
350     regex = QRegExp("^<p>Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" width=\"10\" height=\"10\" /> image.</p>\\n$");
351
352     QVERIFY(regex.exactMatch(result));
353 }
354
355 void TestHtmlOutput::testEachFormatTagSingly()
356 {
357     QString result;
358     QRegExp regex;
359     QTextDocument *doc = new QTextDocument();
360
361     TextHtmlOutputter outputter;
362
363     // Test bold
364     doc->setHtml("Some <b>formatted</b> text.");
365     outputter.processDocument( doc );
366     result = outputter.getResult();
367
368     regex = QRegExp("^<p>Some <strong>formatted</strong> text.</p>\\n$");
369     QVERIFY(regex.exactMatch(result));
370
371
372     // Test Italic
373     doc->setHtml("Some <i>formatted</i> text.");
374     outputter.processDocument( doc );
375     result = outputter.getResult();
376
377     regex = QRegExp("^<p>Some <em>formatted</em> text.</p>\\n$");
378     QVERIFY(regex.exactMatch(result));
379
380     // Test Underline
381     doc->setHtml("Some <u>formatted</u> text.");
382     outputter.processDocument( doc );
383     result = outputter.getResult();
384
385     regex = QRegExp("^<p>Some <u>formatted</u> text.</p>\\n$");
386     QVERIFY(regex.exactMatch(result));
387
388     // Test Strikeout
389     doc->setHtml("Some <s>formatted</s> text.");
390     outputter.processDocument( doc );
391     result = outputter.getResult();
392
393     regex = QRegExp("^<p>Some <s>formatted</s> text.</p>\\n$");
394     QVERIFY(regex.exactMatch(result));
395
396     // Test Superscript
397     doc->setHtml("Some <sup>formatted</sup> text.");
398     outputter.processDocument( doc );
399     result = outputter.getResult();
400
401     regex = QRegExp("^<p>Some <sup>formatted</sup> text.</p>\\n$");
402     QVERIFY(regex.exactMatch(result));
403
404     // Test Subscript
405     doc->setHtml("Some <sub>formatted</sub> text.");
406     outputter.processDocument( doc );
407     result = outputter.getResult();
408
409     regex = QRegExp("^<p>Some <sub>formatted</sub> text.</p>\\n$");
410     QVERIFY(regex.exactMatch(result));
411
412     // Test Foreground
413     doc->setHtml("Some <span style=\"color:#ff0000;\">formatted</span> text.");
414     outputter.processDocument( doc );
415     result = outputter.getResult();
416
417     regex = QRegExp("^<p>Some <span style=\"color:#ff0000;\">formatted</span> text.</p>\\n$");
418     QVERIFY(regex.exactMatch(result));
419
420
421     // Test Background
422     doc->setHtml("Some <span style=\"background-color:#ff0000;\">formatted</span> text.");
423     outputter.processDocument( doc );
424     result = outputter.getResult();
425
426     regex = QRegExp("^<p>Some <span style=\"background-color:#ff0000;\">formatted</span> text.</p>\\n$");
427     QVERIFY(regex.exactMatch(result));
428
429     // Test Font Family
430     doc->setHtml("Some <span style=\"font-family:courier;\">formatted</span> text.");
431     outputter.processDocument( doc );
432     result = outputter.getResult();
433
434     regex = QRegExp("^<p>Some <span style=\"font-family:courier;\">formatted</span> text.</p>\\n$");
435     QVERIFY(regex.exactMatch(result));
436
437     // Test Font Size
438     doc->setHtml("Some <span style=\"font-size:20pt;\">formatted</span> text.");
439     outputter.processDocument( doc );
440     result = outputter.getResult();
441
442     regex = QRegExp("^<p>Some <span style=\"font-size:20pt;\">formatted</span> text.</p>\\n$");
443     QVERIFY(regex.exactMatch(result));
444
445 }
446
447 void TestHtmlOutput::testHorizontalRule()
448 {
449     QTextDocument *doc = new QTextDocument();
450     doc->setHtml("<p style=\"margin-top:0;margin-bottom:0;\">Foo</p><hr /><p style=\"margin-top:0;margin-bottom:0;\">Bar</p>");
451
452     TextHtmlOutputter outputter;
453     outputter.processDocument( doc );
454     QString result = outputter.getResult();
455
456     QRegExp regex = QRegExp("^<p>Foo</p>\\n<hr />\\n<p>Bar</p>\\n$");
457
458     QVERIFY(regex.exactMatch(result));
459 }
460
461 void TestHtmlOutput::testNewlines()
462 {
463     QTextDocument *doc = new QTextDocument();
464     doc->setHtml("<p>Foo</p>\n<br /><br />\n<p>Bar</p>");
465
466     TextHtmlOutputter outputter;
467     outputter.processDocument( doc );
468     QString result = outputter.getResult();
469
470     QRegExp regex = QRegExp("^<p>Foo</p>\\n<br />\\n<br />\\n<p>Bar</p>\\n$");
471
472     QVERIFY(regex.exactMatch(result));
473 }
474
475 void TestHtmlOutput::testEmptyParagraphs()
476 {
477     QTextDocument *doc = new QTextDocument();
478     doc->setHtml("<p>Foo</p>\n<br /><br />\n<p>Bar</p>");
479
480     TextHtmlOutputter outputter;
481     outputter.processDocument( doc );
482     QString result = outputter.getResult();
483
484     QRegExp regex = QRegExp("^<p>Foo</p>\\n<br />\\n<br />\\n<p>Bar</p>\\n$");
485
486     QVERIFY(regex.exactMatch(result));
487 }
488
489 void TestHtmlOutput::testNewlinesThroughQTextEdit()
490 {
491
492     QTextEdit *te = new QTextEdit();
493     QTextCursor cursor = te->textCursor();
494     cursor.movePosition(QTextCursor::Start);
495     cursor.insertText("Foo");
496     cursor.insertText("\n");
497     cursor.insertText("\n");
498     cursor.insertText("\n");
499     cursor.insertText("Bar");
500
501     TextHtmlOutputter outputter;
502     outputter.processDocument( te->document() );
503     QString result = outputter.getResult();
504
505     QRegExp regex = QRegExp("^<p>Foo</p>\\n<br />\\n<br />\\n<p>Bar</p>\\n$");
506
507     QVERIFY(regex.exactMatch(result));
508 }
509
510 void TestHtmlOutput:: testBrInsideParagraph()
511 {
512
513     QTextDocument *doc = new QTextDocument();
514     doc->setHtml("<p>Foo<br /><br /><br />Bar</p>");
515
516     TextHtmlOutputter outputter;
517     outputter.processDocument( doc );
518     QString result = outputter.getResult();
519
520     // Two paragraphs separated by two line breaks
521
522     QRegExp regex = QRegExp("^<p>Foo</p>\\n<br />\\n<br />\\n<p>Bar</p>\\n$");
523
524     QVERIFY(regex.exactMatch(result));
525 }
526
527
528 QTEST_MAIN(TestHtmlOutput)
529 #include "htmlbuildertest.moc"