Merge remote-tracking branch 'origin/4.7' into qt-4.8-from-4.7
[qt:qt.git] / tests / auto / qstatictext / tst_qstatictext.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the test suite of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 **
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 **
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
29 **
30 ** Other Usage
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include <QtTest/QtTest>
43 #include <QtGui/QApplication>
44 #include <QtGui/QPainter>
45 #include <QtGui/QImage>
46
47 #include <qstatictext.h>
48 #include <qpaintengine.h>
49
50 #include <private/qstatictext_p.h>
51 #include <private/qapplication_p.h>
52
53 // #define DEBUG_SAVE_IMAGE
54
55 class tst_QStaticText: public QObject
56 {
57     Q_OBJECT
58
59 private:
60     bool supportsTransformations() const;
61
62 private slots:
63     void init();
64     void cleanup();
65
66     void constructionAndDestruction();
67     void drawToPoint_data();
68     void drawToPoint();
69     void drawToRect_data();
70     void drawToRect();
71     void setFont();
72     void setTextWidth();
73     void prepareToCorrectData();
74     void prepareToWrongData();
75
76     void copyConstructor();
77
78     void translatedPainter();
79     void rotatedPainter();
80     void scaledPainter();
81     void projectedPainter();
82 #if 0
83     void rotatedScaledAndTranslatedPainter_data();
84     void rotatedScaledAndTranslatedPainter();
85 #endif
86     void transformationChanged();
87
88     void plainTextVsRichText();
89
90     void setPenPlainText();
91     void setPenRichText();
92     void richTextOverridesPen();
93
94     void drawStruckOutText();
95     void drawOverlinedText();
96     void drawUnderlinedText();
97
98     void unprintableCharacter_qtbug12614();
99
100     void underlinedColor_qtbug20159();
101     void textDocumentColor();
102 };
103
104 void tst_QStaticText::init()
105 {
106 }
107
108 void tst_QStaticText::cleanup()
109 {
110 }
111
112 void tst_QStaticText::constructionAndDestruction()
113 {
114     QStaticText text("My text");
115 }
116
117 void tst_QStaticText::copyConstructor()
118 {
119     QStaticText text(QLatin1String("My text"));
120
121     QTextOption textOption(Qt::AlignRight);
122     text.setTextOption(textOption);
123
124     text.setPerformanceHint(QStaticText::AggressiveCaching);
125     text.setTextWidth(123.456);
126     text.setTextFormat(Qt::PlainText);
127
128     QStaticText copiedText(text);
129     copiedText.setText(QLatin1String("Other text"));
130
131     QCOMPARE(copiedText.textOption().alignment(), Qt::AlignRight);
132     QCOMPARE(copiedText.performanceHint(), QStaticText::AggressiveCaching);
133     QCOMPARE(copiedText.textWidth(), 123.456);
134     QCOMPARE(copiedText.textFormat(), Qt::PlainText);
135
136     QStaticText otherCopiedText(copiedText);
137     otherCopiedText.setTextWidth(789);
138
139     QCOMPARE(otherCopiedText.text(), QString::fromLatin1("Other text"));
140 }
141
142 Q_DECLARE_METATYPE(QStaticText::PerformanceHint)
143 void tst_QStaticText::drawToPoint_data()
144 {
145     QTest::addColumn<QStaticText::PerformanceHint>("performanceHint");
146
147     QTest::newRow("Moderate caching") << QStaticText::ModerateCaching;
148     QTest::newRow("Aggressive caching") << QStaticText::AggressiveCaching;
149 }
150
151 void tst_QStaticText::drawToPoint()
152 {
153     QFETCH(QStaticText::PerformanceHint, performanceHint);
154
155     QPixmap imageDrawText(1000, 1000);
156     imageDrawText.fill(Qt::white);
157     {
158         QPainter p(&imageDrawText);
159         p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
160     }
161
162     QPixmap imageDrawStaticText(1000, 1000);
163     imageDrawStaticText.fill(Qt::white);
164     {
165         QPainter p(&imageDrawStaticText);
166         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
167         text.setTextFormat(Qt::PlainText);
168         text.setPerformanceHint(performanceHint);
169         p.drawStaticText(QPointF(11, 12 - QFontMetricsF(p.font()).ascent()), text);
170     }
171
172     QCOMPARE(imageDrawStaticText, imageDrawText);
173 }
174
175 void tst_QStaticText::drawToRect_data()
176 {
177     QTest::addColumn<QStaticText::PerformanceHint>("performanceHint");
178
179     QTest::newRow("Moderate caching") << QStaticText::ModerateCaching;
180     QTest::newRow("Aggressive caching") << QStaticText::AggressiveCaching;
181 }
182
183 void tst_QStaticText::drawToRect()
184 {
185     QFETCH(QStaticText::PerformanceHint, performanceHint);
186
187     QPixmap imageDrawText(1000, 1000);
188     imageDrawText.fill(Qt::white);
189     {
190         QPainter p(&imageDrawText);
191         p.drawText(QRectF(11, 12, 10, 500), "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
192     }
193
194     QPixmap imageDrawStaticText(1000, 1000);
195     imageDrawStaticText.fill(Qt::white);
196     {
197         QPainter p(&imageDrawStaticText);
198         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
199         text.setTextWidth(10),
200         p.setClipRect(QRectF(11, 12, 10, 500));
201         text.setPerformanceHint(performanceHint);
202         text.setTextFormat(Qt::PlainText);
203         p.drawStaticText(QPointF(11, 12), text);
204     }
205
206 #if defined(DEBUG_SAVE_IMAGE)
207     imageDrawText.save("drawToRect_imageDrawText.png");
208     imageDrawStaticText.save("drawToRect_imageDrawStaticText.png");
209 #endif
210
211     QCOMPARE(imageDrawStaticText, imageDrawText);   
212 }
213
214 void tst_QStaticText::prepareToCorrectData()
215 {
216     QTransform transform;
217     transform.scale(2.0, 2.0);
218     transform.rotate(90, Qt::ZAxis);
219
220     QPixmap imageDrawText(1000, 1000);
221     imageDrawText.fill(Qt::white);
222     {
223         QPainter p(&imageDrawText);
224         p.setTransform(transform);
225         p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
226     }
227
228     QPixmap imageDrawStaticText(1000, 1000);
229     imageDrawStaticText.fill(Qt::white);
230     {
231         QPainter p(&imageDrawStaticText);
232         p.setTransform(transform);
233         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
234         text.prepare(transform, p.font());
235         text.setTextFormat(Qt::PlainText);
236         p.drawStaticText(QPointF(11, 12  - QFontMetricsF(p.font()).ascent()), text);
237     }
238
239     if (!supportsTransformations())
240       QEXPECT_FAIL("", "Graphics system does not support transformed text on this platform", Abort);
241     QCOMPARE(imageDrawStaticText, imageDrawText);
242 }
243
244 void tst_QStaticText::prepareToWrongData()
245 {
246     QTransform transform;
247     transform.scale(2.0, 2.0);
248     transform.rotate(90, Qt::ZAxis);
249
250     QPixmap imageDrawText(1000, 1000);
251     imageDrawText.fill(Qt::white);
252     {
253         QPainter p(&imageDrawText);
254         p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
255     }
256
257     QPixmap imageDrawStaticText(1000, 1000);
258     imageDrawStaticText.fill(Qt::white);
259     {
260         QPainter p(&imageDrawStaticText);
261         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
262         text.prepare(transform, p.font());
263         text.setTextFormat(Qt::PlainText);
264         p.drawStaticText(QPointF(11, 12  - QFontMetricsF(p.font()).ascent()), text);
265     }
266
267     QCOMPARE(imageDrawStaticText, imageDrawText);
268 }
269
270
271 void tst_QStaticText::setFont()
272 {
273     QFont font = QApplication::font();
274     font.setBold(true);
275     font.setPointSize(28);
276
277     QPixmap imageDrawText(1000, 1000);
278     imageDrawText.fill(Qt::white);
279     {
280         QPainter p(&imageDrawText);
281         p.drawText(QRectF(0, 0, 1000, 1000), 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
282
283         p.setFont(font);
284         p.drawText(QRectF(11, 120, 1000, 1000), 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
285     }
286
287     QPixmap imageDrawStaticText(1000, 1000);
288     imageDrawStaticText.fill(Qt::white);
289     {
290         QPainter p(&imageDrawStaticText);
291
292         QStaticText text;
293         text.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
294         text.setTextFormat(Qt::PlainText);
295
296         p.drawStaticText(0, 0, text);
297
298         p.setFont(font);
299         p.drawStaticText(11, 120, text);
300     }
301
302 #if defined(DEBUG_SAVE_IMAGE)
303     imageDrawText.save("setFont_imageDrawText.png");
304     imageDrawStaticText.save("setFont_imageDrawStaticText.png");
305 #endif
306
307     QCOMPARE(imageDrawStaticText, imageDrawText);
308 }
309
310 void tst_QStaticText::setTextWidth()
311 {
312     QPixmap imageDrawText(1000, 1000);
313     imageDrawText.fill(Qt::white);
314     {
315         QPainter p(&imageDrawText);
316         p.drawText(QRectF(11, 12, 10, 500), "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
317     }
318
319     QPixmap imageDrawStaticText(1000, 1000);
320     imageDrawStaticText.fill(Qt::white);
321     {
322         QPainter p(&imageDrawStaticText);
323         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
324         text.setTextWidth(10);
325         p.setClipRect(QRectF(11, 12, 10, 500));
326         p.drawStaticText(QPointF(11, 12), text);
327     }
328
329     QCOMPARE(imageDrawStaticText, imageDrawText);
330 }
331
332 void tst_QStaticText::translatedPainter()
333 {
334     QPixmap imageDrawText(1000, 1000);
335     imageDrawText.fill(Qt::white);
336     {
337         QPainter p(&imageDrawText);
338         p.translate(100, 200);
339
340         p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
341     }
342
343     QPixmap imageDrawStaticText(1000, 1000);
344     imageDrawStaticText.fill(Qt::white);
345     {
346         QPainter p(&imageDrawStaticText);
347         p.translate(100, 200);
348
349         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
350         text.setTextFormat(Qt::PlainText);
351
352         p.drawStaticText(QPointF(11, 12 - QFontMetricsF(p.font()).ascent()), text);
353     }
354
355     QCOMPARE(imageDrawStaticText, imageDrawText);
356 }
357
358 bool tst_QStaticText::supportsTransformations() const
359 {
360     QPixmap pm(10, 10);
361     QPainter p(&pm);
362     QPaintEngine *engine = p.paintEngine();
363
364     QPaintEngine::Type type = engine->type();
365
366     if (type == QPaintEngine::OpenGL
367 #if !defined(Q_WS_WIN) && !defined(Q_WS_X11) && !defined(Q_WS_MAC)
368         || type == QPaintEngine::Raster
369 #endif
370         )
371         return false;
372
373     return true;
374 }
375
376 void tst_QStaticText::rotatedPainter()
377 {
378     QPixmap imageDrawText(1000, 1000);
379     imageDrawText.fill(Qt::white);
380     {
381         QPainter p(&imageDrawText);
382         p.rotate(30.0);
383         p.drawText(QRectF(0, 0, 1000, 100), 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
384     }
385
386     QPixmap imageDrawStaticText(1000, 1000);
387     imageDrawStaticText.fill(Qt::white);
388     {
389         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
390         text.setTextFormat(Qt::PlainText);
391
392         QPainter p(&imageDrawStaticText);
393         p.rotate(30.0);
394         p.drawStaticText(QPoint(0, 0), text);
395     }
396
397 #if defined(DEBUG_SAVE_IMAGE)
398     imageDrawText.save("rotatedPainter_imageDrawText.png");
399     imageDrawStaticText.save("rotatedPainter_imageDrawStaticText.png");
400 #endif
401
402     if (!supportsTransformations())
403       QEXPECT_FAIL("", "Graphics system does not support transformed text on this platform", Abort);
404     QCOMPARE(imageDrawStaticText, imageDrawText);
405 }
406
407 void tst_QStaticText::scaledPainter()
408 {
409     QPixmap imageDrawText(1000, 1000);
410     imageDrawText.fill(Qt::white);
411     {
412         QPainter p(&imageDrawText);
413         p.scale(2.0, 0.2);
414
415         p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
416     }
417
418     QPixmap imageDrawStaticText(1000, 1000);
419     imageDrawStaticText.fill(Qt::white);
420     {
421         QPainter p(&imageDrawStaticText);
422         p.scale(2.0, 0.2);
423
424         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
425         text.setTextFormat(Qt::PlainText);
426
427         p.drawStaticText(QPointF(11, 12 - QFontMetricsF(p.font()).ascent()), text);
428     }
429
430     if (!supportsTransformations())
431       QEXPECT_FAIL("", "Graphics system does not support transformed text on this platform", Abort);
432     QCOMPARE(imageDrawStaticText, imageDrawText);
433 }
434
435 void tst_QStaticText::projectedPainter()
436 {
437     QTransform transform;
438     transform.rotate(90, Qt::XAxis);
439
440     QPixmap imageDrawText(1000, 1000);
441     imageDrawText.fill(Qt::white);
442     {
443         QPainter p(&imageDrawText);
444         p.setTransform(transform);
445
446         p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
447     }
448
449     QPixmap imageDrawStaticText(1000, 1000);
450     imageDrawStaticText.fill(Qt::white);
451     {
452         QPainter p(&imageDrawStaticText);
453         p.setTransform(transform);
454
455         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
456         text.setTextFormat(Qt::PlainText);
457
458         p.drawStaticText(QPointF(11, 12 - QFontMetricsF(p.font()).ascent()), text);
459     }
460
461     QCOMPARE(imageDrawStaticText, imageDrawText);
462 }
463
464 #if 0
465 void tst_QStaticText::rotatedScaledAndTranslatedPainter_data()
466 {
467     QTest::addColumn<qreal>("offset");
468
469     for (int i=0; i<100; ++i) {
470         qreal offset = 300 + i / 100.;
471         QTest::newRow(QByteArray::number(offset).constData()) << offset;
472     }
473 }
474
475 void tst_QStaticText::rotatedScaledAndTranslatedPainter()
476 {
477     QFETCH(qreal, offset);
478
479     QPixmap imageDrawText(1000, 1000);
480     imageDrawText.fill(Qt::white);
481     {
482         QPainter p(&imageDrawText);
483         p.translate(offset, 0);
484         p.rotate(45.0);
485         p.scale(2.0, 2.0);
486         p.translate(100, 200);
487
488         p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
489     }
490
491     QPixmap imageDrawStaticText(1000, 1000);
492     imageDrawStaticText.fill(Qt::white);
493     {
494         QPainter p(&imageDrawStaticText);
495         p.translate(offset, 0);
496         p.rotate(45.0);
497         p.scale(2.0, 2.0);
498         p.translate(100, 200);
499
500         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
501         text.setTextFormat(Qt::PlainText);
502
503         p.drawStaticText(QPointF(11, 12 - QFontMetricsF(p.font()).ascent()), text);
504     }
505
506 #if defined(DEBUG_SAVE_IMAGE)
507     imageDrawText.save("rotatedScaledAndPainter_imageDrawText.png");
508     imageDrawStaticText.save("rotatedScaledAndPainter_imageDrawStaticText.png");
509 #endif
510
511     if (!supportsTransformations())
512       QEXPECT_FAIL("", "Graphics system does not support transformed text on this platform", Abort);
513     QCOMPARE(imageDrawStaticText, imageDrawText);
514 }
515 #endif
516
517 void tst_QStaticText::transformationChanged()
518 {
519     QPixmap imageDrawText(1000, 1000);
520     imageDrawText.fill(Qt::white);
521     {
522         QPainter p(&imageDrawText);
523         p.rotate(33.0);
524         p.scale(0.5, 0.7);
525
526         p.drawText(QRectF(0, 0, 1000, 1000), 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
527
528         p.scale(2.0, 2.5);
529         p.drawText(QRectF(0, 0, 1000, 1000), 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
530     }
531
532     QPixmap imageDrawStaticText(1000, 1000);
533     imageDrawStaticText.fill(Qt::white);
534     {
535         QPainter p(&imageDrawStaticText);
536         p.rotate(33.0);
537         p.scale(0.5, 0.7);
538
539         QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
540         text.setTextFormat(Qt::PlainText);
541
542         p.drawStaticText(QPointF(0, 0), text);
543
544         p.scale(2.0, 2.5);
545         p.drawStaticText(QPointF(0, 0), text);
546     }
547
548 #if defined(DEBUG_SAVE_IMAGE)
549     imageDrawText.save("transformationChanged_imageDrawText.png");
550     imageDrawStaticText.save("transformationChanged_imageDrawStaticText.png");
551 #endif
552
553     if (!supportsTransformations())
554       QEXPECT_FAIL("", "Graphics system does not support transformed text on this platform", Abort);
555     QCOMPARE(imageDrawStaticText, imageDrawText);
556 }
557
558 void tst_QStaticText::plainTextVsRichText()
559 {
560     QPixmap imagePlainText(1000, 1000);
561     imagePlainText.fill(Qt::white);
562     {
563         QPainter p(&imagePlainText);
564
565         QStaticText staticText;
566         staticText.setText("FOObar");
567         staticText.setTextFormat(Qt::PlainText);
568
569         p.drawStaticText(10, 10, staticText);
570     }
571
572     QPixmap imageRichText(1000, 1000);
573     imageRichText.fill(Qt::white);
574     {
575         QPainter p(&imageRichText);
576
577         QStaticText staticText;
578         staticText.setText("<html><body>FOObar</body></html>");
579         staticText.setTextFormat(Qt::RichText);
580
581         p.drawStaticText(10, 10, staticText);
582     }
583
584 #if defined(DEBUG_SAVE_IMAGE)
585     imagePlainText.save("plainTextVsRichText_imagePlainText.png");
586     imageRichText.save("plainTextVsRichText_imageRichText.png");
587 #endif
588
589     QCOMPARE(imagePlainText, imageRichText);
590 }
591
592 void tst_QStaticText::setPenPlainText()
593 {
594     QFont font = QApplication::font();
595     font.setStyleStrategy(QFont::NoAntialias);
596
597     QFontMetricsF fm(font);
598     QPixmap image(qCeil(fm.width("XXXXX")), qCeil(fm.height()));
599     image.fill(Qt::white);
600     {
601         QPainter p(&image);
602         p.setFont(font);
603         p.setPen(Qt::green);
604
605         QStaticText staticText("XXXXX");
606         staticText.setTextFormat(Qt::PlainText);
607         p.drawStaticText(0, 0, staticText);
608     }
609
610     QImage img = image.toImage();
611     for (int x=0; x<img.width(); ++x) {
612         for (int y=0; y<img.height(); ++y) {
613             QRgb pixel = img.pixel(x, y);
614             QVERIFY(pixel == QColor(Qt::white).rgba()
615                     || pixel == QColor(Qt::green).rgba());
616         }
617     }
618 }
619
620 void tst_QStaticText::setPenRichText()
621 {
622     QFont font = QApplication::font();
623     font.setStyleStrategy(QFont::NoAntialias);
624
625     QFontMetricsF fm(font);
626     QPixmap image(qCeil(fm.width("XXXXX")), qCeil(fm.height()));
627     image.fill(Qt::white);
628     {
629         QPainter p(&image);
630         p.setFont(font);
631         p.setPen(Qt::green);
632
633         QStaticText staticText;
634         staticText.setText("<html><body>XXXXX</body></html>");
635         staticText.setTextFormat(Qt::RichText);
636         p.drawStaticText(0, 0, staticText);
637     }
638
639     QImage img = image.toImage();
640     for (int x=0; x<img.width(); ++x) {
641         for (int y=0; y<img.height(); ++y) {
642             QRgb pixel = img.pixel(x, y);
643             QVERIFY(pixel == QColor(Qt::white).rgba()
644                     || pixel == QColor(Qt::green).rgba());
645         }
646     }
647 }
648
649 void tst_QStaticText::richTextOverridesPen()
650 {
651     QFont font = QApplication::font();
652     font.setStyleStrategy(QFont::NoAntialias);
653
654     QFontMetricsF fm(font);
655     QPixmap image(qCeil(fm.width("XXXXX")), qCeil(fm.height()));
656     image.fill(Qt::white);
657     {
658         QPainter p(&image);
659         p.setFont(font);
660         p.setPen(Qt::green);
661
662         QStaticText staticText;
663         staticText.setText("<html><body><font color=\"#ff0000\">XXXXX</font></body></html>");
664         staticText.setTextFormat(Qt::RichText);
665         p.drawStaticText(0, 0, staticText);
666     }
667
668     QImage img = image.toImage();
669     for (int x=0; x<img.width(); ++x) {
670         for (int y=0; y<img.height(); ++y) {
671             QRgb pixel = img.pixel(x, y);
672             QVERIFY(pixel == QColor(Qt::white).rgba()
673                     || pixel == QColor(Qt::red).rgba());
674         }
675     }
676 }
677
678 void tst_QStaticText::drawStruckOutText()
679 {
680     QPixmap imageDrawText(1000, 1000);
681     QPixmap imageDrawStaticText(1000, 1000);
682
683     imageDrawText.fill(Qt::white);
684     imageDrawStaticText.fill(Qt::white);
685
686     QString s = QString::fromLatin1("Foobar");
687
688     QFont font;
689     font.setStrikeOut(true);
690
691     {
692         QPainter p(&imageDrawText);
693         p.setFont(font);
694         p.drawText(QPointF(50, 50), s);
695     }
696
697     {
698         QPainter p(&imageDrawStaticText);
699         QStaticText text = QStaticText(s);
700         p.setFont(font);
701         p.drawStaticText(QPointF(50, 50 - QFontMetricsF(p.font()).ascent()), text);
702     }
703
704 #if defined(DEBUG_SAVE_IMAGE)
705     imageDrawText.save("drawStruckOutText_imageDrawText.png");
706     imageDrawStaticText.save("drawStruckOutText_imageDrawStaticText.png");
707 #endif
708
709     QCOMPARE(imageDrawText, imageDrawStaticText);
710 }
711
712 void tst_QStaticText::drawOverlinedText()
713 {
714     QPixmap imageDrawText(1000, 1000);
715     QPixmap imageDrawStaticText(1000, 1000);
716
717     imageDrawText.fill(Qt::white);
718     imageDrawStaticText.fill(Qt::white);
719
720     QString s = QString::fromLatin1("Foobar");
721
722     QFont font;
723     font.setOverline(true);
724
725     {
726         QPainter p(&imageDrawText);
727         p.setFont(font);
728         p.drawText(QPointF(50, 50), s);
729     }
730
731     {
732         QPainter p(&imageDrawStaticText);
733         QStaticText text = QStaticText(s);
734         p.setFont(font);
735         p.drawStaticText(QPointF(50, 50 - QFontMetricsF(p.font()).ascent()), text);
736     }
737
738 #if defined(DEBUG_SAVE_IMAGE)
739     imageDrawText.save("drawOverlinedText_imageDrawText.png");
740     imageDrawStaticText.save("drawOverlinedText_imageDrawStaticText.png");
741 #endif
742
743     QCOMPARE(imageDrawText, imageDrawStaticText);
744 }
745
746 void tst_QStaticText::drawUnderlinedText()
747 {
748     QPixmap imageDrawText(1000, 1000);
749     QPixmap imageDrawStaticText(1000, 1000);
750
751     imageDrawText.fill(Qt::white);
752     imageDrawStaticText.fill(Qt::white);
753
754     QString s = QString::fromLatin1("Foobar");
755
756     QFont font;
757     font.setUnderline(true);
758
759     {
760         QPainter p(&imageDrawText);
761         p.setFont(font);
762         p.drawText(QPointF(50, 50), s);
763     }
764
765     {
766         QPainter p(&imageDrawStaticText);
767         QStaticText text = QStaticText(s);
768         p.setFont(font);
769         p.drawStaticText(QPointF(50, 50 - QFontMetricsF(p.font()).ascent()), text);
770     }
771
772 #if defined(DEBUG_SAVE_IMAGE)
773     imageDrawText.save("drawUnderlinedText_imageDrawText.png");
774     imageDrawStaticText.save("drawUnderlinedText_imageDrawStaticText.png");
775 #endif
776
777     QCOMPARE(imageDrawText, imageDrawStaticText);
778 }
779
780 void tst_QStaticText::unprintableCharacter_qtbug12614()
781 {
782     QString s(QChar(0x200B)); // U+200B, ZERO WIDTH SPACE
783
784     QStaticText staticText(s);
785
786     QVERIFY(staticText.size().isValid()); // Force layout. Should not crash.
787 }
788
789 void tst_QStaticText::underlinedColor_qtbug20159()
790 {
791     QString multiScriptText;
792     multiScriptText += QChar(0x0410); // Cyrillic 'A'
793     multiScriptText += QLatin1Char('A');
794
795     QStaticText staticText(multiScriptText);
796
797     QFont font;
798     font.setUnderline(true);
799
800     staticText.prepare(QTransform(), font);
801
802     QStaticTextPrivate *d = QStaticTextPrivate::get(&staticText);
803     QCOMPARE(d->itemCount, 2);
804
805     // The pen should not be marked as dirty when drawing the underline
806     QVERIFY(!d->items[0].color.isValid());
807     QVERIFY(!d->items[1].color.isValid());
808 }
809
810 void tst_QStaticText::textDocumentColor()
811 {
812     QStaticText staticText("A<font color=\"red\">B</font>");
813     staticText.setTextFormat(Qt::RichText);
814     staticText.prepare();
815
816     QStaticTextPrivate *d = QStaticTextPrivate::get(&staticText);
817     QCOMPARE(d->itemCount, 2);
818
819     // The pen should not be marked as dirty when drawing the underline
820     QVERIFY(!d->items[0].color.isValid());
821     QVERIFY(d->items[1].color.isValid());
822
823     QCOMPARE(d->items[1].color, QColor(Qt::red));
824 }
825
826 QTEST_MAIN(tst_QStaticText)
827 #include "tst_qstatictext.moc"