/**************************************************************************** ** ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this ** file. Please review the following information to ensure the GNU Lesser ** General Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of this ** file. Please review the following information to ensure the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qlabel.h" #include #include #include #include #include #include #include #include //TESTED_CLASS= //TESTED_FILES= #if defined(Q_OS_SYMBIAN) # define SRCDIR "" #endif #include "../../shared/util.h" class Widget : public QWidget { public: Widget() { } QList events; protected: bool event(QEvent *ev) { events.append(ev->type()); return QWidget::event(ev); } }; class tst_QLabel : public QObject { Q_OBJECT public: tst_QLabel(); virtual ~tst_QLabel(); public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void getSetCheck(); void text(); void setText_data(); void setText(); void textFormat(); void setTextFormat(); void buddy(); void setBuddy(); void setFont(); void setNum(); void clear(); void wordWrap(); void eventPropagation_data(); void eventPropagation(); void focusPolicy(); void task190318_sizes(); void sizeHint(); void task226479_movieResize(); void emptyPixmap(); void unicodeText_data(); void unicodeText(); void mnemonic_data(); void mnemonic(); void selection(); #ifndef QT_NO_CONTEXTMENU void taskQTBUG_7902_contextMenuCrash(); #endif private: QLabel *testWidget; QPointer test_box; QPointer test_label; QLineEdit *test_edit; }; // Testing get/set functions void tst_QLabel::getSetCheck() { QLabel obj1; // bool QLabel::wordWrap() // void QLabel::setWordWrap(bool) obj1.setWordWrap(false); QCOMPARE(false, obj1.wordWrap()); obj1.setWordWrap(true); QCOMPARE(true, obj1.wordWrap()); // QWidget * QLabel::buddy() // void QLabel::setBuddy(QWidget *) QWidget *var2 = new QWidget(); obj1.setBuddy(var2); QCOMPARE(var2, obj1.buddy()); obj1.setBuddy((QWidget *)0); QCOMPARE((QWidget *)0, obj1.buddy()); delete var2; // QMovie * QLabel::movie() // void QLabel::setMovie(QMovie *) QMovie *var3 = new QMovie; obj1.setMovie(var3); QCOMPARE(var3, obj1.movie()); obj1.setMovie((QMovie *)0); QCOMPARE((QMovie *)0, obj1.movie()); delete var3; } tst_QLabel::tst_QLabel(): test_box(0) { } tst_QLabel::~tst_QLabel() { } void tst_QLabel::initTestCase() { // Create the test class testWidget = new QLabel(0); testWidget->resize( 200, 200 ); testWidget->show(); } void tst_QLabel::cleanupTestCase() { delete testWidget; testWidget = 0; if (test_box) delete test_box; } void tst_QLabel::init() { testWidget->setTextFormat( Qt::AutoText ); testWidget->setBuddy( 0 ); testWidget->setIndent( 0 ); testWidget->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); testWidget->setScaledContents( FALSE ); } void tst_QLabel::cleanup() { if (QTest::currentTestFunction() == QLatin1String("setBuddy")) { testWidget->show(); delete test_box; // this should delete tst_labl and test_edit as well. } } void tst_QLabel::buddy() { DEPENDS_ON( "setBuddy" ); } void tst_QLabel::setBuddy() { #ifdef Q_WS_MAC QSKIP("Set buddy doesn't make much sense on Mac OS X", SkipAll); #endif testWidget->hide(); test_box = new Widget; test_label= new QLabel( test_box ); test_label->setText( "&Test with a buddy" ); test_edit = new QLineEdit( test_box ); QVBoxLayout *layout = new QVBoxLayout(test_box); layout->addWidget(test_label); layout->addWidget(test_edit); test_box->show(); qApp->setActiveWindow(test_box); QVERIFY(test_box->isActiveWindow()); test_label->setBuddy( test_edit ); test_label->setFocus(); QVERIFY( !test_edit->hasFocus() ); QTest::keyClick( test_box, 't', Qt::AltModifier ); QVERIFY( test_edit->hasFocus() ); delete test_box; } void tst_QLabel::text() { DEPENDS_ON( "setText" ); } void tst_QLabel::setText_data() { QTest::addColumn("txt"); QTest::addColumn("font"); QString prefix = ""; #ifdef Q_OS_WIN32 prefix = "win32_"; #endif QTest::newRow( QString(prefix + "data0").toLatin1() ) << QString("This is a single line") << QString("Helvetica"); QTest::newRow( QString(prefix + "data1").toLatin1() ) << QString("This is the first line\nThis is the second line") << QString("Courier"); QTest::newRow( QString(prefix + "data2").toLatin1() ) << QString("This is the first line\nThis is the second line\nThis is the third line") << QString("Helvetica"); QTest::newRow( QString(prefix + "data3").toLatin1() ) << QString("This is bold richtext") << QString("Courier"); QTest::newRow( QString(prefix + "data4").toLatin1() ) << QString("I Have a &shortcut") << QString("Helvetica"); } void tst_QLabel::setText() { QFETCH( QString, txt ); QFETCH( QString, font ); QFont f( font, 8 ); testWidget->setFont( f ); testWidget->setText( txt ); QCOMPARE( testWidget->text(), txt ); } void tst_QLabel::textFormat() { DEPENDS_ON( "setTextFormat" ); } void tst_QLabel::setTextFormat() { // lets' start with the simple stuff... testWidget->setTextFormat( Qt::PlainText ); QVERIFY( testWidget->textFormat() == Qt::PlainText ); testWidget->setTextFormat( Qt::RichText ); QVERIFY( testWidget->textFormat() == Qt::RichText ); testWidget->setTextFormat( Qt::LogText ); QVERIFY( testWidget->textFormat() == Qt::LogText ); testWidget->setTextFormat( Qt::AutoText ); QVERIFY( testWidget->textFormat() == Qt::AutoText ); } void tst_QLabel::setFont() { DEPENDS_ON( "setText" ); } void tst_QLabel::setNum() { testWidget->setText( "This is a text" ); testWidget->setNum( 12 ); QCOMPARE( testWidget->text(), QString("12") ); testWidget->setNum( 12.345 ); QCOMPARE( testWidget->text(), QString("12.345") ); } void tst_QLabel::clear() { const QString TEXT = "blah blah"; testWidget->setText(TEXT); QCOMPARE(testWidget->text(), TEXT); testWidget->clear(); QVERIFY(testWidget->text().isEmpty()); } void tst_QLabel::wordWrap() { QLabel label; QVERIFY(!label.wordWrap()); label.setText("Plain Text"); QVERIFY(!label.wordWrap()); label.setText("rich text"); QVERIFY(!label.wordWrap()); label.setWordWrap(false); label.setText("rich text"); QVERIFY(!label.wordWrap()); } void tst_QLabel::eventPropagation_data() { QTest::addColumn("text"); QTest::addColumn("textInteractionFlags"); QTest::addColumn("focusPolicy"); QTest::addColumn("propagation"); QTest::newRow("plain text1") << QString("plain text") << int(Qt::LinksAccessibleByMouse) << int(Qt::NoFocus) << true; QTest::newRow("plain text2") << QString("plain text") << (int)Qt::TextSelectableByKeyboard << (int)Qt::ClickFocus << true; QTest::newRow("plain text3") << QString("plain text") << (int)Qt::TextSelectableByMouse << (int)Qt::ClickFocus << false; QTest::newRow("plain text4") << QString("plain text") << (int)Qt::NoTextInteraction << (int)Qt::NoFocus << true; QTest::newRow("rich text1") << QString("rich text") << (int)Qt::LinksAccessibleByMouse << (int)Qt::NoFocus << true; QTest::newRow("rich text2") << QString("rich text") << (int)Qt::TextSelectableByKeyboard << (int)Qt::ClickFocus << true; QTest::newRow("rich text3") << QString("rich text") << (int)Qt::TextSelectableByMouse << (int)Qt::ClickFocus << false; QTest::newRow("rich text4") << QString("rich text") << (int)Qt::NoTextInteraction << (int)Qt::NoFocus << true; QTest::newRow("rich text4") << QString("rich text") << (int)Qt::LinksAccessibleByKeyboard << (int)Qt::StrongFocus << true; if (!test_box) test_box = new Widget; if (!test_label) test_label = new QLabel(test_box); } void tst_QLabel::eventPropagation() { QFETCH(QString, text); QFETCH(int, textInteractionFlags); QFETCH(int, focusPolicy); QFETCH(bool, propagation); // plain text (accepts mouse event _only_ when label selectable by mouse) test_label->setText(text); test_box->events.clear(); test_label->setTextInteractionFlags(Qt::TextInteractionFlags(textInteractionFlags)); QVERIFY(int(test_label->focusPolicy()) == focusPolicy); QTest::mousePress(test_label, Qt::LeftButton); QVERIFY(test_box->events.contains(QEvent::MouseButtonPress) == propagation); // should have propagated! } void tst_QLabel::focusPolicy() { delete test_label; test_label = new QLabel; QCOMPARE(test_label->focusPolicy(), Qt::NoFocus); // default test_label->setFocusPolicy(Qt::StrongFocus); test_label->setText("Whatever"); // setting text should not change the focus policy QCOMPARE(test_label->focusPolicy(), Qt::StrongFocus); test_label->setTextInteractionFlags(Qt::TextSelectableByKeyboard); // this should QCOMPARE(test_label->focusPolicy(), Qt::ClickFocus); test_label->setFocusPolicy(Qt::StrongFocus); test_label->setText("Whatever"); // setting text should not change the focus policy QCOMPARE(test_label->focusPolicy(), Qt::StrongFocus); test_label->setTextInteractionFlags(Qt::NoTextInteraction); QCOMPARE(test_label->focusPolicy(), Qt::NoFocus); test_label->setFocusPolicy(Qt::StrongFocus); test_label->setTextInteractionFlags(Qt::NoTextInteraction); QCOMPARE(test_label->focusPolicy(), Qt::StrongFocus); // is not touched since value didn't change delete test_label; } void tst_QLabel::task190318_sizes() { QLabel label(" "); QSize ms(500,600); label.setMinimumSize(ms); QCOMPARE(label.minimumSize(), ms); QCOMPARE(label.sizeHint(), ms); QCOMPARE(label.minimumSizeHint(), ms); } void tst_QLabel::sizeHint() { QLabel label(QLatin1String("Test")); label.setIndent(0); label.setMargin(0); label.setContentsMargins(0, 0, 0, 0); label.setAlignment(Qt::AlignVCenter); int h = label.sizeHint().height(); QLabel l1(QLatin1String("Test")); l1.setIndent(0); l1.setMargin(0); l1.setContentsMargins(0, 0, 0, 0); l1.setAlignment(Qt::AlignVCenter); l1.setTextInteractionFlags(Qt::TextSelectableByMouse); // will now use qtextcontrol int h1 = l1.sizeHint().height(); QCOMPARE(h1, h); } void tst_QLabel::task226479_movieResize() { class Label : public QLabel { protected: void paintEvent(QPaintEvent *e) { paintedRegion += e->region(); QLabel::paintEvent(e); } public: QRegion paintedRegion; }; Label label; label.resize(350,350); label.show(); QMovie *movie = new QMovie( &label ); label.setMovie(movie); QTest::qWaitForWindowShown(&label); movie->setFileName(SRCDIR "red.png"); movie->start(); QTest::qWait(50); movie->stop(); label.paintedRegion = QRegion(); movie->setFileName(SRCDIR "green.png"); movie->start(); QTest::qWait(50); QTRY_COMPARE(label.paintedRegion , QRegion(label.rect()) ); } void tst_QLabel::emptyPixmap() { //task 197919 QLabel label1, label2, label3, label4; label2.setPixmap(QPixmap("/tmp/idonotexist")); QMovie movie; label3.setMovie(&movie); label4.setPicture(QPicture()); QCOMPARE(label1.sizeHint(), label2.sizeHint()); QCOMPARE(label1.sizeHint(), label3.sizeHint()); QCOMPARE(label1.sizeHint(), label4.sizeHint()); } /** Test for QTBUG-4848 - unicode data corrupting QLabel display */ void tst_QLabel::unicodeText_data() { QTest::addColumn("text"); QTest::addColumn("languageName"); /* The "glass" phrase in Thai was the initial report for bug QTBUG-4848, was originally found on http://www.columbia.edu/kermit/utf8.html. The phrase is from an internet tradition regarding a striking phrase that is translated into many different languages. The utf8 strings below were generated by using http://translate.google.com. The glass phrase in Thai contains the ้ว character which manifests bug QTBUG-4848 The last long phrase is an excerpt from Churchills "on the beaches" speech, also translated using http://translate.google.com. */ QTest::newRow("english") << QString::fromUtf8("I can eat glass and it doesn't hurt me.") << QString("english"); QTest::newRow("thai") << QString::fromUtf8("ฉันจะกินแก้วและไม่เจ็บฉัน") << QString("thai"); QTest::newRow("chinese") << QString::fromUtf8("我可以吃玻璃,并没有伤害我。") << QString("chinese"); QTest::newRow("arabic") << QString::fromUtf8("أستطيع أكل الزجاج ، وأنه لا يؤذيني.") << QString("arabic"); QTest::newRow("russian") << QString::fromUtf8("Я могу есть стекло, и не больно.") << QString("russian"); QTest::newRow("korean") << QString::fromUtf8("유리를 먹을 수있는, 그리고 그게 날 다치게하지 않습니다.") << QString("korean"); QTest::newRow("greek") << QString::fromUtf8("Μπορώ να φάτε γυαλί και δεν μου κάνει κακό.") << QString("greek"); QTest::newRow("german") << QString::fromUtf8("Ich kann Glas essen und es macht mich nicht heiß.") << QString("german"); QTest::newRow("thai_long") << QString::fromUtf8("เราจะต่อสู้ในทะเลและมหาสมุทร. เราจะต่อสู้ด้วยความมั่นใจเติบโตและความเจริญเติบโตในอากาศเราจะปกป้องเกาะของเราค่าใช้จ่ายใดๆอาจ." "เราจะต่อสู้บนชายหาดเราจะต่อสู้ในบริเวณเชื่อมโยงไปถึงเราจะต่อสู้ในช่องและในถนนที่เราจะต่อสู้ในภูเขานั้นเราจะไม่ยอม.") << QString("thai_long"); } void tst_QLabel::unicodeText() { const QString testDataPath("testdata/unicodeText"); QFETCH(QString, text); QFETCH(QString, languageName); QFrame frame; QVBoxLayout *layout = new QVBoxLayout(); QLabel *label = new QLabel(text, &frame); layout->addWidget(label); layout->setMargin(8); frame.setLayout(layout); frame.show(); QTest::qWaitForWindowShown(&frame); QVERIFY(frame.isVisible()); // was successfully sized and shown testWidget->show(); } void tst_QLabel::mnemonic_data() { QTest::addColumn("text"); QTest::addColumn("expectedDocText"); QTest::addColumn("expectedShortcutCursor"); QTest::newRow("1") << QString("Normal") << QString("Normal") << QString(); QTest::newRow("2") << QString("&Simple") << QString("Simple") << QString("S"); QTest::newRow("3") << QString("Also &simple") << QString("Also simple") << QString("s"); QTest::newRow("4") << QString("&&With &Double &&") << QString("&With Double &") << QString("D"); QTest::newRow("5") << QString("Hep&&Hop") << QString("Hep&Hop") << QString(""); QTest::newRow("6") << QString("Hep&&&Hop") << QString("Hep&Hop") << QString("H"); } void tst_QLabel::mnemonic() { // this test that the mnemonics appears correctly when the label has a text control. QFETCH(QString, text); QFETCH(QString, expectedDocText); QFETCH(QString, expectedShortcutCursor); QWidget w; QHBoxLayout *hbox = new QHBoxLayout; QLabel *lab = new QLabel(text); //lab->setText("plop &plop"); QLineEdit *lineedit = new QLineEdit; lab->setBuddy(lineedit); lab->setTextInteractionFlags(Qt::TextSelectableByMouse); hbox->addWidget(lab); hbox->addWidget(lineedit); hbox->addWidget(new QLineEdit); w.setLayout(hbox); w.show(); QTest::qWaitForWindowShown(&w); QLabelPrivate *d = static_cast(QObjectPrivate::get(lab)); QVERIFY(d->control); QCOMPARE(d->control->document()->toPlainText(), expectedDocText); QCOMPARE(d->shortcutCursor.selectedText(), expectedShortcutCursor); } void tst_QLabel::selection() { QLabel label; label.setText("Hello world"); label.setTextInteractionFlags(Qt::TextSelectableByMouse); QVERIFY(!label.hasSelectedText()); QCOMPARE(label.selectedText(), QString()); QCOMPARE(label.selectionStart(), -1); label.setSelection(0, 4); QVERIFY(label.hasSelectedText()); QCOMPARE(label.selectedText(), QString::fromLatin1("Hell")); QCOMPARE(label.selectionStart(), 0); label.setSelection(6, 5); QVERIFY(label.hasSelectedText()); QCOMPARE(label.selectedText(), QString::fromLatin1("world")); QCOMPARE(label.selectionStart(), 6); } #ifndef QT_NO_CONTEXTMENU void tst_QLabel::taskQTBUG_7902_contextMenuCrash() { QLabel *w = new QLabel("Test or crash?"); w->setTextInteractionFlags(Qt::TextSelectableByMouse); w->show(); QTest::qWaitForWindowShown(w); QTimer ti; w->connect(&ti, SIGNAL(timeout()), w, SLOT(deleteLater())); ti.start(300); QContextMenuEvent *cme = new QContextMenuEvent(QContextMenuEvent::Mouse, w->rect().center()); qApp->postEvent(w, cme); QTest::qWait(350); // No crash, it's allright. } #endif QTEST_MAIN(tst_QLabel) #include "tst_qlabel.moc"