1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the test suite of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file. Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights. These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
42 #include <QTextDocument>
43 #include <QtDeclarative/qdeclarativeengine.h>
44 #include <QtDeclarative/qdeclarativecomponent.h>
45 #include <private/qdeclarativetext_p.h>
46 #include <private/qdeclarativetext_p_p.h>
47 #include <private/qdeclarativevaluetype_p.h>
48 #include <QFontMetrics>
49 #include <QGraphicsSceneMouseEvent>
51 #include <QDeclarativeView>
52 #include <private/qapplication_p.h>
55 #include "../../../shared/util.h"
56 #include "testhttpserver.h"
59 // In Symbian OS test data is located in applications private dir
63 class tst_qdeclarativetext : public QObject
68 tst_qdeclarativetext();
77 void alignments_data();
80 void embeddedImages_data();
81 void embeddedImages();
86 // ### these tests may be trivial
87 void horizontalAlignment();
88 void horizontalAlignment_RightToLeft();
89 void verticalAlignment();
95 // QDeclarativeFontValueType
100 void capitalization();
101 void letterSpacing();
107 void implicitSize_data();
109 void testQtQuick11Attributes();
110 void testQtQuick11Attributes_data();
114 QStringList standard;
115 QStringList richText;
117 QStringList horizontalAlignmentmentStrings;
118 QStringList verticalAlignmentmentStrings;
120 QList<Qt::Alignment> verticalAlignmentments;
121 QList<Qt::Alignment> horizontalAlignmentments;
123 QStringList styleStrings;
124 QList<QDeclarativeText::TextStyle> styles;
126 QStringList colorStrings;
128 QDeclarativeEngine engine;
130 QDeclarativeView *createView(const QString &filename);
133 tst_qdeclarativetext::tst_qdeclarativetext()
135 standard << "the quick brown fox jumped over the lazy dog"
136 << "the quick brown fox\n jumped over the lazy dog";
138 richText << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a> jumped over the <b>lazy</b> dog</i>"
139 << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
141 horizontalAlignmentmentStrings << "AlignLeft"
145 verticalAlignmentmentStrings << "AlignTop"
149 horizontalAlignmentments << Qt::AlignLeft
153 verticalAlignmentments << Qt::AlignTop
157 styleStrings << "Normal"
162 styles << QDeclarativeText::Normal
163 << QDeclarativeText::Outline
164 << QDeclarativeText::Raised
165 << QDeclarativeText::Sunken;
167 colorStrings << "aliceblue"
180 // need a different test to do alpha channel test
186 QDeclarativeView *tst_qdeclarativetext::createView(const QString &filename)
188 QDeclarativeView *canvas = new QDeclarativeView(0);
190 canvas->setSource(QUrl::fromLocalFile(filename));
194 void tst_qdeclarativetext::text()
197 QDeclarativeComponent textComponent(&engine);
198 textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
199 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
201 QVERIFY(textObject != 0);
202 QCOMPARE(textObject->text(), QString(""));
203 QVERIFY(textObject->width() == 0);
208 for (int i = 0; i < standard.size(); i++)
210 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
211 QDeclarativeComponent textComponent(&engine);
212 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
214 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
216 QVERIFY(textObject != 0);
217 QCOMPARE(textObject->text(), standard.at(i));
218 QVERIFY(textObject->width() > 0);
221 for (int i = 0; i < richText.size(); i++)
223 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
224 QDeclarativeComponent textComponent(&engine);
225 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
226 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
228 QVERIFY(textObject != 0);
229 QString expected = richText.at(i);
230 QCOMPARE(textObject->text(), expected.replace("\\\"", "\""));
231 QVERIFY(textObject->width() > 0);
235 void tst_qdeclarativetext::width()
237 // uses Font metrics to find the width for standard and document to find the width for rich
239 QDeclarativeComponent textComponent(&engine);
240 textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
241 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
243 QVERIFY(textObject != 0);
244 QCOMPARE(textObject->width(), 0.);
247 for (int i = 0; i < standard.size(); i++)
249 QVERIFY(!Qt::mightBeRichText(standard.at(i))); // self-test
253 qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
254 metricWidth = qCeil(metricWidth);
256 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
257 QDeclarativeComponent textComponent(&engine);
258 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
259 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
261 QVERIFY(textObject != 0);
262 QVERIFY(textObject->boundingRect().width() > 0);
263 QCOMPARE(textObject->width(), qreal(metricWidth));
264 QVERIFY(textObject->textFormat() == QDeclarativeText::AutoText); // setting text doesn't change format
267 for (int i = 0; i < richText.size(); i++)
269 QVERIFY(Qt::mightBeRichText(richText.at(i))); // self-test
271 QTextDocument document;
272 document.setHtml(richText.at(i));
273 document.setDocumentMargin(0);
275 int documentWidth = document.idealWidth();
277 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
278 QDeclarativeComponent textComponent(&engine);
279 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
280 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
282 QVERIFY(textObject != 0);
283 QCOMPARE(textObject->width(), qreal(documentWidth));
284 QVERIFY(textObject->textFormat() == QDeclarativeText::AutoText); // setting text doesn't change format
288 void tst_qdeclarativetext::wrap()
291 // for specified width and wrap set true
293 QDeclarativeComponent textComponent(&engine);
294 textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; wrapMode: Text.WordWrap; width: 300 }", QUrl::fromLocalFile(""));
295 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
296 textHeight = textObject->height();
298 QVERIFY(textObject != 0);
299 QVERIFY(textObject->wrapMode() == QDeclarativeText::WordWrap);
300 QCOMPARE(textObject->width(), 300.);
303 for (int i = 0; i < standard.size(); i++)
305 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + standard.at(i) + "\" }";
306 QDeclarativeComponent textComponent(&engine);
307 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
308 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
310 QVERIFY(textObject != 0);
311 QCOMPARE(textObject->width(), 30.);
312 QVERIFY(textObject->height() > textHeight);
314 int oldHeight = textObject->height();
315 textObject->setWidth(100);
316 QVERIFY(textObject->height() < oldHeight);
319 for (int i = 0; i < richText.size(); i++)
321 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + richText.at(i) + "\" }";
322 QDeclarativeComponent textComponent(&engine);
323 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
324 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
326 QVERIFY(textObject != 0);
327 QCOMPARE(textObject->width(), 30.);
328 QVERIFY(textObject->height() > textHeight);
330 qreal oldHeight = textObject->height();
331 textObject->setWidth(100);
332 QVERIFY(textObject->height() < oldHeight);
335 // richtext again with a fixed height
336 for (int i = 0; i < richText.size(); i++)
338 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; height: 50; text: \"" + richText.at(i) + "\" }";
339 QDeclarativeComponent textComponent(&engine);
340 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
341 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
343 QVERIFY(textObject != 0);
344 QCOMPARE(textObject->width(), 30.);
345 QVERIFY(textObject->implicitHeight() > textHeight);
347 qreal oldHeight = textObject->implicitHeight();
348 textObject->setWidth(100);
349 QVERIFY(textObject->implicitHeight() < oldHeight);
353 void tst_qdeclarativetext::elide()
355 for (QDeclarativeText::TextElideMode m = QDeclarativeText::ElideLeft; m<=QDeclarativeText::ElideNone; m=QDeclarativeText::TextElideMode(int(m)+1)) {
356 const char* elidename[]={"ElideLeft", "ElideRight", "ElideMiddle", "ElideNone"};
357 QString elide = "elide: Text." + QString(elidename[int(m)]) + ";";
359 // XXX Poor coverage.
362 QDeclarativeComponent textComponent(&engine);
363 textComponent.setData(("import QtQuick 1.0\nText { text: \"\"; "+elide+" width: 100 }").toLatin1(), QUrl::fromLocalFile(""));
364 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
366 QCOMPARE(textObject->elideMode(), m);
367 QCOMPARE(textObject->width(), 100.);
370 for (int i = 0; i < standard.size(); i++)
372 QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + standard.at(i) + "\" }";
373 QDeclarativeComponent textComponent(&engine);
374 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
375 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
377 QCOMPARE(textObject->elideMode(), m);
378 QCOMPARE(textObject->width(), 100.);
381 // richtext - does nothing
382 for (int i = 0; i < richText.size(); i++)
384 QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + richText.at(i) + "\" }";
385 QDeclarativeComponent textComponent(&engine);
386 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
387 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
389 QCOMPARE(textObject->elideMode(), m);
390 QCOMPARE(textObject->width(), 100.);
395 QUrl qmlfile = QUrl::fromLocalFile(SRCDIR "/data/elideimplicitwidth.qml");
396 QDeclarativeComponent textComponent(&engine, qmlfile);
397 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(textComponent.create());
399 QVERIFY(item->implicitWidth() > item->width());
402 void tst_qdeclarativetext::textFormat()
405 QDeclarativeComponent textComponent(&engine);
406 textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; textFormat: Text.RichText }", QUrl::fromLocalFile(""));
407 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
409 QVERIFY(textObject != 0);
410 QVERIFY(textObject->textFormat() == QDeclarativeText::RichText);
413 QDeclarativeComponent textComponent(&engine);
414 textComponent.setData("import QtQuick 1.0\nText { text: \"<b>Hello</b>\"; textFormat: Text.PlainText }", QUrl::fromLocalFile(""));
415 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
417 QVERIFY(textObject != 0);
418 QVERIFY(textObject->textFormat() == QDeclarativeText::PlainText);
423 void tst_qdeclarativetext::alignments_data()
425 QTest::addColumn<int>("hAlign");
426 QTest::addColumn<int>("vAlign");
427 QTest::addColumn<QString>("expectfile");
429 QTest::newRow("LT") << int(Qt::AlignLeft) << int(Qt::AlignTop) << SRCDIR "/data/alignments_lt.png";
430 QTest::newRow("RT") << int(Qt::AlignRight) << int(Qt::AlignTop) << SRCDIR "/data/alignments_rt.png";
431 QTest::newRow("CT") << int(Qt::AlignHCenter) << int(Qt::AlignTop) << SRCDIR "/data/alignments_ct.png";
433 QTest::newRow("LB") << int(Qt::AlignLeft) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_lb.png";
434 QTest::newRow("RB") << int(Qt::AlignRight) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_rb.png";
435 QTest::newRow("CB") << int(Qt::AlignHCenter) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_cb.png";
437 QTest::newRow("LC") << int(Qt::AlignLeft) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_lc.png";
438 QTest::newRow("RC") << int(Qt::AlignRight) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_rc.png";
439 QTest::newRow("CC") << int(Qt::AlignHCenter) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_cc.png";
443 void tst_qdeclarativetext::alignments()
447 QFETCH(QString, expectfile);
450 // Font-specific, but not likely platform-specific, so only test on one platform
452 fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*");
453 QApplication::setFont(fn);
456 QDeclarativeView *canvas = createView(SRCDIR "/data/alignments.qml");
459 QApplication::setActiveWindow(canvas);
460 QTest::qWaitForWindowShown(canvas);
461 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
463 QObject *ob = canvas->rootObject();
465 ob->setProperty("horizontalAlignment",hAlign);
466 ob->setProperty("verticalAlignment",vAlign);
467 QTRY_COMPARE(ob->property("running").toBool(),false);
468 QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32);
469 actual.fill(qRgb(255,255,255));
473 QImage expect(expectfile);
476 // Font-specific, but not likely platform-specific, so only test on one platform
477 if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") {
478 QCOMPARE(actual,expect);
485 //the alignment tests may be trivial o.oa
486 void tst_qdeclarativetext::horizontalAlignment()
488 //test one align each, and then test if two align fails.
490 for (int i = 0; i < standard.size(); i++)
492 for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
494 QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
495 QDeclarativeComponent textComponent(&engine);
496 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
497 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
499 QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
503 for (int i = 0; i < richText.size(); i++)
505 for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
507 QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
508 QDeclarativeComponent textComponent(&engine);
509 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
510 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
512 QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
518 void tst_qdeclarativetext::horizontalAlignment_RightToLeft()
520 QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml");
521 QDeclarativeText *text = canvas->rootObject()->findChild<QDeclarativeText*>("text");
525 QDeclarativeTextPrivate *textPrivate = QDeclarativeTextPrivate::get(text);
526 QVERIFY(textPrivate != 0);
528 // implicit alignment should follow the reading direction of RTL text
529 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
530 QCOMPARE(text->effectiveHAlign(), text->hAlign());
531 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
533 // explicitly left aligned text
534 text->setHAlign(QDeclarativeText::AlignLeft);
535 QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft);
536 QCOMPARE(text->effectiveHAlign(), text->hAlign());
537 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
539 // explicitly right aligned text
540 text->setHAlign(QDeclarativeText::AlignRight);
541 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
542 QCOMPARE(text->effectiveHAlign(), text->hAlign());
543 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
545 // change to rich text
546 QString textString = text->text();
547 text->setText(QString("<i>") + textString + QString("</i>"));
548 text->setTextFormat(QDeclarativeText::RichText);
551 // implicitly aligned rich text should follow the reading direction of text
552 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
553 QCOMPARE(text->effectiveHAlign(), text->hAlign());
554 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
556 // explicitly left aligned rich text
557 text->setHAlign(QDeclarativeText::AlignLeft);
558 QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft);
559 QCOMPARE(text->effectiveHAlign(), text->hAlign());
560 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignRight);
562 // explicitly right aligned rich text
563 text->setHAlign(QDeclarativeText::AlignRight);
564 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
565 QCOMPARE(text->effectiveHAlign(), text->hAlign());
566 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
568 text->setText(textString);
569 text->setTextFormat(QDeclarativeText::PlainText);
571 // explicitly center aligned
572 text->setHAlign(QDeclarativeText::AlignHCenter);
573 QCOMPARE(text->hAlign(), QDeclarativeText::AlignHCenter);
574 QCOMPARE(text->effectiveHAlign(), text->hAlign());
575 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
576 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().right() > canvas->width()/2);
578 // reseted alignment should go back to following the text reading direction
580 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
581 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
583 // mirror the text item
584 QDeclarativeItemPrivate::get(text)->setLayoutMirror(true);
586 // mirrored implicit alignment should continue to follow the reading direction of the text
587 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
588 QCOMPARE(text->effectiveHAlign(), QDeclarativeText::AlignRight);
589 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
591 // mirrored explicitly right aligned behaves as left aligned
592 text->setHAlign(QDeclarativeText::AlignRight);
593 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
594 QCOMPARE(text->effectiveHAlign(), QDeclarativeText::AlignLeft);
595 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
597 // mirrored explicitly left aligned behaves as right aligned
598 text->setHAlign(QDeclarativeText::AlignLeft);
599 QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft);
600 QCOMPARE(text->effectiveHAlign(), QDeclarativeText::AlignRight);
601 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
604 QDeclarativeItemPrivate::get(text)->setLayoutMirror(false);
607 // English text should be implicitly left aligned
608 text->setText("Hello world!");
609 QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft);
610 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
612 #ifndef Q_OS_MAC // QTBUG-18040
613 // empty text with implicit alignment follows the system locale-based
614 // keyboard input direction from QApplication::keyboardInputDirection
616 QCOMPARE(text->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
617 QDeclarativeText::AlignLeft : QDeclarativeText::AlignRight);
618 text->setHAlign(QDeclarativeText::AlignRight);
619 QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
624 #ifndef Q_OS_MAC // QTBUG-18040
625 // alignment of Text with no text set to it
626 QString componentStr = "import QtQuick 1.0\nText {}";
627 QDeclarativeComponent textComponent(&engine);
628 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
629 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
630 QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
631 QDeclarativeText::AlignLeft : QDeclarativeText::AlignRight);
636 void tst_qdeclarativetext::verticalAlignment()
638 //test one align each, and then test if two align fails.
640 for (int i = 0; i < standard.size(); i++)
642 for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
644 QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
645 QDeclarativeComponent textComponent(&engine);
646 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
647 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
649 QVERIFY(textObject != 0);
650 QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
654 for (int i = 0; i < richText.size(); i++)
656 for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
658 QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
659 QDeclarativeComponent textComponent(&engine);
660 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
661 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
663 QVERIFY(textObject != 0);
664 QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
668 //confirm that bounding rect is correctly positioned.
669 QString componentStr = "import QtQuick 1.0\nText { height: 80; text: \"Hello\" }";
670 QDeclarativeComponent textComponent(&engine);
671 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
672 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
673 QVERIFY(textObject != 0);
674 QRectF br = textObject->boundingRect();
675 QVERIFY(br.y() == 0);
677 textObject->setVAlign(QDeclarativeText::AlignVCenter);
678 br = textObject->boundingRect();
679 QCOMPARE(qFloor(br.y()), qFloor((80.0 - br.height())/2));
681 textObject->setVAlign(QDeclarativeText::AlignBottom);
682 br = textObject->boundingRect();
683 QCOMPARE(qFloor(br.y()), qFloor(80.0 - br.height()));
688 void tst_qdeclarativetext::font()
690 //test size, then bold, then italic, then family
692 QString componentStr = "import QtQuick 1.0\nText { font.pointSize: 40; text: \"Hello World\" }";
693 QDeclarativeComponent textComponent(&engine);
694 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
695 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
697 QCOMPARE(textObject->font().pointSize(), 40);
698 QCOMPARE(textObject->font().bold(), false);
699 QCOMPARE(textObject->font().italic(), false);
703 QString componentStr = "import QtQuick 1.0\nText { font.pixelSize: 40; text: \"Hello World\" }";
704 QDeclarativeComponent textComponent(&engine);
705 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
706 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
708 QCOMPARE(textObject->font().pixelSize(), 40);
709 QCOMPARE(textObject->font().bold(), false);
710 QCOMPARE(textObject->font().italic(), false);
714 QString componentStr = "import QtQuick 1.0\nText { font.bold: true; text: \"Hello World\" }";
715 QDeclarativeComponent textComponent(&engine);
716 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
717 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
719 QCOMPARE(textObject->font().bold(), true);
720 QCOMPARE(textObject->font().italic(), false);
724 QString componentStr = "import QtQuick 1.0\nText { font.italic: true; text: \"Hello World\" }";
725 QDeclarativeComponent textComponent(&engine);
726 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
727 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
729 QCOMPARE(textObject->font().italic(), true);
730 QCOMPARE(textObject->font().bold(), false);
734 QString componentStr = "import QtQuick 1.0\nText { font.family: \"Helvetica\"; text: \"Hello World\" }";
735 QDeclarativeComponent textComponent(&engine);
736 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
737 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
739 QCOMPARE(textObject->font().family(), QString("Helvetica"));
740 QCOMPARE(textObject->font().bold(), false);
741 QCOMPARE(textObject->font().italic(), false);
745 QString componentStr = "import QtQuick 1.0\nText { font.family: \"\"; text: \"Hello World\" }";
746 QDeclarativeComponent textComponent(&engine);
747 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
748 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
750 QCOMPARE(textObject->font().family(), QString(""));
754 void tst_qdeclarativetext::style()
757 for (int i = 0; i < styles.size(); i++)
759 QString componentStr = "import QtQuick 1.0\nText { style: \"" + styleStrings.at(i) + "\"; styleColor: \"white\"; text: \"Hello World\" }";
760 QDeclarativeComponent textComponent(&engine);
761 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
762 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
764 QCOMPARE((int)textObject->style(), (int)styles.at(i));
765 QCOMPARE(textObject->styleColor(), QColor("white"));
767 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello World\" }";
768 QDeclarativeComponent textComponent(&engine);
769 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
770 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
772 QRectF brPre = textObject->boundingRect();
773 textObject->setStyle(QDeclarativeText::Outline);
774 QRectF brPost = textObject->boundingRect();
776 QVERIFY(brPre.width() < brPost.width());
777 QVERIFY(brPre.height() < brPost.height());
780 void tst_qdeclarativetext::color()
783 for (int i = 0; i < colorStrings.size(); i++)
785 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
786 QDeclarativeComponent textComponent(&engine);
787 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
788 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
790 QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
791 QCOMPARE(textObject->styleColor(), QColor());
794 for (int i = 0; i < colorStrings.size(); i++)
796 QString componentStr = "import QtQuick 1.0\nText { styleColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
797 QDeclarativeComponent textComponent(&engine);
798 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
799 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
801 QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(i)));
802 // default color to black?
803 QCOMPARE(textObject->color(), QColor("black"));
806 for (int i = 0; i < colorStrings.size(); i++)
808 for (int j = 0; j < colorStrings.size(); j++)
810 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; styleColor: \"" + colorStrings.at(j) + "\"; text: \"Hello World\" }";
811 QDeclarativeComponent textComponent(&engine);
812 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
813 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
815 QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
816 QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(j)));
820 QString colorStr = "#AA001234";
821 QColor testColor("#001234");
822 testColor.setAlpha(170);
824 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStr + "\"; text: \"Hello World\" }";
825 QDeclarativeComponent textComponent(&engine);
826 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
827 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
829 QCOMPARE(textObject->color(), testColor);
833 void tst_qdeclarativetext::smooth()
835 for (int i = 0; i < standard.size(); i++)
838 QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + standard.at(i) + "\" }";
839 QDeclarativeComponent textComponent(&engine);
840 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
841 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
842 QCOMPARE(textObject->smooth(), true);
845 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
846 QDeclarativeComponent textComponent(&engine);
847 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
848 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
849 QCOMPARE(textObject->smooth(), false);
852 for (int i = 0; i < richText.size(); i++)
855 QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + richText.at(i) + "\" }";
856 QDeclarativeComponent textComponent(&engine);
857 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
858 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
859 QCOMPARE(textObject->smooth(), true);
862 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
863 QDeclarativeComponent textComponent(&engine);
864 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
865 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
866 QCOMPARE(textObject->smooth(), false);
871 void tst_qdeclarativetext::weight()
874 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
875 QDeclarativeComponent textComponent(&engine);
876 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
877 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
879 QVERIFY(textObject != 0);
880 QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Normal);
883 QString componentStr = "import QtQuick 1.0\nText { font.weight: \"Bold\"; text: \"Hello world!\" }";
884 QDeclarativeComponent textComponent(&engine);
885 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
886 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
888 QVERIFY(textObject != 0);
889 QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Bold);
893 void tst_qdeclarativetext::underline()
896 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
897 QDeclarativeComponent textComponent(&engine);
898 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
899 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
901 QVERIFY(textObject != 0);
902 QCOMPARE(textObject->font().underline(), false);
905 QString componentStr = "import QtQuick 1.0\nText { font.underline: true; text: \"Hello world!\" }";
906 QDeclarativeComponent textComponent(&engine);
907 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
908 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
910 QVERIFY(textObject != 0);
911 QCOMPARE(textObject->font().underline(), true);
915 void tst_qdeclarativetext::overline()
918 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
919 QDeclarativeComponent textComponent(&engine);
920 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
921 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
923 QVERIFY(textObject != 0);
924 QCOMPARE(textObject->font().overline(), false);
927 QString componentStr = "import QtQuick 1.0\nText { font.overline: true; text: \"Hello world!\" }";
928 QDeclarativeComponent textComponent(&engine);
929 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
930 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
932 QVERIFY(textObject != 0);
933 QCOMPARE(textObject->font().overline(), true);
937 void tst_qdeclarativetext::strikeout()
940 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
941 QDeclarativeComponent textComponent(&engine);
942 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
943 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
945 QVERIFY(textObject != 0);
946 QCOMPARE(textObject->font().strikeOut(), false);
949 QString componentStr = "import QtQuick 1.0\nText { font.strikeout: true; text: \"Hello world!\" }";
950 QDeclarativeComponent textComponent(&engine);
951 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
952 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
954 QVERIFY(textObject != 0);
955 QCOMPARE(textObject->font().strikeOut(), true);
959 void tst_qdeclarativetext::capitalization()
962 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
963 QDeclarativeComponent textComponent(&engine);
964 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
965 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
967 QVERIFY(textObject != 0);
968 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::MixedCase);
971 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllUppercase\" }";
972 QDeclarativeComponent textComponent(&engine);
973 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
974 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
976 QVERIFY(textObject != 0);
977 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllUppercase);
980 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllLowercase\" }";
981 QDeclarativeComponent textComponent(&engine);
982 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
983 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
985 QVERIFY(textObject != 0);
986 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllLowercase);
989 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"SmallCaps\" }";
990 QDeclarativeComponent textComponent(&engine);
991 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
992 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
994 QVERIFY(textObject != 0);
995 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::SmallCaps);
998 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"Capitalize\" }";
999 QDeclarativeComponent textComponent(&engine);
1000 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1001 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1003 QVERIFY(textObject != 0);
1004 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::Capitalize);
1008 void tst_qdeclarativetext::letterSpacing()
1011 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1012 QDeclarativeComponent textComponent(&engine);
1013 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1014 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1016 QVERIFY(textObject != 0);
1017 QCOMPARE(textObject->font().letterSpacing(), 0.0);
1020 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: -2 }";
1021 QDeclarativeComponent textComponent(&engine);
1022 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1023 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1025 QVERIFY(textObject != 0);
1026 QCOMPARE(textObject->font().letterSpacing(), -2.);
1029 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: 3 }";
1030 QDeclarativeComponent textComponent(&engine);
1031 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1032 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1034 QVERIFY(textObject != 0);
1035 QCOMPARE(textObject->font().letterSpacing(), 3.);
1039 void tst_qdeclarativetext::wordSpacing()
1042 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1043 QDeclarativeComponent textComponent(&engine);
1044 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1045 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1047 QVERIFY(textObject != 0);
1048 QCOMPARE(textObject->font().wordSpacing(), 0.0);
1051 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: -50 }";
1052 QDeclarativeComponent textComponent(&engine);
1053 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1054 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1056 QVERIFY(textObject != 0);
1057 QCOMPARE(textObject->font().wordSpacing(), -50.);
1060 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: 200 }";
1061 QDeclarativeComponent textComponent(&engine);
1062 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1063 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1065 QVERIFY(textObject != 0);
1066 QCOMPARE(textObject->font().wordSpacing(), 200.);
1070 void tst_qdeclarativetext::QTBUG_12291()
1072 QDeclarativeView *canvas = createView(SRCDIR "/data/rotated.qml");
1075 QApplication::setActiveWindow(canvas);
1076 QTest::qWaitForWindowShown(canvas);
1077 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1079 QObject *ob = canvas->rootObject();
1082 QDeclarativeText *text = ob->findChild<QDeclarativeText*>("text");
1084 QVERIFY(text->boundingRect().isValid());
1089 class EventSender : public QGraphicsItem
1092 void sendEvent(QEvent *event) { sceneEvent(event); }
1095 class LinkTest : public QObject
1104 void linkClicked(QString l) { link = l; }
1107 void tst_qdeclarativetext::clickLink()
1110 QString componentStr = "import QtQuick 1.0\nText { text: \"<a href=\\\"http://qt.nokia.com\\\">Hello world!</a>\" }";
1111 QDeclarativeComponent textComponent(&engine);
1112 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1113 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1115 QVERIFY(textObject != 0);
1118 QObject::connect(textObject, SIGNAL(linkActivated(QString)), &test, SLOT(linkClicked(QString)));
1121 QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMousePress);
1122 me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
1123 me.setButton(Qt::LeftButton);
1124 static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me);
1128 QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMouseRelease);
1129 me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
1130 me.setButton(Qt::LeftButton);
1131 static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me);
1134 QCOMPARE(test.link, QLatin1String("http://qt.nokia.com"));
1138 void tst_qdeclarativetext::embeddedImages_data()
1140 QTest::addColumn<QUrl>("qmlfile");
1141 QTest::addColumn<QString>("error");
1142 QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocal.qml") << "";
1143 QTest::newRow("local-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml")
1144 << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml").toString()+":3:1: QML Text: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/http/notexists.png").toString();
1145 QTest::newRow("remote") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemote.qml") << "";
1146 QTest::newRow("remote-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml")
1147 << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml").toString()+":3:1: QML Text: Error downloading http://127.0.0.1:14453/notexists.png - server replied: Not found";
1150 void tst_qdeclarativetext::embeddedImages()
1154 QFETCH(QUrl, qmlfile);
1155 QFETCH(QString, error);
1157 TestHTTPServer server(14453);
1158 server.serveDirectory(SRCDIR "/data/http");
1160 if (!error.isEmpty())
1161 QTest::ignoreMessage(QtWarningMsg, error.toLatin1());
1163 QDeclarativeComponent textComponent(&engine, qmlfile);
1164 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1166 QVERIFY(textObject != 0);
1168 QTRY_COMPARE(textObject->resourcesLoading(), 0);
1170 QPixmap pm(SRCDIR "/data/http/exists.png");
1171 if (error.isEmpty()) {
1172 QCOMPARE(textObject->width(), double(pm.width()));
1173 QCOMPARE(textObject->height(), double(pm.height()));
1175 QVERIFY(16 != pm.width()); // check test is effective
1176 QCOMPARE(textObject->width(), 16.0); // default size of QTextDocument broken image icon
1177 QCOMPARE(textObject->height(), 16.0);
1183 void tst_qdeclarativetext::lineCount()
1185 QDeclarativeView *canvas = createView(SRCDIR "/data/lineCount.qml");
1187 QDeclarativeText *myText = canvas->rootObject()->findChild<QDeclarativeText*>("myText");
1188 QVERIFY(myText != 0);
1190 QVERIFY(myText->lineCount() > 1);
1191 QVERIFY(!myText->truncated());
1192 QCOMPARE(myText->maximumLineCount(), INT_MAX);
1194 myText->setMaximumLineCount(2);
1195 QCOMPARE(myText->lineCount(), 2);
1196 QCOMPARE(myText->truncated(), true);
1197 QCOMPARE(myText->maximumLineCount(), 2);
1199 myText->resetMaximumLineCount();
1200 QCOMPARE(myText->maximumLineCount(), INT_MAX);
1201 QCOMPARE(myText->truncated(), false);
1203 myText->setElideMode(QDeclarativeText::ElideRight);
1204 myText->setMaximumLineCount(2);
1205 QCOMPARE(myText->lineCount(), 2);
1206 QCOMPARE(myText->truncated(), true);
1207 QCOMPARE(myText->maximumLineCount(), 2);
1212 void tst_qdeclarativetext::lineHeight()
1214 QDeclarativeView *canvas = createView(SRCDIR "/data/lineHeight.qml");
1216 QDeclarativeText *myText = canvas->rootObject()->findChild<QDeclarativeText*>("myText");
1217 QVERIFY(myText != 0);
1219 QVERIFY(myText->lineHeight() == 1);
1220 QVERIFY(myText->lineHeightMode() == QDeclarativeText::ProportionalHeight);
1222 qreal h = myText->height();
1223 myText->setLineHeight(1.5);
1224 QVERIFY(myText->height() == h * 1.5);
1226 myText->setLineHeightMode(QDeclarativeText::FixedHeight);
1227 myText->setLineHeight(20);
1228 QCOMPARE(myText->height(), myText->lineCount() * 20.0);
1230 myText->setText("Lorem ipsum sit <b>amet</b>, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum.");
1231 myText->setLineHeightMode(QDeclarativeText::ProportionalHeight);
1232 myText->setLineHeight(1.0);
1234 qreal h2 = myText->height();
1235 myText->setLineHeight(2.0);
1236 QEXPECT_FAIL("", "QTBUG-17325", Continue);
1237 QVERIFY(myText->height() == h2 * 2.0);
1239 myText->setLineHeightMode(QDeclarativeText::FixedHeight);
1240 myText->setLineHeight(10);
1241 QEXPECT_FAIL("", "QTBUG-17325", Continue);
1242 QCOMPARE(myText->height(), myText->lineCount() * 10.0);
1247 void tst_qdeclarativetext::implicitSize_data()
1249 QTest::addColumn<QString>("text");
1250 QTest::addColumn<QString>("wrap");
1251 QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "Text.NoWrap";
1252 QTest::newRow("richtext") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.NoWrap";
1253 QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "Text.Wrap";
1254 QTest::newRow("richtext_wrap") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.Wrap";
1257 void tst_qdeclarativetext::implicitSize()
1259 QFETCH(QString, text);
1260 QFETCH(QString, wrap);
1261 QString componentStr = "import QtQuick 1.1\nText { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }";
1262 QDeclarativeComponent textComponent(&engine);
1263 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1264 QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
1266 QVERIFY(textObject->width() < textObject->implicitWidth());
1267 QVERIFY(textObject->height() == textObject->implicitHeight());
1269 textObject->resetWidth();
1270 QVERIFY(textObject->width() == textObject->implicitWidth());
1271 QVERIFY(textObject->height() == textObject->implicitHeight());
1274 void tst_qdeclarativetext::testQtQuick11Attributes()
1276 QFETCH(QString, code);
1277 QFETCH(QString, warning);
1278 QFETCH(QString, error);
1280 QDeclarativeEngine engine;
1283 QDeclarativeComponent valid(&engine);
1284 valid.setData("import QtQuick 1.1; Text { " + code.toUtf8() + " }", QUrl(""));
1285 obj = valid.create();
1287 QVERIFY(valid.errorString().isEmpty());
1290 QDeclarativeComponent invalid(&engine);
1291 invalid.setData("import QtQuick 1.0; Text { " + code.toUtf8() + " }", QUrl(""));
1292 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
1293 obj = invalid.create();
1294 QCOMPARE(invalid.errorString(), error);
1298 void tst_qdeclarativetext::testQtQuick11Attributes_data()
1300 QTest::addColumn<QString>("code");
1301 QTest::addColumn<QString>("warning");
1302 QTest::addColumn<QString>("error");
1304 QTest::newRow("maximumLineCount") << "maximumLineCount: 4"
1305 << "QDeclarativeComponent: Component is not ready"
1306 << ":1 \"Text.maximumLineCount\" is not available in QtQuick 1.0.\n";
1308 QTest::newRow("lineHeight") << "lineHeight: 2"
1309 << "QDeclarativeComponent: Component is not ready"
1310 << ":1 \"Text.lineHeight\" is not available in QtQuick 1.0.\n";
1312 QTest::newRow("lineHeightMode") << "lineHeightMode: Text.ProportionalHeight"
1313 << "QDeclarativeComponent: Component is not ready"
1314 << ":1 \"Text.lineHeightMode\" is not available in QtQuick 1.0.\n";
1316 QTest::newRow("lineCount") << "property int foo: lineCount"
1317 << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount"
1320 QTest::newRow("truncated") << "property bool foo: truncated"
1321 << "<Unknown File>:1: ReferenceError: Can't find variable: truncated"
1325 void tst_qdeclarativetext::qtbug_14734()
1327 QDeclarativeView *canvas = createView(SRCDIR "/data/qtbug_14734.qml");
1331 QApplication::setActiveWindow(canvas);
1332 QTest::qWaitForWindowShown(canvas);
1333 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1338 QTEST_MAIN(tst_qdeclarativetext)
1340 #include "tst_qdeclarativetext.moc"