1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
7 ** This file is part of the test suite of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
42 #include <QTextDocument>
43 #include <QtDeclarative/qdeclarativeengine.h>
44 #include <QtDeclarative/qdeclarativecomponent.h>
45 #include <QtQuick1/private/qdeclarativetext_p.h>
46 #include <QtQuick1/private/qdeclarativetext_p_p.h>
47 #include <private/qdeclarativevaluetype_p.h>
48 #include <QFontMetrics>
49 #include <QGraphicsSceneMouseEvent>
51 #include <QtQuick1/QDeclarativeView>
52 #include <private/qapplication_p.h>
55 #include "testhttpserver.h"
57 class tst_qdeclarativetext : public QObject
61 tst_qdeclarativetext();
70 void alignments_data();
73 void embeddedImages_data();
74 void embeddedImages();
79 // ### these tests may be trivial
80 void horizontalAlignment();
81 void horizontalAlignment_RightToLeft();
82 void verticalAlignment();
88 // QDeclarativeFontValueType
93 void capitalization();
100 void implicitSize_data();
102 void testQtQuick11Attributes();
103 void testQtQuick11Attributes_data();
107 QStringList standard;
108 QStringList richText;
110 QStringList horizontalAlignmentmentStrings;
111 QStringList verticalAlignmentmentStrings;
113 QList<Qt::Alignment> verticalAlignmentments;
114 QList<Qt::Alignment> horizontalAlignmentments;
116 QStringList styleStrings;
117 QList<QDeclarative1Text::TextStyle> styles;
119 QStringList colorStrings;
121 QDeclarativeEngine engine;
123 QDeclarativeView *createView(const QString &filename);
126 tst_qdeclarativetext::tst_qdeclarativetext()
128 standard << "the quick brown fox jumped over the lazy dog"
129 << "the quick brown fox\n jumped over the lazy dog";
131 richText << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a> jumped over the <b>lazy</b> dog</i>"
132 << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
134 horizontalAlignmentmentStrings << "AlignLeft"
138 verticalAlignmentmentStrings << "AlignTop"
142 horizontalAlignmentments << Qt::AlignLeft
146 verticalAlignmentments << Qt::AlignTop
150 styleStrings << "Normal"
155 styles << QDeclarative1Text::Normal
156 << QDeclarative1Text::Outline
157 << QDeclarative1Text::Raised
158 << QDeclarative1Text::Sunken;
160 colorStrings << "aliceblue"
173 // need a different test to do alpha channel test
179 QDeclarativeView *tst_qdeclarativetext::createView(const QString &filename)
181 QDeclarativeView *canvas = new QDeclarativeView(0);
183 canvas->setSource(QUrl::fromLocalFile(filename));
187 void tst_qdeclarativetext::text()
190 QDeclarativeComponent textComponent(&engine);
191 textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
192 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
194 QVERIFY(textObject != 0);
195 QCOMPARE(textObject->text(), QString(""));
196 QVERIFY(textObject->width() == 0);
201 for (int i = 0; i < standard.size(); i++)
203 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
204 QDeclarativeComponent textComponent(&engine);
205 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
207 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
209 QVERIFY(textObject != 0);
210 QCOMPARE(textObject->text(), standard.at(i));
211 QVERIFY(textObject->width() > 0);
216 for (int i = 0; i < richText.size(); i++)
218 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
219 QDeclarativeComponent textComponent(&engine);
220 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
221 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
223 QVERIFY(textObject != 0);
224 QString expected = richText.at(i);
225 QCOMPARE(textObject->text(), expected.replace("\\\"", "\""));
226 QVERIFY(textObject->width() > 0);
232 void tst_qdeclarativetext::width()
234 // uses Font metrics to find the width for standard and document to find the width for rich
236 QDeclarativeComponent textComponent(&engine);
237 textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
238 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
240 QVERIFY(textObject != 0);
241 QCOMPARE(textObject->width(), 0.);
246 for (int i = 0; i < standard.size(); i++)
248 QVERIFY(!Qt::mightBeRichText(standard.at(i))); // self-test
252 qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
253 metricWidth = qCeil(metricWidth);
255 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
256 QDeclarativeComponent textComponent(&engine);
257 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
258 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
260 QVERIFY(textObject != 0);
261 QVERIFY(textObject->boundingRect().width() > 0);
262 QCOMPARE(textObject->width(), qreal(metricWidth));
263 QVERIFY(textObject->textFormat() == QDeclarative1Text::AutoText); // setting text doesn't change format
268 for (int i = 0; i < richText.size(); i++)
270 QVERIFY(Qt::mightBeRichText(richText.at(i))); // self-test
272 QTextDocument document;
273 document.setHtml(richText.at(i));
274 document.setDocumentMargin(0);
276 int documentWidth = document.idealWidth();
278 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
279 QDeclarativeComponent textComponent(&engine);
280 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
281 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
283 QVERIFY(textObject != 0);
284 QCOMPARE(textObject->width(), qreal(documentWidth));
285 QVERIFY(textObject->textFormat() == QDeclarative1Text::AutoText); // setting text doesn't change format
291 void tst_qdeclarativetext::wrap()
294 // for specified width and wrap set true
296 QDeclarativeComponent textComponent(&engine);
297 textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; wrapMode: Text.WordWrap; width: 300 }", QUrl::fromLocalFile(""));
298 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
299 textHeight = textObject->height();
301 QVERIFY(textObject != 0);
302 QVERIFY(textObject->wrapMode() == QDeclarative1Text::WordWrap);
303 QCOMPARE(textObject->width(), 300.);
308 for (int i = 0; i < standard.size(); i++)
310 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + standard.at(i) + "\" }";
311 QDeclarativeComponent textComponent(&engine);
312 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
313 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
315 QVERIFY(textObject != 0);
316 QCOMPARE(textObject->width(), 30.);
317 QVERIFY(textObject->height() > textHeight);
319 int oldHeight = textObject->height();
320 textObject->setWidth(100);
321 QVERIFY(textObject->height() < oldHeight);
326 for (int i = 0; i < richText.size(); i++)
328 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + richText.at(i) + "\" }";
329 QDeclarativeComponent textComponent(&engine);
330 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
331 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
333 QVERIFY(textObject != 0);
334 QCOMPARE(textObject->width(), 30.);
335 QVERIFY(textObject->height() > textHeight);
337 qreal oldHeight = textObject->height();
338 textObject->setWidth(100);
339 QVERIFY(textObject->height() < oldHeight);
344 // richtext again with a fixed height
345 for (int i = 0; i < richText.size(); i++)
347 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; height: 50; text: \"" + richText.at(i) + "\" }";
348 QDeclarativeComponent textComponent(&engine);
349 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
350 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
352 QVERIFY(textObject != 0);
353 QCOMPARE(textObject->width(), 30.);
354 QVERIFY(textObject->implicitHeight() > textHeight);
356 qreal oldHeight = textObject->implicitHeight();
357 textObject->setWidth(100);
358 QVERIFY(textObject->implicitHeight() < oldHeight);
364 void tst_qdeclarativetext::elide()
366 for (QDeclarative1Text::TextElideMode m = QDeclarative1Text::ElideLeft; m<=QDeclarative1Text::ElideNone; m=QDeclarative1Text::TextElideMode(int(m)+1)) {
367 const char* elidename[]={"ElideLeft", "ElideRight", "ElideMiddle", "ElideNone"};
368 QString elide = "elide: Text." + QString(elidename[int(m)]) + ";";
370 // XXX Poor coverage.
373 QDeclarativeComponent textComponent(&engine);
374 textComponent.setData(("import QtQuick 1.0\nText { text: \"\"; "+elide+" width: 100 }").toLatin1(), QUrl::fromLocalFile(""));
375 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
377 QCOMPARE(textObject->elideMode(), m);
378 QCOMPARE(textObject->width(), 100.);
383 for (int i = 0; i < standard.size(); i++)
385 QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + standard.at(i) + "\" }";
386 QDeclarativeComponent textComponent(&engine);
387 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
388 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
390 QCOMPARE(textObject->elideMode(), m);
391 QCOMPARE(textObject->width(), 100.);
396 // richtext - does nothing
397 for (int i = 0; i < richText.size(); i++)
399 QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + richText.at(i) + "\" }";
400 QDeclarativeComponent textComponent(&engine);
401 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
402 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
404 QCOMPARE(textObject->elideMode(), m);
405 QCOMPARE(textObject->width(), 100.);
412 QUrl qmlfile = QUrl::fromLocalFile(SRCDIR "/data/elideimplicitwidth.qml");
413 QDeclarativeComponent textComponent(&engine, qmlfile);
414 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(textComponent.create());
416 QVERIFY(item->implicitWidth() > item->width());
419 void tst_qdeclarativetext::textFormat()
422 QDeclarativeComponent textComponent(&engine);
423 textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; textFormat: Text.RichText }", QUrl::fromLocalFile(""));
424 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
426 QVERIFY(textObject != 0);
427 QVERIFY(textObject->textFormat() == QDeclarative1Text::RichText);
432 QDeclarativeComponent textComponent(&engine);
433 textComponent.setData("import QtQuick 1.0\nText { text: \"<b>Hello</b>\"; textFormat: Text.PlainText }", QUrl::fromLocalFile(""));
434 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
436 QVERIFY(textObject != 0);
437 QVERIFY(textObject->textFormat() == QDeclarative1Text::PlainText);
444 void tst_qdeclarativetext::alignments_data()
446 QTest::addColumn<int>("hAlign");
447 QTest::addColumn<int>("vAlign");
448 QTest::addColumn<QString>("expectfile");
450 QTest::newRow("LT") << int(Qt::AlignLeft) << int(Qt::AlignTop) << SRCDIR "/data/alignments_lt.png";
451 QTest::newRow("RT") << int(Qt::AlignRight) << int(Qt::AlignTop) << SRCDIR "/data/alignments_rt.png";
452 QTest::newRow("CT") << int(Qt::AlignHCenter) << int(Qt::AlignTop) << SRCDIR "/data/alignments_ct.png";
454 QTest::newRow("LB") << int(Qt::AlignLeft) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_lb.png";
455 QTest::newRow("RB") << int(Qt::AlignRight) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_rb.png";
456 QTest::newRow("CB") << int(Qt::AlignHCenter) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_cb.png";
458 QTest::newRow("LC") << int(Qt::AlignLeft) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_lc.png";
459 QTest::newRow("RC") << int(Qt::AlignRight) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_rc.png";
460 QTest::newRow("CC") << int(Qt::AlignHCenter) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_cc.png";
464 void tst_qdeclarativetext::alignments()
468 QFETCH(QString, expectfile);
471 // Font-specific, but not likely platform-specific, so only test on one platform
473 fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*");
474 QApplication::setFont(fn);
477 QDeclarativeView *canvas = createView(SRCDIR "/data/alignments.qml");
480 QApplication::setActiveWindow(canvas);
481 QTest::qWaitForWindowShown(canvas);
482 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
484 QObject *ob = canvas->rootObject();
486 ob->setProperty("horizontalAlignment",hAlign);
487 ob->setProperty("verticalAlignment",vAlign);
488 QTRY_COMPARE(ob->property("running").toBool(),false);
489 QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32);
490 actual.fill(qRgb(255,255,255));
494 QImage expect(expectfile);
497 // Font-specific, but not likely platform-specific, so only test on one platform
498 if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") {
499 QCOMPARE(actual,expect);
506 //the alignment tests may be trivial o.oa
507 void tst_qdeclarativetext::horizontalAlignment()
509 //test one align each, and then test if two align fails.
511 for (int i = 0; i < standard.size(); i++)
513 for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
515 QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
516 QDeclarativeComponent textComponent(&engine);
517 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
518 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
520 QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
526 for (int i = 0; i < richText.size(); i++)
528 for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
530 QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
531 QDeclarativeComponent textComponent(&engine);
532 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
533 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
535 QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
543 void tst_qdeclarativetext::horizontalAlignment_RightToLeft()
545 QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml");
546 QDeclarative1Text *text = canvas->rootObject()->findChild<QDeclarative1Text*>("text");
550 QDeclarative1TextPrivate *textPrivate = QDeclarative1TextPrivate::get(text);
551 QVERIFY(textPrivate != 0);
553 // implicit alignment should follow the reading direction of RTL text
554 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
555 QCOMPARE(text->effectiveHAlign(), text->hAlign());
556 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
558 // explicitly left aligned text
559 text->setHAlign(QDeclarative1Text::AlignLeft);
560 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
561 QCOMPARE(text->effectiveHAlign(), text->hAlign());
562 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
564 // explicitly right aligned text
565 text->setHAlign(QDeclarative1Text::AlignRight);
566 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
567 QCOMPARE(text->effectiveHAlign(), text->hAlign());
568 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
570 // change to rich text
571 QString textString = text->text();
572 text->setText(QString("<i>") + textString + QString("</i>"));
573 text->setTextFormat(QDeclarative1Text::RichText);
576 // implicitly aligned rich text should follow the reading direction of text
577 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
578 QCOMPARE(text->effectiveHAlign(), text->hAlign());
579 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
581 // explicitly left aligned rich text
582 text->setHAlign(QDeclarative1Text::AlignLeft);
583 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
584 QCOMPARE(text->effectiveHAlign(), text->hAlign());
585 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignRight);
587 // explicitly right aligned rich text
588 text->setHAlign(QDeclarative1Text::AlignRight);
589 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
590 QCOMPARE(text->effectiveHAlign(), text->hAlign());
591 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
593 text->setText(textString);
594 text->setTextFormat(QDeclarative1Text::PlainText);
596 // explicitly center aligned
597 text->setHAlign(QDeclarative1Text::AlignHCenter);
598 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignHCenter);
599 QCOMPARE(text->effectiveHAlign(), text->hAlign());
600 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
601 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().right() > canvas->width()/2);
603 // reseted alignment should go back to following the text reading direction
605 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
606 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
608 // mirror the text item
609 QDeclarativeItemPrivate::get(text)->setLayoutMirror(true);
611 // mirrored implicit alignment should continue to follow the reading direction of the text
612 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
613 QCOMPARE(text->effectiveHAlign(), QDeclarative1Text::AlignRight);
614 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
616 // mirrored explicitly right aligned behaves as left aligned
617 text->setHAlign(QDeclarative1Text::AlignRight);
618 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
619 QCOMPARE(text->effectiveHAlign(), QDeclarative1Text::AlignLeft);
620 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
622 // mirrored explicitly left aligned behaves as right aligned
623 text->setHAlign(QDeclarative1Text::AlignLeft);
624 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
625 QCOMPARE(text->effectiveHAlign(), QDeclarative1Text::AlignRight);
626 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
629 QDeclarativeItemPrivate::get(text)->setLayoutMirror(false);
632 // English text should be implicitly left aligned
633 text->setText("Hello world!");
634 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
635 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
637 #ifndef Q_OS_MAC // QTBUG-18040
638 // empty text with implicit alignment follows the system locale-based
639 // keyboard input direction from QInputpanel::inputDirection
641 QCOMPARE(text->hAlign(), qApp->inputPanel()->inputDirection() == Qt::LeftToRight ?
642 QDeclarative1Text::AlignLeft : QDeclarative1Text::AlignRight);
643 text->setHAlign(QDeclarative1Text::AlignRight);
644 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
649 #ifndef Q_OS_MAC // QTBUG-18040
650 // alignment of Text with no text set to it
651 QString componentStr = "import QtQuick 1.0\nText {}";
652 QDeclarativeComponent textComponent(&engine);
653 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
654 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
655 QCOMPARE(textObject->hAlign(), qApp->inputPanel()->inputDirection() == Qt::LeftToRight ?
656 QDeclarative1Text::AlignLeft : QDeclarative1Text::AlignRight);
661 void tst_qdeclarativetext::verticalAlignment()
663 //test one align each, and then test if two align fails.
665 for (int i = 0; i < standard.size(); i++)
667 for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
669 QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
670 QDeclarativeComponent textComponent(&engine);
671 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
672 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
674 QVERIFY(textObject != 0);
675 QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
681 for (int i = 0; i < richText.size(); i++)
683 for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
685 QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
686 QDeclarativeComponent textComponent(&engine);
687 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
688 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
690 QVERIFY(textObject != 0);
691 QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
697 //confirm that bounding rect is correctly positioned.
698 QString componentStr = "import QtQuick 1.0\nText { height: 80; text: \"Hello\" }";
699 QDeclarativeComponent textComponent(&engine);
700 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
701 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
702 QVERIFY(textObject != 0);
703 QRectF br = textObject->boundingRect();
704 QVERIFY(br.y() == 0);
706 textObject->setVAlign(QDeclarative1Text::AlignVCenter);
707 br = textObject->boundingRect();
708 QCOMPARE(qFloor(br.y()), qFloor((80.0 - br.height())/2));
710 textObject->setVAlign(QDeclarative1Text::AlignBottom);
711 br = textObject->boundingRect();
712 QCOMPARE(qFloor(br.y()), qFloor(80.0 - br.height()));
717 void tst_qdeclarativetext::font()
719 //test size, then bold, then italic, then family
721 QString componentStr = "import QtQuick 1.0\nText { font.pointSize: 40; text: \"Hello World\" }";
722 QDeclarativeComponent textComponent(&engine);
723 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
724 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
726 QCOMPARE(textObject->font().pointSize(), 40);
727 QCOMPARE(textObject->font().bold(), false);
728 QCOMPARE(textObject->font().italic(), false);
734 QString componentStr = "import QtQuick 1.0\nText { font.pixelSize: 40; text: \"Hello World\" }";
735 QDeclarativeComponent textComponent(&engine);
736 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
737 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
739 QCOMPARE(textObject->font().pixelSize(), 40);
740 QCOMPARE(textObject->font().bold(), false);
741 QCOMPARE(textObject->font().italic(), false);
747 QString componentStr = "import QtQuick 1.0\nText { font.bold: true; text: \"Hello World\" }";
748 QDeclarativeComponent textComponent(&engine);
749 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
750 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
752 QCOMPARE(textObject->font().bold(), true);
753 QCOMPARE(textObject->font().italic(), false);
759 QString componentStr = "import QtQuick 1.0\nText { font.italic: true; text: \"Hello World\" }";
760 QDeclarativeComponent textComponent(&engine);
761 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
762 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
764 QCOMPARE(textObject->font().italic(), true);
765 QCOMPARE(textObject->font().bold(), false);
771 QString componentStr = "import QtQuick 1.0\nText { font.family: \"Helvetica\"; text: \"Hello World\" }";
772 QDeclarativeComponent textComponent(&engine);
773 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
774 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
776 QCOMPARE(textObject->font().family(), QString("Helvetica"));
777 QCOMPARE(textObject->font().bold(), false);
778 QCOMPARE(textObject->font().italic(), false);
784 QString componentStr = "import QtQuick 1.0\nText { font.family: \"\"; text: \"Hello World\" }";
785 QDeclarativeComponent textComponent(&engine);
786 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
787 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
789 QCOMPARE(textObject->font().family(), QString(""));
795 void tst_qdeclarativetext::style()
798 for (int i = 0; i < styles.size(); i++)
800 QString componentStr = "import QtQuick 1.0\nText { style: \"" + styleStrings.at(i) + "\"; styleColor: \"white\"; text: \"Hello World\" }";
801 QDeclarativeComponent textComponent(&engine);
802 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
803 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
805 QCOMPARE((int)textObject->style(), (int)styles.at(i));
806 QCOMPARE(textObject->styleColor(), QColor("white"));
810 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello World\" }";
811 QDeclarativeComponent textComponent(&engine);
812 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
813 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
815 QRectF brPre = textObject->boundingRect();
816 textObject->setStyle(QDeclarative1Text::Outline);
817 QRectF brPost = textObject->boundingRect();
819 QVERIFY(brPre.width() < brPost.width());
820 QVERIFY(brPre.height() < brPost.height());
825 void tst_qdeclarativetext::color()
828 for (int i = 0; i < colorStrings.size(); i++)
830 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
831 QDeclarativeComponent textComponent(&engine);
832 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
833 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
835 QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
836 QCOMPARE(textObject->styleColor(), QColor());
841 for (int i = 0; i < colorStrings.size(); i++)
843 QString componentStr = "import QtQuick 1.0\nText { styleColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
844 QDeclarativeComponent textComponent(&engine);
845 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
846 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
848 QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(i)));
849 // default color to black?
850 QCOMPARE(textObject->color(), QColor("black"));
855 for (int i = 0; i < colorStrings.size(); i++)
857 for (int j = 0; j < colorStrings.size(); j++)
859 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; styleColor: \"" + colorStrings.at(j) + "\"; text: \"Hello World\" }";
860 QDeclarativeComponent textComponent(&engine);
861 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
862 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
864 QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
865 QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(j)));
871 QString colorStr = "#AA001234";
872 QColor testColor("#001234");
873 testColor.setAlpha(170);
875 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStr + "\"; text: \"Hello World\" }";
876 QDeclarativeComponent textComponent(&engine);
877 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
878 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
880 QCOMPARE(textObject->color(), testColor);
886 void tst_qdeclarativetext::smooth()
888 for (int i = 0; i < standard.size(); i++)
891 QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + standard.at(i) + "\" }";
892 QDeclarativeComponent textComponent(&engine);
893 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
894 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
895 QCOMPARE(textObject->smooth(), true);
900 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
901 QDeclarativeComponent textComponent(&engine);
902 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
903 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
904 QCOMPARE(textObject->smooth(), false);
909 for (int i = 0; i < richText.size(); i++)
912 QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + richText.at(i) + "\" }";
913 QDeclarativeComponent textComponent(&engine);
914 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
915 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
916 QCOMPARE(textObject->smooth(), true);
921 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
922 QDeclarativeComponent textComponent(&engine);
923 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
924 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
925 QCOMPARE(textObject->smooth(), false);
932 void tst_qdeclarativetext::weight()
935 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
936 QDeclarativeComponent textComponent(&engine);
937 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
938 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
940 QVERIFY(textObject != 0);
941 QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Normal);
946 QString componentStr = "import QtQuick 1.0\nText { font.weight: \"Bold\"; text: \"Hello world!\" }";
947 QDeclarativeComponent textComponent(&engine);
948 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
949 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
951 QVERIFY(textObject != 0);
952 QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Bold);
958 void tst_qdeclarativetext::underline()
961 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
962 QDeclarativeComponent textComponent(&engine);
963 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
964 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
966 QVERIFY(textObject != 0);
967 QCOMPARE(textObject->font().underline(), false);
972 QString componentStr = "import QtQuick 1.0\nText { font.underline: true; text: \"Hello world!\" }";
973 QDeclarativeComponent textComponent(&engine);
974 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
975 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
977 QVERIFY(textObject != 0);
978 QCOMPARE(textObject->font().underline(), true);
984 void tst_qdeclarativetext::overline()
987 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
988 QDeclarativeComponent textComponent(&engine);
989 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
990 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
992 QVERIFY(textObject != 0);
993 QCOMPARE(textObject->font().overline(), false);
998 QString componentStr = "import QtQuick 1.0\nText { font.overline: true; text: \"Hello world!\" }";
999 QDeclarativeComponent textComponent(&engine);
1000 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1001 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1003 QVERIFY(textObject != 0);
1004 QCOMPARE(textObject->font().overline(), true);
1010 void tst_qdeclarativetext::strikeout()
1013 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1014 QDeclarativeComponent textComponent(&engine);
1015 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1016 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1018 QVERIFY(textObject != 0);
1019 QCOMPARE(textObject->font().strikeOut(), false);
1024 QString componentStr = "import QtQuick 1.0\nText { font.strikeout: true; text: \"Hello world!\" }";
1025 QDeclarativeComponent textComponent(&engine);
1026 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1027 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1029 QVERIFY(textObject != 0);
1030 QCOMPARE(textObject->font().strikeOut(), true);
1036 void tst_qdeclarativetext::capitalization()
1039 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1040 QDeclarativeComponent textComponent(&engine);
1041 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1042 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1044 QVERIFY(textObject != 0);
1045 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::MixedCase);
1050 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllUppercase\" }";
1051 QDeclarativeComponent textComponent(&engine);
1052 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1053 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1055 QVERIFY(textObject != 0);
1056 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllUppercase);
1061 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllLowercase\" }";
1062 QDeclarativeComponent textComponent(&engine);
1063 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1064 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1066 QVERIFY(textObject != 0);
1067 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllLowercase);
1072 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"SmallCaps\" }";
1073 QDeclarativeComponent textComponent(&engine);
1074 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1075 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1077 QVERIFY(textObject != 0);
1078 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::SmallCaps);
1083 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"Capitalize\" }";
1084 QDeclarativeComponent textComponent(&engine);
1085 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1086 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1088 QVERIFY(textObject != 0);
1089 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::Capitalize);
1095 void tst_qdeclarativetext::letterSpacing()
1098 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1099 QDeclarativeComponent textComponent(&engine);
1100 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1101 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1103 QVERIFY(textObject != 0);
1104 QCOMPARE(textObject->font().letterSpacing(), 0.0);
1109 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: -2 }";
1110 QDeclarativeComponent textComponent(&engine);
1111 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1112 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1114 QVERIFY(textObject != 0);
1115 QCOMPARE(textObject->font().letterSpacing(), -2.);
1120 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: 3 }";
1121 QDeclarativeComponent textComponent(&engine);
1122 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1123 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1125 QVERIFY(textObject != 0);
1126 QCOMPARE(textObject->font().letterSpacing(), 3.);
1132 void tst_qdeclarativetext::wordSpacing()
1135 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1136 QDeclarativeComponent textComponent(&engine);
1137 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1138 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1140 QVERIFY(textObject != 0);
1141 QCOMPARE(textObject->font().wordSpacing(), 0.0);
1146 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: -50 }";
1147 QDeclarativeComponent textComponent(&engine);
1148 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1149 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1151 QVERIFY(textObject != 0);
1152 QCOMPARE(textObject->font().wordSpacing(), -50.);
1157 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: 200 }";
1158 QDeclarativeComponent textComponent(&engine);
1159 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1160 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1162 QVERIFY(textObject != 0);
1163 QCOMPARE(textObject->font().wordSpacing(), 200.);
1169 void tst_qdeclarativetext::QTBUG_12291()
1171 QDeclarativeView *canvas = createView(SRCDIR "/data/rotated.qml");
1174 QApplication::setActiveWindow(canvas);
1175 QTest::qWaitForWindowShown(canvas);
1176 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1178 QObject *ob = canvas->rootObject();
1181 QDeclarative1Text *text = ob->findChild<QDeclarative1Text*>("text");
1183 QVERIFY(text->boundingRect().isValid());
1188 class EventSender : public QGraphicsItem
1191 void sendEvent(QEvent *event) { sceneEvent(event); }
1194 class LinkTest : public QObject
1203 void linkClicked(QString l) { link = l; }
1206 void tst_qdeclarativetext::clickLink()
1209 QString componentStr = "import QtQuick 1.0\nText { text: \"<a href=\\\"http://qt.nokia.com\\\">Hello world!</a>\" }";
1210 QDeclarativeComponent textComponent(&engine);
1211 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1212 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1214 QVERIFY(textObject != 0);
1217 QObject::connect(textObject, SIGNAL(linkActivated(QString)), &test, SLOT(linkClicked(QString)));
1220 QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMousePress);
1221 me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
1222 me.setButton(Qt::LeftButton);
1223 static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me);
1227 QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMouseRelease);
1228 me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
1229 me.setButton(Qt::LeftButton);
1230 static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me);
1233 QCOMPARE(test.link, QLatin1String("http://qt.nokia.com"));
1239 void tst_qdeclarativetext::embeddedImages_data()
1241 QTest::addColumn<QUrl>("qmlfile");
1242 QTest::addColumn<QString>("error");
1243 QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocal.qml") << "";
1244 QTest::newRow("local-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml")
1245 << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml").toString()+":3:1: QML Text: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/http/notexists.png").toString();
1246 QTest::newRow("remote") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemote.qml") << "";
1247 QTest::newRow("remote-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml")
1248 << 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";
1251 void tst_qdeclarativetext::embeddedImages()
1255 QFETCH(QUrl, qmlfile);
1256 QFETCH(QString, error);
1258 TestHTTPServer server(14453);
1259 server.serveDirectory(SRCDIR "/data/http");
1261 if (!error.isEmpty())
1262 QTest::ignoreMessage(QtWarningMsg, error.toLatin1());
1264 QDeclarativeComponent textComponent(&engine, qmlfile);
1265 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1267 QVERIFY(textObject != 0);
1269 QTRY_COMPARE(textObject->resourcesLoading(), 0);
1271 QPixmap pm(SRCDIR "/data/http/exists.png");
1272 if (error.isEmpty()) {
1273 QCOMPARE(textObject->width(), double(pm.width()));
1274 QCOMPARE(textObject->height(), double(pm.height()));
1276 QVERIFY(16 != pm.width()); // check test is effective
1277 QCOMPARE(textObject->width(), 16.0); // default size of QTextDocument broken image icon
1278 QCOMPARE(textObject->height(), 16.0);
1284 void tst_qdeclarativetext::lineCount()
1286 QDeclarativeView *canvas = createView(SRCDIR "/data/lineCount.qml");
1288 QDeclarative1Text *myText = canvas->rootObject()->findChild<QDeclarative1Text*>("myText");
1289 QVERIFY(myText != 0);
1291 QVERIFY(myText->lineCount() > 1);
1292 QVERIFY(!myText->truncated());
1293 QCOMPARE(myText->maximumLineCount(), INT_MAX);
1295 myText->setMaximumLineCount(2);
1296 QCOMPARE(myText->lineCount(), 2);
1297 QCOMPARE(myText->truncated(), true);
1298 QCOMPARE(myText->maximumLineCount(), 2);
1300 myText->resetMaximumLineCount();
1301 QCOMPARE(myText->maximumLineCount(), INT_MAX);
1302 QCOMPARE(myText->truncated(), false);
1304 myText->setElideMode(QDeclarative1Text::ElideRight);
1305 myText->setMaximumLineCount(2);
1306 QCOMPARE(myText->lineCount(), 2);
1307 QCOMPARE(myText->truncated(), true);
1308 QCOMPARE(myText->maximumLineCount(), 2);
1313 void tst_qdeclarativetext::lineHeight()
1315 QDeclarativeView *canvas = createView(SRCDIR "/data/lineHeight.qml");
1317 QDeclarative1Text *myText = canvas->rootObject()->findChild<QDeclarative1Text*>("myText");
1318 QVERIFY(myText != 0);
1320 QVERIFY(myText->lineHeight() == 1);
1321 QVERIFY(myText->lineHeightMode() == QDeclarative1Text::ProportionalHeight);
1323 qreal h = myText->height();
1324 myText->setLineHeight(1.5);
1325 QEXPECT_FAIL("", "QTBUG-21015 fails", Continue);
1326 QVERIFY(myText->height() == h * 1.5);
1328 myText->setLineHeightMode(QDeclarative1Text::FixedHeight);
1329 myText->setLineHeight(20);
1330 QCOMPARE(myText->height(), myText->lineCount() * 20.0);
1332 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.");
1333 myText->setLineHeightMode(QDeclarative1Text::ProportionalHeight);
1334 myText->setLineHeight(1.0);
1336 qreal h2 = myText->height();
1337 myText->setLineHeight(2.0);
1338 QEXPECT_FAIL("", "QTBUG-17325", Continue);
1339 QVERIFY(myText->height() == h2 * 2.0);
1341 myText->setLineHeightMode(QDeclarative1Text::FixedHeight);
1342 myText->setLineHeight(10);
1343 QEXPECT_FAIL("", "QTBUG-17325", Continue);
1344 QCOMPARE(myText->height(), myText->lineCount() * 10.0);
1349 void tst_qdeclarativetext::implicitSize_data()
1351 QTest::addColumn<QString>("text");
1352 QTest::addColumn<QString>("wrap");
1353 QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "Text.NoWrap";
1354 QTest::newRow("richtext") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.NoWrap";
1355 QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "Text.Wrap";
1356 QTest::newRow("richtext_wrap") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.Wrap";
1359 void tst_qdeclarativetext::implicitSize()
1361 QFETCH(QString, text);
1362 QFETCH(QString, wrap);
1363 QString componentStr = "import QtQuick 1.1\nText { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }";
1364 QDeclarativeComponent textComponent(&engine);
1365 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1366 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1368 QVERIFY(textObject->width() < textObject->implicitWidth());
1369 QVERIFY(textObject->height() == textObject->implicitHeight());
1371 textObject->resetWidth();
1372 QVERIFY(textObject->width() == textObject->implicitWidth());
1373 QVERIFY(textObject->height() == textObject->implicitHeight());
1378 void tst_qdeclarativetext::testQtQuick11Attributes()
1380 QFETCH(QString, code);
1381 QFETCH(QString, warning);
1382 QFETCH(QString, error);
1384 QDeclarativeEngine engine;
1387 QDeclarativeComponent valid(&engine);
1388 valid.setData("import QtQuick 1.1; Text { " + code.toUtf8() + " }", QUrl(""));
1389 obj = valid.create();
1391 QVERIFY(valid.errorString().isEmpty());
1394 QDeclarativeComponent invalid(&engine);
1395 invalid.setData("import QtQuick 1.0; Text { " + code.toUtf8() + " }", QUrl(""));
1396 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
1397 obj = invalid.create();
1398 QCOMPARE(invalid.errorString(), error);
1402 void tst_qdeclarativetext::testQtQuick11Attributes_data()
1404 QTest::addColumn<QString>("code");
1405 QTest::addColumn<QString>("warning");
1406 QTest::addColumn<QString>("error");
1408 QTest::newRow("maximumLineCount") << "maximumLineCount: 4"
1409 << "QDeclarativeComponent: Component is not ready"
1410 << ":1 \"Text.maximumLineCount\" is not available in QtQuick 1.0.\n";
1412 QTest::newRow("lineHeight") << "lineHeight: 2"
1413 << "QDeclarativeComponent: Component is not ready"
1414 << ":1 \"Text.lineHeight\" is not available in QtQuick 1.0.\n";
1416 QTest::newRow("lineHeightMode") << "lineHeightMode: Text.ProportionalHeight"
1417 << "QDeclarativeComponent: Component is not ready"
1418 << ":1 \"Text.lineHeightMode\" is not available in QtQuick 1.0.\n";
1420 QTest::newRow("lineCount") << "property int foo: lineCount"
1421 << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount"
1424 QTest::newRow("truncated") << "property bool foo: truncated"
1425 << "<Unknown File>:1: ReferenceError: Can't find variable: truncated"
1429 void tst_qdeclarativetext::qtbug_14734()
1431 QDeclarativeView *canvas = createView(SRCDIR "/data/qtbug_14734.qml");
1435 QApplication::setActiveWindow(canvas);
1436 QTest::qWaitForWindowShown(canvas);
1437 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1442 QTEST_MAIN(tst_qdeclarativetext)
1444 #include "tst_qdeclarativetext.moc"