Use explicit latin1 in the tests.
[grantlee:grantlee.git] / tests / plainmarkupbuildertest.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 <qtestevent.h>
25 #include <QtCore/QRegExp>
26 #include <QtGui/QTextCursor>
27 #include <QtGui/QTextDocument>
28 #include <QtGui/QTextEdit>
29
30 #include "markupdirector.h"
31 #include "plaintextmarkupbuilder.h"
32 #include "texthtmlbuilder.h"
33
34 using namespace Grantlee;
35
36 class TestPlainMarkupOutput: public QObject
37 {
38     Q_OBJECT
39 private Q_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 TestPlainMarkupOutput::testSingleFormat()
70 {
71     QTextDocument *doc = new QTextDocument();
72
73     // One format
74     doc->setHtml( QLatin1String( "This <b>text</b> is bold." ) );
75
76     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
77     MarkupDirector *md = new MarkupDirector(hb);
78     md->processDocument(doc);
79     QString result = hb->getResult();
80     QRegExp regex(QLatin1String("^This \\*text\\* is bold.\\n$"));
81
82     QVERIFY(regex.exactMatch(result));
83
84 }
85
86 void TestPlainMarkupOutput::testDoubleFormat()
87 {
88     QTextDocument *doc = new QTextDocument();
89
90     // One format
91     doc->setHtml( QLatin1String( "Some <b><i>formatted</i></b> text." ) );
92
93     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
94     MarkupDirector *md = new MarkupDirector(hb);
95     md->processDocument(doc);
96     QString result = hb->getResult();
97     QRegExp regex(QLatin1String("^Some (\\*/|/\\*)formatted(\\*/|/\\*) text.\\n$"));
98
99     QVERIFY(regex.exactMatch(result));
100
101 }
102
103 void TestPlainMarkupOutput::testAnchor()
104 {
105     QTextDocument *doc = new QTextDocument();
106     doc->setHtml( QLatin1String( "A <a href=\"http://www.kde.org\">link</a> to KDE." ) );
107
108     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
109     MarkupDirector *md = new MarkupDirector(hb);
110     md->processDocument(doc);
111     QString result = hb->getResult();
112
113     QRegExp regex(QLatin1String("^A link\\[1\\] to KDE.\\n\\n--------\\n\\[1\\] http://www.kde.org\\n$"));
114
115     regex.exactMatch(result);
116
117
118     QVERIFY(regex.exactMatch(result));
119
120
121 }
122
123 void TestPlainMarkupOutput::testAnchorWithFormattedContent()
124 {
125     QTextDocument *doc = new QTextDocument();
126     doc->setHtml( QLatin1String( "A <a href=\"http://www.kde.org\"><b>formatted</b> link</a> to KDE." ) );
127
128     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
129     MarkupDirector *md = new MarkupDirector(hb);
130     md->processDocument(doc);
131     QString result = hb->getResult();
132
133
134     QRegExp regex(QLatin1String("^A \\*formatted\\* link\\[1\\] to KDE.\\n\\n--------\\n\\[1\\] http://www.kde.org\\n$"));
135
136     QVERIFY(regex.exactMatch(result));
137
138 }
139
140 void TestPlainMarkupOutput::testAdjacentAnchors()
141 {
142     QTextDocument *doc = new QTextDocument();
143     doc->setHtml( QLatin1String( "Two <a href=\"http://www.kde.org\">links</a><a href=\"http://www.google.com\">next</a> to eachother." ) );
144
145     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
146     MarkupDirector *md = new MarkupDirector(hb);
147     md->processDocument(doc);
148     QString result = hb->getResult();
149
150     QRegExp regex(QLatin1String("^Two links\\[1\\]next\\[2\\] to eachother.\\n\\n--------\\n\\[1\\] http://www.kde.org\\n\\[2\\] http://www.google.com\\n$"));
151
152     QVERIFY(regex.exactMatch(result));
153 }
154
155 void TestPlainMarkupOutput::testNestedFormatting()
156 {
157     QTextDocument *doc = new QTextDocument();
158     doc->setHtml( QLatin1String( "This <b>text is <i>italic</i> and</b> bold." ) );
159
160     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
161     MarkupDirector *md = new MarkupDirector(hb);
162     md->processDocument(doc);
163     QString result = hb->getResult();
164
165     QRegExp regex(QLatin1String("^This \\*text is /italic/ and\\* bold.\\n$"));
166
167     QVERIFY(regex.exactMatch(result));
168 }
169
170 void TestPlainMarkupOutput::testSpan()
171 {
172     QTextDocument *doc = new QTextDocument();
173     doc->setHtml( QLatin1String( "Some <span style=\"color:#ff0000;\">formatted</span> text." ) );
174
175     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
176     MarkupDirector *md = new MarkupDirector(hb);
177     md->processDocument(doc);
178     QString result = hb->getResult();
179
180     QRegExp regex = QRegExp( QLatin1String( "^Some formatted text.\\n$" ) );
181
182     QVERIFY(regex.exactMatch(result));
183 }
184
185 void TestPlainMarkupOutput::testDoubleSpan()
186 {
187     QTextDocument *doc = new QTextDocument();
188     doc->setHtml( QLatin1String( "Some <span style=\"color:#ff0000;background-color:#00ff00;\">formatted</span> text." ) );
189
190     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
191     MarkupDirector *md = new MarkupDirector(hb);
192     md->processDocument(doc);
193     QString result = hb->getResult();
194
195
196     QRegExp regex = QRegExp( QLatin1String( "^Some formatted text.\\n$" ) );
197
198     QVERIFY(regex.exactMatch(result));
199
200 }
201
202 void TestPlainMarkupOutput::testSpanNesting()
203 {
204     QTextDocument *doc = new QTextDocument();
205     doc->setHtml( QLatin1String( "Paragraph <span style=\"background-color:#00ff00;\">with some <span style=\"color:#ff0000;\">formatted</span> nested</span> text." ) );
206
207     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
208     MarkupDirector *md = new MarkupDirector(hb);
209     md->processDocument(doc);
210     QString result = hb->getResult();
211
212     QRegExp regex = QRegExp( QLatin1String( "^Paragraph with some formatted nested text.\\n$" ) );
213
214     QVERIFY(regex.exactMatch(result));
215 }
216
217 void TestPlainMarkupOutput::testDoubleStartDifferentFinish()
218 {
219     QTextDocument *doc = new QTextDocument();
220     doc->setHtml( QLatin1String( "Paragraph <i><b>with</b> some formatted</i> text." ) );
221
222     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
223     MarkupDirector *md = new MarkupDirector(hb);
224     md->processDocument(doc);
225     QString result = hb->getResult();
226
227     QRegExp regex = QRegExp( QLatin1String( "^Paragraph /\\*with\\* some formatted/ text.\\n$" ) );
228
229     QVERIFY(regex.exactMatch(result));
230 }
231
232 void TestPlainMarkupOutput::testDoubleStartDifferentFinishReverseOrder()
233 {
234     QTextDocument *doc = new QTextDocument();
235     doc->setHtml( QLatin1String( "Paragraph <b><i>with</i> some formatted</b> text." ) );
236
237     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
238     MarkupDirector *md = new MarkupDirector(hb);
239     md->processDocument(doc);
240     QString result = hb->getResult();
241
242     QRegExp regex = QRegExp( QLatin1String( "^Paragraph \\*/with/ some formatted\\* text.\\n$" ) );
243
244     QVERIFY(regex.exactMatch(result));
245
246 }
247
248 void TestPlainMarkupOutput::testDifferentStartDoubleFinish()
249 {
250     QTextDocument *doc = new QTextDocument();
251     doc->setHtml( QLatin1String( "Paragraph <i>with some <b>formatted<b></i> text." ) );
252
253     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
254     MarkupDirector *md = new MarkupDirector(hb);
255     md->processDocument(doc);
256     QString result = hb->getResult();
257
258     QRegExp regex = QRegExp( QLatin1String( "^Paragraph /with some \\*formatted\\*/ text.\\n$" ) );
259
260     QVERIFY(regex.exactMatch(result));
261 }
262
263 void TestPlainMarkupOutput::testDifferentStartDoubleFinishReverseOrder()
264 {
265     QTextDocument *doc = new QTextDocument();
266     doc->setHtml( QLatin1String( "Paragraph <b>with some <i>formatted</i></b> text." ) );
267
268     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
269     MarkupDirector *md = new MarkupDirector(hb);
270     md->processDocument(doc);
271     QString result = hb->getResult();
272
273
274     QRegExp regex = QRegExp( QLatin1String( "^Paragraph \\*with some /formatted/\\* text.\\n$" ) );
275
276     QVERIFY(regex.exactMatch(result));
277
278 }
279
280 void TestPlainMarkupOutput::testOverlap()
281 {
282     QTextDocument *doc = new QTextDocument();
283     doc->setHtml( QLatin1String( "Paragraph <b>with <i>some</i></b><i> formatted</i> text." ) );
284
285     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
286     MarkupDirector *md = new MarkupDirector(hb);
287     md->processDocument(doc);
288     QString result = hb->getResult();
289
290
291     QRegExp regex = QRegExp( QLatin1String( "^Paragraph \\*with /some/\\*/ formatted/ text.\\n$" ) );
292
293     QVERIFY(regex.exactMatch(result));
294
295 }
296
297 void TestPlainMarkupOutput::testEdgeCaseLeft()
298 {
299     QTextDocument *doc = new QTextDocument();
300     doc->setHtml( QLatin1String( "Paragraph <b>with some formatted text.</b>" ) );
301
302     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
303     MarkupDirector *md = new MarkupDirector(hb);
304     md->processDocument(doc);
305     QString result = hb->getResult();
306
307     QRegExp regex = QRegExp( QLatin1String( "^Paragraph \\*with some formatted text.\\*\\n$" ) );
308
309     QVERIFY(regex.exactMatch(result));
310 }
311
312 void TestPlainMarkupOutput::testEdgeCaseRight()
313 {
314     QTextDocument *doc = new QTextDocument();
315     doc->setHtml( QLatin1String( "<b>Paragraph with some formatted</b> text." ) );
316
317     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
318     MarkupDirector *md = new MarkupDirector(hb);
319     md->processDocument(doc);
320     QString result = hb->getResult();
321
322     QRegExp regex = QRegExp( QLatin1String( "^\\*Paragraph with some formatted\\* text.\\n$" ) );
323
324     QVERIFY(regex.exactMatch(result));
325 }
326
327 void TestPlainMarkupOutput::testImage()
328 {
329     QTextDocument *doc = new QTextDocument();
330     doc->setHtml( QLatin1String( "Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" /> image." ) );
331
332     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
333     MarkupDirector *md = new MarkupDirector(hb);
334     md->processDocument(doc);
335     QString result = hb->getResult();
336
337     QRegExp regex = QRegExp( QLatin1String( "^Paragraph with an inline \\[1\\] image.\\n\\n--------\\n\\[1\\] http://kde.org/img/kde41.png\\n$" ) );
338
339     QVERIFY(regex.exactMatch(result));
340 }
341
342 void TestPlainMarkupOutput::testImageResized()
343 {
344     QString result;
345     QRegExp regex;
346     PlainTextMarkupBuilder *hb;
347     MarkupDirector *md;
348     QTextDocument *doc = new QTextDocument();
349
350     // width
351     doc->setHtml( QLatin1String( "Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" width=\"10\" /> image." ) );
352
353     hb = new PlainTextMarkupBuilder();
354     md = new MarkupDirector(hb);
355     md->processDocument(doc);
356     result = hb->getResult();
357
358
359     regex = QRegExp( QLatin1String( "^Paragraph with an inline \\[1\\] image.\\n\\n--------\\n\\[1\\] http://kde.org/img/kde41.png\\n$" ) );
360     QVERIFY(regex.exactMatch(result));
361
362     // height
363     doc->setHtml( QLatin1String( "Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" height=\"10\" /> image." ) );
364
365     hb = new PlainTextMarkupBuilder();
366     md = new MarkupDirector(hb);
367     md->processDocument(doc);
368     result = hb->getResult();
369
370     regex = QRegExp( QLatin1String( "^Paragraph with an inline \\[1\\] image.\\n\\n--------\\n\\[1\\] http://kde.org/img/kde41.png\\n$" ) );
371     QVERIFY(regex.exactMatch(result));
372
373     // height and width
374     doc->setHtml( QLatin1String( "Paragraph with an inline <img src=\"http://kde.org/img/kde41.png\" height=\"10\" width=\"10\" /> image." ) );
375
376     hb = new PlainTextMarkupBuilder();
377     md = new MarkupDirector(hb);
378     md->processDocument(doc);
379     result = hb->getResult();
380
381     regex = QRegExp( QLatin1String( "^Paragraph with an inline \\[1\\] image.\\n\\n--------\\n\\[1\\] http://kde.org/img/kde41.png\\n$" ) );
382
383     QVERIFY(regex.exactMatch(result));
384 }
385
386 void TestPlainMarkupOutput::testEachFormatTagSingly()
387 {
388     QString result;
389     QRegExp regex;
390     PlainTextMarkupBuilder *hb;
391     MarkupDirector *md;
392     QTextDocument *doc = new QTextDocument();
393
394
395     // Test bold
396     doc->setHtml( QLatin1String( "Some <b>formatted</b> text." ) );
397     hb = new PlainTextMarkupBuilder();
398     md = new MarkupDirector(hb);
399     md->processDocument(doc);
400     result = hb->getResult();
401
402     regex = QRegExp( QLatin1String( "^Some \\*formatted\\* text.\\n$" ) );
403     QVERIFY(regex.exactMatch(result));
404
405
406     // Test Italic
407     doc->setHtml( QLatin1String( "Some <i>formatted</i> text." ) );
408     hb = new PlainTextMarkupBuilder();
409     md = new MarkupDirector(hb);
410     md->processDocument(doc);
411     result = hb->getResult();
412
413     regex = QRegExp( QLatin1String( "^Some /formatted/ text.\\n$" ) );
414     QVERIFY(regex.exactMatch(result));
415
416     // Test Underline
417     doc->setHtml( QLatin1String( "Some <u>formatted</u> text." ) );
418     hb = new PlainTextMarkupBuilder();
419     md = new MarkupDirector(hb);
420     md->processDocument(doc);
421     result = hb->getResult();
422
423     regex = QRegExp( QLatin1String( "^Some _formatted_ text.\\n$" ) );
424     QVERIFY(regex.exactMatch(result));
425
426     // Test Strikeout
427     doc->setHtml( QLatin1String( "Some <s>formatted</s> text." ) );
428     hb = new PlainTextMarkupBuilder();
429     md = new MarkupDirector(hb);
430     md->processDocument(doc);
431     result = hb->getResult();
432
433     regex = QRegExp( QLatin1String( "^Some -formatted- text.\\n$" ) );
434     QVERIFY(regex.exactMatch(result));
435
436     // Test Superscript
437     doc->setHtml( QLatin1String( "Some <sup>formatted</sup> text." ) );
438     hb = new PlainTextMarkupBuilder();
439     md = new MarkupDirector(hb);
440     md->processDocument(doc);
441     result = hb->getResult();
442
443     regex = QRegExp( QLatin1String( "^Some \\^\\{formatted\\} text.\\n$" ) );
444     QVERIFY(regex.exactMatch(result));
445
446     // Test Subscript
447     doc->setHtml( QLatin1String( "Some <sub>formatted</sub> text." ) );
448     hb = new PlainTextMarkupBuilder();
449     md = new MarkupDirector(hb);
450     md->processDocument(doc);
451     result = hb->getResult();
452
453     regex = QRegExp( QLatin1String( "^Some _\\{formatted\\} text.\\n$" ) );
454     QVERIFY(regex.exactMatch(result));
455
456     // Test Foreground
457     doc->setHtml( QLatin1String( "Some <span style=\"color:#ff0000;\">formatted</span> text." ) );
458     hb = new PlainTextMarkupBuilder();
459     md = new MarkupDirector(hb);
460     md->processDocument(doc);
461     result = hb->getResult();
462
463     regex = QRegExp( QLatin1String( "^Some formatted text.\\n$" ) );
464     QVERIFY(regex.exactMatch(result));
465
466
467     // Test Background
468     doc->setHtml( QLatin1String( "Some <span style=\"background-color:#ff0000;\">formatted</span> text." ) );
469     hb = new PlainTextMarkupBuilder();
470     md = new MarkupDirector(hb);
471     md->processDocument(doc);
472     result = hb->getResult();
473
474     regex = QRegExp( QLatin1String( "^Some formatted text.\\n$" ) );
475     QVERIFY(regex.exactMatch(result));
476
477     // Test Font Family
478     doc->setHtml( QLatin1String( "Some <span style=\"font-family:courier;\">formatted</span> text." ) );
479     hb = new PlainTextMarkupBuilder();
480     md = new MarkupDirector(hb);
481     md->processDocument(doc);
482     result = hb->getResult();
483
484     regex = QRegExp( QLatin1String( "^Some formatted text.\\n$" ) );
485     QVERIFY(regex.exactMatch(result));
486
487     // Test Font Size
488     doc->setHtml( QLatin1String( "Some <span style=\"font-size:20pt;\">formatted</span> text." ) );
489     hb = new PlainTextMarkupBuilder();
490     md = new MarkupDirector(hb);
491     md->processDocument(doc);
492     result = hb->getResult();
493
494     regex = QRegExp( QLatin1String( "^Some formatted text.\\n$" ) );
495     QVERIFY(regex.exactMatch(result));
496
497 }
498
499 void TestPlainMarkupOutput::testHorizontalRule()
500 {
501     QTextDocument *doc = new QTextDocument();
502     doc->setHtml( QLatin1String( "<p style=\"margin-top:0;margin-bottom:0;\">Foo</p><hr /><p style=\"margin-top:0;margin-bottom:0;\">Bar</p>" ) );
503
504     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
505     MarkupDirector *md = new MarkupDirector(hb);
506     md->processDocument(doc);
507     QString result = hb->getResult();
508
509
510     QRegExp regex = QRegExp( QLatin1String( "^Foo\\n--------------------\\nBar\\n$" ) );
511
512     QVERIFY(regex.exactMatch(result));
513 }
514
515 void TestPlainMarkupOutput::testNewlines()
516 {
517     QTextDocument *doc = new QTextDocument();
518     doc->setHtml( QLatin1String( "<p>Foo</p>\n<br /><br />\n<p>Bar</p>" ) );
519
520     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
521     MarkupDirector *md = new MarkupDirector(hb);
522     md->processDocument(doc);
523     QString result = hb->getResult();
524
525     QRegExp regex = QRegExp( QLatin1String( "^Foo\\n\\n\\nBar\\n$" ) );
526
527     QVERIFY(regex.exactMatch(result));
528 }
529
530 void TestPlainMarkupOutput::testEmptyParagraphs()
531 {
532     QTextDocument *doc = new QTextDocument();
533     doc->setHtml( QLatin1String( "<p>Foo</p>\n<br /><br />\n<p>Bar</p>" ) );
534
535     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
536     MarkupDirector *md = new MarkupDirector(hb);
537     md->processDocument(doc);
538     QString result = hb->getResult();
539
540     QRegExp regex = QRegExp( QLatin1String( "^Foo\\n\\n\\nBar\\n$" ) );
541
542     QVERIFY(regex.exactMatch(result));
543 }
544
545 void TestPlainMarkupOutput::testNewlinesThroughQTextEdit()
546 {
547
548     QTextEdit *te = new QTextEdit();
549     QTextCursor cursor = te->textCursor();
550     cursor.movePosition(QTextCursor::Start);
551     cursor.insertText( QLatin1String( "Foo" ) );
552     cursor.insertText( QLatin1String( "\n" ) );
553     cursor.insertText( QLatin1String( "\n" ) );
554     cursor.insertText( QLatin1String( "\n" ) );
555     cursor.insertText( QLatin1String( "Bar" ) );
556
557     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
558     MarkupDirector *md = new MarkupDirector(hb);
559     md->processDocument(te->document());
560     QString result = hb->getResult();
561
562     QRegExp regex = QRegExp( QLatin1String( "^Foo\\n\\n\\nBar\\n$" ) );
563
564     QVERIFY(regex.exactMatch(result));
565 }
566
567 void TestPlainMarkupOutput:: testBrInsideParagraph()
568 {
569
570     QTextDocument *doc = new QTextDocument();
571     doc->setHtml( QLatin1String( "<p>Foo<br /><br /><br />Bar</p>" ) );
572
573     PlainTextMarkupBuilder *hb = new PlainTextMarkupBuilder();
574     MarkupDirector *md = new MarkupDirector(hb);
575     md->processDocument(doc);
576     QString result = hb->getResult();
577
578     // Two paragraphs separated by two line breaks
579
580     QRegExp regex = QRegExp( QLatin1String( "^Foo\\n\\n\\nBar\\n$" ) );
581
582     QVERIFY(regex.exactMatch(result));
583 }
584
585
586 QTEST_MAIN(TestPlainMarkupOutput)
587 #include "plainmarkupbuildertest.moc"