1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Contact: https://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the test suite of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at https://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
21 | ** included in the packaging of this file. Please review the following |
22 | ** information to ensure the GNU General Public License requirements will |
23 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
24 | ** |
25 | ** $QT_END_LICENSE$ |
26 | ** |
27 | ****************************************************************************/ |
28 | |
29 | |
30 | #include <QtTest/QtTest> |
31 | |
32 | |
33 | #include "qlabel.h" |
34 | #include <qapplication.h> |
35 | #include <qboxlayout.h> |
36 | #include <qlabel.h> |
37 | #include <qlineedit.h> |
38 | #include <qmovie.h> |
39 | #include <qpicture.h> |
40 | #include <qmessagebox.h> |
41 | #include <private/qlabel_p.h> |
42 | |
43 | class Widget : public QWidget |
44 | { |
45 | Q_OBJECT |
46 | public: |
47 | QList<QEvent::Type> events; |
48 | |
49 | protected: |
50 | bool event(QEvent *ev) override { |
51 | events.append(t: ev->type()); |
52 | return QWidget::event(event: ev); |
53 | } |
54 | |
55 | }; |
56 | |
57 | class tst_QLabel : public QObject |
58 | { |
59 | Q_OBJECT |
60 | |
61 | private Q_SLOTS: |
62 | void initTestCase(); |
63 | void cleanupTestCase(); |
64 | void init(); |
65 | void cleanup(); |
66 | |
67 | void getSetCheck(); |
68 | void setText_data(); |
69 | void setText(); |
70 | void setTextFormat(); |
71 | #ifndef Q_OS_MAC |
72 | void setBuddy(); |
73 | #endif |
74 | void setNum(); |
75 | void clear(); |
76 | void wordWrap(); |
77 | void eventPropagation_data(); |
78 | void eventPropagation(); |
79 | void focusPolicy(); |
80 | |
81 | void task190318_sizes(); |
82 | |
83 | void sizeHint(); |
84 | |
85 | void task226479_movieResize(); |
86 | void emptyPixmap(); |
87 | |
88 | void unicodeText_data(); |
89 | void unicodeText(); |
90 | |
91 | void mnemonic_data(); |
92 | void mnemonic(); |
93 | void selection(); |
94 | |
95 | #ifndef QT_NO_CONTEXTMENU |
96 | void taskQTBUG_7902_contextMenuCrash(); |
97 | #endif |
98 | |
99 | void taskQTBUG_48157_dprPixmap(); |
100 | void taskQTBUG_48157_dprMovie(); |
101 | |
102 | private: |
103 | QLabel *testWidget; |
104 | QPointer<Widget> test_box; |
105 | QPointer<QLabel> test_label; |
106 | }; |
107 | |
108 | // Testing get/set functions |
109 | void tst_QLabel::getSetCheck() |
110 | { |
111 | QLabel obj1; |
112 | // bool QLabel::wordWrap() |
113 | // void QLabel::setWordWrap(bool) |
114 | obj1.setWordWrap(false); |
115 | QCOMPARE(false, obj1.wordWrap()); |
116 | obj1.setWordWrap(true); |
117 | QCOMPARE(true, obj1.wordWrap()); |
118 | |
119 | // QWidget * QLabel::buddy() |
120 | // void QLabel::setBuddy(QWidget *) |
121 | QWidget *var2 = new QWidget(); |
122 | obj1.setBuddy(var2); |
123 | QCOMPARE(var2, obj1.buddy()); |
124 | obj1.setBuddy((QWidget *)0); |
125 | QCOMPARE((QWidget *)0, obj1.buddy()); |
126 | delete var2; |
127 | |
128 | // QMovie * QLabel::movie() |
129 | // void QLabel::setMovie(QMovie *) |
130 | QMovie *var3 = new QMovie; |
131 | obj1.setMovie(var3); |
132 | QCOMPARE(var3, obj1.movie()); |
133 | obj1.setMovie((QMovie *)0); |
134 | QCOMPARE((QMovie *)0, obj1.movie()); |
135 | delete var3; |
136 | } |
137 | |
138 | void tst_QLabel::initTestCase() |
139 | { |
140 | // Create the test class |
141 | testWidget = new QLabel(0); |
142 | testWidget->resize( w: 200, h: 200 ); |
143 | testWidget->show(); |
144 | } |
145 | |
146 | void tst_QLabel::cleanupTestCase() |
147 | { |
148 | delete testWidget; |
149 | testWidget = 0; |
150 | delete test_box; |
151 | } |
152 | |
153 | void tst_QLabel::init() |
154 | { |
155 | testWidget->setTextFormat( Qt::AutoText ); |
156 | testWidget->setBuddy( 0 ); |
157 | testWidget->setIndent( 0 ); |
158 | testWidget->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); |
159 | testWidget->setScaledContents( false ); |
160 | } |
161 | |
162 | void tst_QLabel::cleanup() |
163 | { |
164 | if (QTest::currentTestFunction() == QLatin1String("setBuddy" )) { |
165 | testWidget->show(); |
166 | |
167 | delete test_box; // this should delete tst_labl and test_edit as well. |
168 | } |
169 | } |
170 | |
171 | // Set buddy doesn't make much sense on OS X |
172 | #ifndef Q_OS_MAC |
173 | void tst_QLabel::setBuddy() |
174 | { |
175 | testWidget->hide(); |
176 | |
177 | test_box = new Widget; |
178 | test_label= new QLabel( test_box ); |
179 | test_label->setText( "&Test with a buddy" ); |
180 | QWidget *test_edit = new QLineEdit( test_box ); |
181 | QWidget *test_edit2 = new QLineEdit( test_box ); |
182 | QVBoxLayout *layout = new QVBoxLayout(test_box); |
183 | layout->addWidget(test_label); |
184 | layout->addWidget(test_edit); |
185 | layout->addWidget(test_edit2); |
186 | test_box->show(); |
187 | qApp->setActiveWindow(test_box); |
188 | QVERIFY(test_box->isActiveWindow()); |
189 | |
190 | test_label->setBuddy( test_edit ); |
191 | test_label->setFocus(); |
192 | QVERIFY( !test_edit->hasFocus() ); |
193 | QTest::keyClick( widget: test_box, key: 't', modifier: Qt::AltModifier ); |
194 | QVERIFY( test_edit->hasFocus() ); |
195 | |
196 | // Setting a new buddy should disconnect the old one's destroyed() signal |
197 | test_label->setBuddy(test_edit2); |
198 | delete test_edit; |
199 | QCOMPARE(test_label->buddy(), test_edit2); |
200 | |
201 | // And deleting our own buddy should disconnect and not crash |
202 | delete test_edit2; |
203 | QTest::keyClick(widget: test_box, key: 't', modifier: Qt::AltModifier ); |
204 | |
205 | delete test_box; |
206 | } |
207 | #endif |
208 | |
209 | void tst_QLabel::setText_data() |
210 | { |
211 | QTest::addColumn<QString>(name: "txt" ); |
212 | QTest::addColumn<QString>(name: "font" ); |
213 | |
214 | QString prefix = "" ; |
215 | #ifdef Q_OS_WIN32 |
216 | prefix = "win32_" ; |
217 | #endif |
218 | |
219 | QTest::newRow( dataTag: QString(prefix + "data0" ).toLatin1() ) << QString("This is a single line" ) << QString("Helvetica" ); |
220 | QTest::newRow( dataTag: QString(prefix + "data1" ).toLatin1() ) << QString("This is the first line\nThis is the second line" ) << QString("Courier" ); |
221 | QTest::newRow( dataTag: QString(prefix + "data2" ).toLatin1() ) << QString("This is the first line\nThis is the second line\nThis is the third line" ) << QString("Helvetica" ); |
222 | QTest::newRow( dataTag: QString(prefix + "data3" ).toLatin1() ) << QString("This is <b>bold</b> richtext" ) << QString("Courier" ); |
223 | QTest::newRow( dataTag: QString(prefix + "data4" ).toLatin1() ) << QString("I Have a &shortcut" ) << QString("Helvetica" ); |
224 | } |
225 | |
226 | void tst_QLabel::setText() |
227 | { |
228 | QFETCH( QString, txt ); |
229 | QFETCH( QString, font ); |
230 | QFont f( font, 8 ); |
231 | testWidget->setFont( f ); |
232 | testWidget->setText( txt ); |
233 | QCOMPARE( testWidget->text(), txt ); |
234 | } |
235 | |
236 | void tst_QLabel::setTextFormat() |
237 | { |
238 | // lets' start with the simple stuff... |
239 | testWidget->setTextFormat( Qt::PlainText ); |
240 | QVERIFY( testWidget->textFormat() == Qt::PlainText ); |
241 | |
242 | testWidget->setTextFormat( Qt::RichText ); |
243 | QVERIFY( testWidget->textFormat() == Qt::RichText ); |
244 | |
245 | testWidget->setTextFormat( Qt::AutoText ); |
246 | QVERIFY( testWidget->textFormat() == Qt::AutoText ); |
247 | } |
248 | |
249 | void tst_QLabel::setNum() |
250 | { |
251 | testWidget->setText( "This is a text" ); |
252 | testWidget->setNum( 12 ); |
253 | QCOMPARE( testWidget->text(), QString("12" ) ); |
254 | testWidget->setNum( 12.345 ); |
255 | QCOMPARE( testWidget->text(), QString("12.345" ) ); |
256 | } |
257 | |
258 | void tst_QLabel::clear() |
259 | { |
260 | const QString TEXT = "blah blah" ; |
261 | testWidget->setText(TEXT); |
262 | QCOMPARE(testWidget->text(), TEXT); |
263 | testWidget->clear(); |
264 | QVERIFY(testWidget->text().isEmpty()); |
265 | } |
266 | |
267 | void tst_QLabel::wordWrap() |
268 | { |
269 | QLabel label; |
270 | |
271 | QVERIFY(!label.wordWrap()); |
272 | |
273 | label.setText("Plain Text" ); |
274 | QVERIFY(!label.wordWrap()); |
275 | |
276 | label.setText("<b>rich text</b>" ); |
277 | QVERIFY(!label.wordWrap()); |
278 | |
279 | label.setWordWrap(false); |
280 | label.setText("<b>rich text</b>" ); |
281 | QVERIFY(!label.wordWrap()); |
282 | } |
283 | |
284 | void tst_QLabel::eventPropagation_data() |
285 | { |
286 | QTest::addColumn<QString>(name: "text" ); |
287 | QTest::addColumn<int>(name: "textInteractionFlags" ); |
288 | QTest::addColumn<int>(name: "focusPolicy" ); |
289 | QTest::addColumn<bool>(name: "propagation" ); |
290 | |
291 | QTest::newRow(dataTag: "plain text1" ) << QString("plain text" ) << int(Qt::LinksAccessibleByMouse) << int(Qt::NoFocus) << true; |
292 | QTest::newRow(dataTag: "plain text2" ) << QString("plain text" ) << (int)Qt::TextSelectableByKeyboard << (int)Qt::ClickFocus << true; |
293 | QTest::newRow(dataTag: "plain text3" ) << QString("plain text" ) << (int)Qt::TextSelectableByMouse << (int)Qt::ClickFocus << false; |
294 | QTest::newRow(dataTag: "plain text4" ) << QString("plain text" ) << (int)Qt::NoTextInteraction << (int)Qt::NoFocus << true; |
295 | QTest::newRow(dataTag: "rich text1" ) << QString("<b>rich text</b>" ) << (int)Qt::LinksAccessibleByMouse << (int)Qt::NoFocus << true; |
296 | QTest::newRow(dataTag: "rich text2" ) << QString("<b>rich text</b>" ) << (int)Qt::TextSelectableByKeyboard << (int)Qt::ClickFocus << true; |
297 | QTest::newRow(dataTag: "rich text3" ) << QString("<b>rich text</b>" ) << (int)Qt::TextSelectableByMouse << (int)Qt::ClickFocus << false; |
298 | QTest::newRow(dataTag: "rich text4" ) << QString("<b>rich text</b>" ) << (int)Qt::NoTextInteraction << (int)Qt::NoFocus << true; |
299 | QTest::newRow(dataTag: "rich text5" ) << QString("<b>rich text</b>" ) << (int)Qt::LinksAccessibleByKeyboard << (int)Qt::StrongFocus << true; |
300 | |
301 | if (!test_box) |
302 | test_box = new Widget; |
303 | if (!test_label) |
304 | test_label = new QLabel(test_box); |
305 | } |
306 | |
307 | void tst_QLabel::eventPropagation() |
308 | { |
309 | QFETCH(QString, text); |
310 | QFETCH(int, textInteractionFlags); |
311 | QFETCH(int, focusPolicy); |
312 | QFETCH(bool, propagation); |
313 | |
314 | // plain text (accepts mouse event _only_ when label selectable by mouse) |
315 | test_label->setText(text); |
316 | test_box->events.clear(); |
317 | test_label->setTextInteractionFlags(Qt::TextInteractionFlags(textInteractionFlags)); |
318 | QCOMPARE(int(test_label->focusPolicy()), focusPolicy); |
319 | QTest::mousePress(widget: test_label, button: Qt::LeftButton); |
320 | QVERIFY(test_box->events.contains(QEvent::MouseButtonPress) == propagation); // should have propagated! |
321 | } |
322 | |
323 | void tst_QLabel::focusPolicy() |
324 | { |
325 | delete test_label; |
326 | test_label = new QLabel; |
327 | QCOMPARE(test_label->focusPolicy(), Qt::NoFocus); // default |
328 | test_label->setFocusPolicy(Qt::StrongFocus); |
329 | test_label->setText("Whatever" ); // setting text should not change the focus policy |
330 | QCOMPARE(test_label->focusPolicy(), Qt::StrongFocus); |
331 | test_label->setTextInteractionFlags(Qt::TextSelectableByKeyboard); // this should |
332 | QCOMPARE(test_label->focusPolicy(), Qt::ClickFocus); |
333 | test_label->setFocusPolicy(Qt::StrongFocus); |
334 | test_label->setText("Whatever" ); // setting text should not change the focus policy |
335 | QCOMPARE(test_label->focusPolicy(), Qt::StrongFocus); |
336 | test_label->setTextInteractionFlags(Qt::NoTextInteraction); |
337 | QCOMPARE(test_label->focusPolicy(), Qt::NoFocus); |
338 | test_label->setFocusPolicy(Qt::StrongFocus); |
339 | test_label->setTextInteractionFlags(Qt::NoTextInteraction); |
340 | QCOMPARE(test_label->focusPolicy(), Qt::StrongFocus); // is not touched since value didn't change |
341 | delete test_label; |
342 | } |
343 | |
344 | void tst_QLabel::task190318_sizes() |
345 | { |
346 | QLabel label(" " ); |
347 | QSize ms(500,600); |
348 | label.setMinimumSize(ms); |
349 | QCOMPARE(label.minimumSize(), ms); |
350 | QCOMPARE(label.sizeHint(), ms); |
351 | QCOMPARE(label.minimumSizeHint(), ms); |
352 | } |
353 | |
354 | void tst_QLabel::sizeHint() |
355 | { |
356 | QLabel label(QLatin1String("Test" )); |
357 | label.setIndent(0); |
358 | label.setMargin(0); |
359 | label.setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
360 | label.setAlignment(Qt::AlignVCenter); |
361 | int h = label.sizeHint().height(); |
362 | |
363 | QLabel l1(QLatin1String("Test" )); |
364 | l1.setIndent(0); |
365 | l1.setMargin(0); |
366 | l1.setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
367 | l1.setAlignment(Qt::AlignVCenter); |
368 | l1.setTextInteractionFlags(Qt::TextSelectableByMouse); // will now use qtextcontrol |
369 | int h1 = l1.sizeHint().height(); |
370 | QCOMPARE(h1, h); |
371 | |
372 | } |
373 | |
374 | void tst_QLabel::task226479_movieResize() |
375 | { |
376 | class Label : public QLabel { |
377 | protected: |
378 | void paintEvent(QPaintEvent *e) |
379 | { |
380 | paintedRegion += e->region(); |
381 | QLabel::paintEvent(e); |
382 | } |
383 | |
384 | public: |
385 | QRegion paintedRegion; |
386 | }; |
387 | |
388 | Label label; |
389 | label.resize(w: 350,h: 350); |
390 | label.show(); |
391 | QMovie *movie = new QMovie( &label ); |
392 | label.setMovie(movie); |
393 | QVERIFY(QTest::qWaitForWindowExposed(&label)); |
394 | movie->setFileName(QFINDTESTDATA("red.png" )); |
395 | movie->start(); |
396 | QTest::qWait(ms: 50); |
397 | movie->stop(); |
398 | label.paintedRegion = QRegion(); |
399 | movie->setFileName(QFINDTESTDATA("green.png" )); |
400 | movie->start(); |
401 | |
402 | QTRY_COMPARE(label.paintedRegion , QRegion(label.rect()) ); |
403 | } |
404 | |
405 | void tst_QLabel::emptyPixmap() |
406 | { |
407 | //task 197919 |
408 | QLabel label1, label2, label3, label4; |
409 | label2.setPixmap(QPixmap("/tmp/idonotexist" )); |
410 | QMovie movie; |
411 | label3.setMovie(&movie); |
412 | label4.setPicture(QPicture()); |
413 | QCOMPARE(label1.sizeHint(), label2.sizeHint()); |
414 | QCOMPARE(label1.sizeHint(), label3.sizeHint()); |
415 | QCOMPARE(label1.sizeHint(), label4.sizeHint()); |
416 | } |
417 | |
418 | /** |
419 | Test for QTBUG-4848 - unicode data corrupting QLabel display |
420 | */ |
421 | void tst_QLabel::unicodeText_data() |
422 | { |
423 | QTest::addColumn<QString>(name: "text" ); |
424 | QTest::addColumn<QString>(name: "languageName" ); |
425 | |
426 | /* |
427 | The "glass" phrase in Thai was the initial report for bug QTBUG-4848, was |
428 | originally found on http://www.columbia.edu/kermit/utf8.html. |
429 | |
430 | The phrase is from an internet tradition regarding a striking phrase |
431 | that is translated into many different languages. The utf8 strings |
432 | below were generated by using http://translate.google.com. |
433 | |
434 | The glass phrase in Thai contains the ้ว character which manifests bug |
435 | QTBUG-4848 |
436 | |
437 | The last long phrase is an excerpt from Churchills "on the beaches" |
438 | speech, also translated using http://translate.google.com. |
439 | */ |
440 | |
441 | QTest::newRow(dataTag: "english" ) << QString::fromUtf8(str: "I can eat glass and it doesn't hurt me." ) << QString("english" ); |
442 | QTest::newRow(dataTag: "thai" ) << QString::fromUtf8(str: "ฉันจะกินแก้วและไม่เจ็บฉัน" ) << QString("thai" ); |
443 | QTest::newRow(dataTag: "chinese" ) << QString::fromUtf8(str: "我可以吃玻璃,并没有伤害我。" ) << QString("chinese" ); |
444 | QTest::newRow(dataTag: "arabic" ) << QString::fromUtf8(str: "أستطيع أكل الزجاج ، وأنه لا يؤذيني." ) << QString("arabic" ); |
445 | QTest::newRow(dataTag: "russian" ) << QString::fromUtf8(str: "Я могу есть стекло, и не больно." ) << QString("russian" ); |
446 | QTest::newRow(dataTag: "korean" ) << QString::fromUtf8(str: "유리를 먹을 수있는, 그리고 그게 날 다치게하지 않습니다." ) << QString("korean" ); |
447 | QTest::newRow(dataTag: "greek" ) << QString::fromUtf8(str: "Μπορώ να φάτε γυαλί και δεν μου κάνει κακό." ) << QString("greek" ); |
448 | QTest::newRow(dataTag: "german" ) << QString::fromUtf8(str: "Ich kann Glas essen und es macht mich nicht heiß." ) << QString("german" ); |
449 | |
450 | QTest::newRow(dataTag: "thai_long" ) << QString::fromUtf8(str: "เราจะต่อสู้ในทะเลและมหาสมุทร. เราจะต่อสู้ด้วยความมั่นใจเติบโตและความเจริญเติบโตในอากาศเราจะปกป้องเกาะของเราค่าใช้จ่ายใดๆอาจ." |
451 | "เราจะต่อสู้บนชายหาดเราจะต่อสู้ในบริเวณเชื่อมโยงไปถึงเราจะต่อสู้ในช่องและในถนนที่เราจะต่อสู้ในภูเขานั้นเราจะไม่ยอม." ) |
452 | << QString("thai_long" ); |
453 | } |
454 | |
455 | void tst_QLabel::unicodeText() |
456 | { |
457 | const QString testDataPath("testdata/unicodeText" ); |
458 | QFETCH(QString, text); |
459 | QFETCH(QString, languageName); |
460 | QFrame frame; |
461 | QVBoxLayout *layout = new QVBoxLayout(); |
462 | QLabel *label = new QLabel(text, &frame); |
463 | layout->addWidget(label); |
464 | layout->setContentsMargins(left: 8, top: 8, right: 8, bottom: 8); |
465 | frame.setLayout(layout); |
466 | frame.show(); |
467 | QVERIFY(QTest::qWaitForWindowExposed(&frame)); |
468 | QVERIFY(frame.isVisible()); // was successfully sized and shown |
469 | testWidget->show(); |
470 | } |
471 | |
472 | void tst_QLabel::mnemonic_data() |
473 | { |
474 | QTest::addColumn<QString>(name: "text" ); |
475 | QTest::addColumn<QString>(name: "expectedDocText" ); |
476 | QTest::addColumn<QString>(name: "expectedShortcutCursor" ); |
477 | |
478 | QTest::newRow(dataTag: "1" ) << QString("Normal" ) << QString("Normal" ) << QString(); |
479 | QTest::newRow(dataTag: "2" ) << QString("&Simple" ) << QString("Simple" ) << QString("S" ); |
480 | QTest::newRow(dataTag: "3" ) << QString("Also &simple" ) << QString("Also simple" ) << QString("s" ); |
481 | QTest::newRow(dataTag: "4" ) << QString("&&With &Double &&" ) << QString("&With Double &" ) << QString("D" ); |
482 | QTest::newRow(dataTag: "5" ) << QString("Hep&&Hop" ) << QString("Hep&Hop" ) << QString("" ); |
483 | QTest::newRow(dataTag: "6" ) << QString("Hep&&&Hop" ) << QString("Hep&Hop" ) << QString("H" ); |
484 | } |
485 | |
486 | |
487 | void tst_QLabel::mnemonic() |
488 | { |
489 | // this test that the mnemonics appears correctly when the label has a text control. |
490 | |
491 | QFETCH(QString, text); |
492 | QFETCH(QString, expectedDocText); |
493 | QFETCH(QString, expectedShortcutCursor); |
494 | |
495 | QWidget w; |
496 | QHBoxLayout *hbox = new QHBoxLayout; |
497 | QLabel *lab = new QLabel(text); |
498 | //lab->setText("plop &plop"); |
499 | QLineEdit *lineedit = new QLineEdit; |
500 | lab->setBuddy(lineedit); |
501 | lab->setTextInteractionFlags(Qt::TextSelectableByMouse); |
502 | |
503 | hbox->addWidget(lab); |
504 | hbox->addWidget(lineedit); |
505 | hbox->addWidget(new QLineEdit); |
506 | w.setLayout(hbox); |
507 | w.show(); |
508 | QVERIFY(QTest::qWaitForWindowExposed(&w)); |
509 | |
510 | QLabelPrivate *d = static_cast<QLabelPrivate *>(QObjectPrivate::get(o: lab)); |
511 | QVERIFY(d->control); |
512 | QCOMPARE(d->control->document()->toPlainText(), expectedDocText); |
513 | QCOMPARE(d->shortcutCursor.selectedText(), expectedShortcutCursor); |
514 | } |
515 | |
516 | void tst_QLabel::selection() |
517 | { |
518 | QLabel label; |
519 | label.setText("Hello world" ); |
520 | |
521 | label.setTextInteractionFlags(Qt::TextSelectableByMouse); |
522 | |
523 | QVERIFY(!label.hasSelectedText()); |
524 | QCOMPARE(label.selectedText(), QString()); |
525 | QCOMPARE(label.selectionStart(), -1); |
526 | |
527 | label.setSelection(0, 4); |
528 | QVERIFY(label.hasSelectedText()); |
529 | QCOMPARE(label.selectedText(), QString::fromLatin1("Hell" )); |
530 | QCOMPARE(label.selectionStart(), 0); |
531 | |
532 | label.setSelection(6, 5); |
533 | QVERIFY(label.hasSelectedText()); |
534 | QCOMPARE(label.selectedText(), QString::fromLatin1("world" )); |
535 | QCOMPARE(label.selectionStart(), 6); |
536 | } |
537 | |
538 | #ifndef QT_NO_CONTEXTMENU |
539 | void tst_QLabel::() |
540 | { |
541 | QLabel *w = new QLabel("Test or crash?" ); |
542 | w->setTextInteractionFlags(Qt::TextSelectableByMouse); |
543 | w->show(); |
544 | QVERIFY(QTest::qWaitForWindowExposed(w)); |
545 | |
546 | QTimer ti; |
547 | w->connect(sender: &ti, SIGNAL(timeout()), receiver: w, SLOT(deleteLater())); |
548 | ti.start(msec: 300); |
549 | |
550 | QContextMenuEvent *cme = new QContextMenuEvent(QContextMenuEvent::Mouse, w->rect().center()); |
551 | qApp->postEvent(receiver: w, event: cme); |
552 | |
553 | QTest::qWait(ms: 350); |
554 | // No crash, it's allright. |
555 | } |
556 | #endif |
557 | |
558 | void tst_QLabel::taskQTBUG_48157_dprPixmap() |
559 | { |
560 | QLabel label; |
561 | QPixmap pixmap; |
562 | pixmap.load(QFINDTESTDATA(QStringLiteral("red@2x.png" ))); |
563 | QCOMPARE(pixmap.devicePixelRatio(), 2.0); |
564 | label.setPixmap(pixmap); |
565 | QCOMPARE(label.sizeHint(), pixmap.rect().size() / pixmap.devicePixelRatio()); |
566 | } |
567 | |
568 | void tst_QLabel::taskQTBUG_48157_dprMovie() |
569 | { |
570 | QLabel label; |
571 | QMovie movie; |
572 | movie.setFileName(QFINDTESTDATA(QStringLiteral("red@2x.png" ))); |
573 | movie.start(); |
574 | QCOMPARE(movie.currentPixmap().devicePixelRatio(), 2.0); |
575 | label.setMovie(&movie); |
576 | QCOMPARE(label.sizeHint(), movie.currentPixmap().size() / movie.currentPixmap().devicePixelRatio()); |
577 | } |
578 | |
579 | QTEST_MAIN(tst_QLabel) |
580 | #include "tst_qlabel.moc" |
581 | |