qt5base-lts/tests/auto/qlabel/tst_qlabel.cpp
Jyri Tahtela f9f395c28b Update licenseheader text in source files for qtbase Qt module
Updated version of LGPL and FDL licenseheaders.
Apply release phase licenseheaders for all source files.

Reviewed-by: Trust Me
2011-05-24 12:34:08 +03:00

611 lines
19 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************
**
** 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 <QtTest/QtTest>
#include "qlabel.h"
#include <qapplication.h>
#include <qboxlayout.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qmovie.h>
#include <qpicture.h>
#include <qmessagebox.h>
#include <private/qlabel_p.h>
//TESTED_CLASS=
//TESTED_FILES=
#if defined(Q_OS_SYMBIAN)
# define SRCDIR ""
#endif
#include "../../shared/util.h"
class Widget : public QWidget
{
public:
Widget() { }
QList<QEvent::Type> 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<Widget> test_box;
QPointer<QLabel> 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<QString>("txt");
QTest::addColumn<QString>("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 <b>bold</b> 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("<b>rich text</b>");
QVERIFY(!label.wordWrap());
label.setWordWrap(false);
label.setText("<b>rich text</b>");
QVERIFY(!label.wordWrap());
}
void tst_QLabel::eventPropagation_data()
{
QTest::addColumn<QString>("text");
QTest::addColumn<int>("textInteractionFlags");
QTest::addColumn<int>("focusPolicy");
QTest::addColumn<bool>("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("<b>rich text</b>") << (int)Qt::LinksAccessibleByMouse << (int)Qt::NoFocus << true;
QTest::newRow("rich text2") << QString("<b>rich text</b>") << (int)Qt::TextSelectableByKeyboard << (int)Qt::ClickFocus << true;
QTest::newRow("rich text3") << QString("<b>rich text</b>") << (int)Qt::TextSelectableByMouse << (int)Qt::ClickFocus << false;
QTest::newRow("rich text4") << QString("<b>rich text</b>") << (int)Qt::NoTextInteraction << (int)Qt::NoFocus << true;
QTest::newRow("rich text4") << QString("<b>rich text</b>") << (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<QString>("text");
QTest::addColumn<QString>("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<QString>("text");
QTest::addColumn<QString>("expectedDocText");
QTest::addColumn<QString>("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 &&amp;") << QString("&With Double &amp;") << 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<QLabelPrivate *>(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"