1
/****************************************************************************
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
6
** This file is part of the test suite of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
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 Digia. For licensing terms and
14
** conditions see http://qt.digia.com/licensing. For further information
15
** use the contact form at http://qt.digia.com/contact-us.
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 2.1 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 2.1 requirements
23
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25
** In addition, as a special exception, Digia gives you certain additional
26
** rights. These rights are described in the Digia Qt LGPL Exception
27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29
** GNU General Public License Usage
30
** Alternatively, this file may be used under the terms of the GNU
31
** General Public License version 3.0 as published by the Free Software
32
** Foundation and appearing in the file LICENSE.GPL included in the
33
** packaging of this file. Please review the following information to
34
** ensure the GNU General Public License version 3.0 requirements will be
35
** met: http://www.gnu.org/copyleft/gpl.html.
40
****************************************************************************/
43
#include <QtTest/QtTest>
44
#include "qlineedit.h"
45
#include "qapplication.h"
46
#include "qstringlist.h"
48
#include "qvalidator.h"
49
#include "qcompleter.h"
50
#include "qstandarditemmodel.h"
51
#include <qpa/qplatformtheme.h>
52
#include "qstylehints.h"
53
#include <private/qguiapplication_p.h>
54
#include "qclipboard.h"
57
#include <cstdlib> // For the random function.
60
#include <qlineedit.h>
61
#include <private/qlineedit_p.h>
62
#include <private/qwidgetlinecontrol_p.h>
68
#include "qcommonstyle.h"
69
#include "qstyleoption.h"
71
#include "qplatformdefs.h"
73
#include "../../../shared/platformclipboard.h"
74
#include "../../../shared/platforminputcontext.h"
75
#include <private/qinputmethod_p.h>
77
#include "../../../qtest-config.h"
83
class StyleOptionTestStyle : public QCommonStyle
89
inline StyleOptionTestStyle() : QCommonStyle(), readOnly(false)
93
inline void setReadOnly(bool readOnly)
95
this->readOnly = readOnly;
98
inline void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *,
99
const QWidget *) const
102
case PE_PanelLineEdit:
104
QVERIFY(opt->state & QStyle::State_ReadOnly);
106
QVERIFY(!(opt->state & QStyle::State_ReadOnly));
115
class tst_QLineEdit : public QObject
120
enum EventStates { Press, Release, Click };
123
virtual ~tst_QLineEdit();
127
void cleanupTestCase();
134
void upperAndLowercase();
136
void setInputMask_data();
139
void inputMask_data();
142
void clearInputMask();
144
void keypress_inputMask_data();
145
void keypress_inputMask();
147
void inputMaskAndValidator_data();
148
void inputMaskAndValidator();
150
void hasAcceptableInputMask_data();
151
void hasAcceptableInputMask();
153
void hasAcceptableInputValidator();
162
void undo_keypressevents_data();
163
void undo_keypressevents();
165
#ifndef QT_NO_CLIPBOARD
166
void QTBUG5786_undoPaste();
173
void textMask_data();
175
void maskCharacter();
176
void maskCharacter_data();
179
void displayText_data();
181
void passwordEchoOnEdit();
182
void passwordEchoDelay();
184
void maxLength_mask_data();
185
void maxLength_mask();
187
void maxLength_data();
192
void noCursorBlinkWhenReadOnly();
194
void cursorPosition();
196
void cursorPositionChanged_data();
197
void cursorPositionChanged();
200
void deleteSelectedText();
202
void textChangedAndTextEdited();
203
void returnPressed();
204
void returnPressed_maskvalidator_data();
205
void returnPressed_maskvalidator();
208
void setValidator_QIntValidator_data();
209
void setValidator_QIntValidator();
214
void leftKeyOnSelectedText();
216
void setAlignment_data();
223
void setSelection_data();
226
#ifndef QT_NO_CLIPBOARD
229
void maxLengthAndInputMask();
230
void returnPressedKeyEvent();
232
void keepSelectionOnTabFocusIn();
234
void readOnlyStyleOption();
236
void validateOnFocusOut();
238
void editInvalidText();
240
void charWithAltOrCtrlModifier();
242
void inlineCompletion();
244
void noTextEditedOnClear();
246
#ifndef QTEST_NO_CURSOR
250
void textMargin_data();
253
// task-specific tests:
254
void task180999_focus();
255
void task174640_editingFinished();
256
#ifndef QT_NO_COMPLETER
257
void task198789_currentCompletion();
258
void task210502_caseInsensitiveInlineCompletion();
260
void task229938_dontEmitChangedWhenTextIsNotChanged();
261
void task233101_cursorPosAfterInputMethod_data();
262
void task233101_cursorPosAfterInputMethod();
263
void task241436_passwordEchoOnEditRestoreEchoMode();
264
void task248948_redoRemovedSelection();
265
void taskQTBUG_4401_enterKeyClearsPassword();
266
void taskQTBUG_4679_moveToStartEndOfBlock();
267
void taskQTBUG_4679_selectToStartEndOfBlock();
268
#ifndef QT_NO_CONTEXTMENU
269
void taskQTBUG_7902_contextMenuCrash();
271
void taskQTBUG_7395_readOnlyShortcut();
272
void QTBUG697_paletteCurrentColorGroup();
273
void QTBUG13520_textNotVisible();
274
void QTBUG7174_inputMaskCursorBlink();
275
void QTBUG16850_setSelection();
277
void bidiVisualMovement_data();
278
void bidiVisualMovement();
280
void bidiLogicalMovement_data();
281
void bidiLogicalMovement();
283
void selectAndCursorPosition();
285
void inputMethodSelection();
287
void inputMethodQueryImHints_data();
288
void inputMethodQueryImHints();
290
void undoRedoAndEchoModes_data();
291
void undoRedoAndEchoModes();
294
void editingFinished();
296
void onTextChanged( const QString &newString );
297
void onTextEdited( const QString &newString );
298
void onReturnPressed();
299
void onSelectionChanged();
300
void onCursorPositionChanged(int oldpos, int newpos);
303
// keyClicks(..) is moved to QtTestCase
304
void psKeyClick(QWidget *target, Qt::Key key, Qt::KeyboardModifiers pressState = 0);
305
void psKeyClick(QTestEventList &keys, Qt::Key key, Qt::KeyboardModifiers pressState = 0);
308
QString changed_string;
315
QLineEdit *testWidget;
316
int m_keyboardScheme;
317
PlatformInputContext m_platformInputContext;
320
typedef QList<int> IntList;
321
Q_DECLARE_METATYPE(QLineEdit::EchoMode)
323
// Testing get/set functions
324
void tst_QLineEdit::getSetCheck()
327
// const QValidator * QLineEdit::validator()
328
// void QLineEdit::setValidator(const QValidator *)
329
QIntValidator *var1 = new QIntValidator(0);
330
obj1.setValidator(var1);
331
QCOMPARE((const QValidator *)var1, obj1.validator());
332
obj1.setValidator((QValidator *)0);
333
QCOMPARE((const QValidator *)0, obj1.validator());
336
// bool QLineEdit::dragEnabled()
337
// void QLineEdit::setDragEnabled(bool)
338
obj1.setDragEnabled(false);
339
QCOMPARE(false, obj1.dragEnabled());
340
obj1.setDragEnabled(true);
341
QCOMPARE(true, obj1.dragEnabled());
344
tst_QLineEdit::tst_QLineEdit() : validInput(false), m_keyboardScheme(0)
346
if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
347
m_keyboardScheme = theme->themeHint(QPlatformTheme::KeyboardScheme).toInt();
348
// Generalize for X11
349
if (m_keyboardScheme == QPlatformTheme::KdeKeyboardScheme
350
|| m_keyboardScheme == QPlatformTheme::GnomeKeyboardScheme
351
|| m_keyboardScheme == QPlatformTheme::CdeKeyboardScheme) {
352
m_keyboardScheme = QPlatformTheme::X11KeyboardScheme;
356
tst_QLineEdit::~tst_QLineEdit()
360
void tst_QLineEdit::initTestCase()
362
testWidget = new QLineEdit(0);
363
testWidget->setObjectName("testWidget");
364
connect(testWidget, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(onCursorPositionChanged(int,int)));
365
connect(testWidget, SIGNAL(textChanged(QString)), this, SLOT(onTextChanged(QString)));
366
connect(testWidget, SIGNAL(textEdited(QString)), this, SLOT(onTextEdited(QString)));
367
connect(testWidget, SIGNAL(returnPressed()), this, SLOT(onReturnPressed()));
368
connect(testWidget, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
369
connect(testWidget, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
371
testWidget->resize(200,50);
373
QVERIFY(QTest::qWaitForWindowExposed(testWidget));
374
QApplication::setActiveWindow(testWidget);
375
QTRY_VERIFY(testWidget->hasFocus());
381
QInputMethodPrivate *inputMethodPrivate = QInputMethodPrivate::get(qApp->inputMethod());
382
inputMethodPrivate->testContext = &m_platformInputContext;
385
void tst_QLineEdit::cleanupTestCase()
388
QInputMethodPrivate *inputMethodPrivate = QInputMethodPrivate::get(qApp->inputMethod());
389
inputMethodPrivate->testContext = 0;
392
void tst_QLineEdit::init()
396
testWidget->setEchoMode(QLineEdit::Normal);
397
testWidget->setMaxLength(32767);
398
testWidget->setReadOnly(false);
399
testWidget->setText("");
400
testWidget->setInputMask("");
401
testWidget->setFrame(true);
402
testWidget->setValidator(0);
403
testWidget->setDragEnabled(true);
406
void tst_QLineEdit::cleanup()
410
void tst_QLineEdit::experimental()
412
QIntValidator intValidator(3, 7, 0);
413
testWidget->setValidator(&intValidator);
414
testWidget->setText("");
417
// test the order of setting these
418
testWidget->setInputMask("");
419
testWidget->setText("abc123");
420
testWidget->setInputMask("000.000.000.000");
421
QCOMPARE(testWidget->text(), QString("123..."));
422
testWidget->setText("");
427
void tst_QLineEdit::upperAndLowercase()
429
testWidget->setInputMask("");
430
testWidget->setText("");
432
QTest::keyClicks(testWidget, "aAzZ`1234567890-=~!@#$%^&*()_+[]{}\\|;:'\",.<>/?");
433
qApp->processEvents();
434
QCOMPARE(testWidget->text(), QString("aAzZ`1234567890-=~!@#$%^&*()_+[]{}\\|;:'\",.<>/?"));
437
void tst_QLineEdit::setInputMask_data()
439
QTest::addColumn<QString>("mask");
440
QTest::addColumn<QString>("input");
441
QTest::addColumn<QString>("expectedText");
442
QTest::addColumn<QString>("expectedDisplay");
443
QTest::addColumn<bool>("insert_text");
445
// both keyboard and insert()
446
for (int i=0; i<2; i++) {
447
bool insert_text = i==0 ? false : true;
448
QString insert_mode = "keys ";
450
insert_mode = "insert ";
452
QTest::newRow(QString(insert_mode + "ip_localhost").toLatin1())
453
<< QString("000.000.000.000")
454
<< QString("127.0.0.1")
455
<< QString("127.0.0.1")
456
<< QString("127.0 .0 .1 ")
457
<< bool(insert_text);
458
QTest::newRow(QString(insert_mode + "mac").toLatin1())
459
<< QString("HH:HH:HH:HH:HH:HH;#")
460
<< QString("00:E0:81:21:9E:8E")
461
<< QString("00:E0:81:21:9E:8E")
462
<< QString("00:E0:81:21:9E:8E")
463
<< bool(insert_text);
464
QTest::newRow(QString(insert_mode + "mac2").toLatin1())
465
<< QString("<HH:>HH:!HH:HH:HH:HH;#")
466
<< QString("AAe081219E8E")
467
<< QString("aa:E0:81:21:9E:8E")
468
<< QString("aa:E0:81:21:9E:8E")
469
<< bool(insert_text);
470
QTest::newRow(QString(insert_mode + "byte").toLatin1())
471
<< QString("BBBBBBBB;0")
472
<< QString("11011001")
474
<< QString("11011001")
475
<< bool(insert_text);
476
QTest::newRow(QString(insert_mode + "halfbytes").toLatin1())
477
<< QString("bbbb.bbbb;-")
478
<< QString("110. 0001")
479
<< QString("110.0001")
480
<< QString("110-.0001")
481
<< bool(insert_text);
482
QTest::newRow(QString(insert_mode + "blank char same type as content").toLatin1())
483
<< QString("000.000.000.000;0")
484
<< QString("127.0.0.1")
485
<< QString("127...1")
486
<< QString("127.000.000.100")
487
<< bool(insert_text);
488
QTest::newRow(QString(insert_mode + "parts of ip_localhost").toLatin1())
489
<< QString("000.000.000.000")
492
<< QString(" .0 .0 .1 ")
493
<< bool(insert_text);
494
QTest::newRow(QString(insert_mode + "ip_null").toLatin1())
495
<< QString("000.000.000.000")
498
<< QString(" . . . ")
499
<< bool(insert_text);
500
QTest::newRow(QString(insert_mode + "ip_null_hash").toLatin1())
501
<< QString("000.000.000.000;#")
504
<< QString("###.###.###.###")
505
<< bool(insert_text);
506
QTest::newRow(QString(insert_mode + "ip_overflow").toLatin1())
507
<< QString("000.000.000.000")
508
<< QString("1234123412341234")
509
<< QString("123.412.341.234")
510
<< QString("123.412.341.234")
511
<< bool(insert_text);
512
QTest::newRow(QString(insert_mode + "uppercase").toLatin1())
517
<< bool(insert_text);
518
QTest::newRow(QString(insert_mode + "lowercase").toLatin1())
523
<< bool(insert_text);
525
QTest::newRow(QString(insert_mode + "nocase").toLatin1())
530
<< bool(insert_text);
531
QTest::newRow(QString(insert_mode + "nocase1").toLatin1())
532
<< QString("!A!A!A!A")
536
<< bool(insert_text);
537
QTest::newRow(QString(insert_mode + "nocase2").toLatin1())
542
<< bool(insert_text);
544
QTest::newRow(QString(insert_mode + "reserved").toLatin1())
549
<< bool(insert_text);
550
QTest::newRow(QString(insert_mode + "escape01").toLatin1())
551
<< QString("\\N\\n00")
555
<< bool(insert_text);
556
QTest::newRow(QString(insert_mode + "escape02").toLatin1())
561
<< bool(insert_text);
562
QTest::newRow(QString(insert_mode + "escape03").toLatin1())
563
<< QString("\\(00\\)")
567
<< bool(insert_text);
569
QTest::newRow(QString(insert_mode + "upper_lower_nocase1").toLatin1())
570
<< QString(">AAAA<AAAA!AAAA")
571
<< QString("AbCdEfGhIjKl")
572
<< QString("ABCDefghIjKl")
573
<< QString("ABCDefghIjKl")
574
<< bool(insert_text);
575
QTest::newRow(QString(insert_mode + "upper_lower_nocase2").toLatin1())
576
<< QString(">aaaa<aaaa!aaaa")
577
<< QString("AbCdEfGhIjKl")
578
<< QString("ABCDefghIjKl")
579
<< QString("ABCDefghIjKl")
580
<< bool(insert_text);
582
QTest::newRow(QString(insert_mode + "exact_case1").toLatin1())
583
<< QString(">A<A<A>A>A<A!A!A")
584
<< QString("AbCdEFGH")
585
<< QString("AbcDEfGH")
586
<< QString("AbcDEfGH")
587
<< bool(insert_text);
588
QTest::newRow(QString(insert_mode + "exact_case2").toLatin1())
589
<< QString(">A<A<A>A>A<A!A!A")
590
<< QString("aBcDefgh")
591
<< QString("AbcDEfgh")
592
<< QString("AbcDEfgh")
593
<< bool(insert_text);
594
QTest::newRow(QString(insert_mode + "exact_case3").toLatin1())
595
<< QString(">a<a<a>a>a<a!a!a")
596
<< QString("AbCdEFGH")
597
<< QString("AbcDEfGH")
598
<< QString("AbcDEfGH")
599
<< bool(insert_text);
600
QTest::newRow(QString(insert_mode + "exact_case4").toLatin1())
601
<< QString(">a<a<a>a>a<a!a!a")
602
<< QString("aBcDefgh")
603
<< QString("AbcDEfgh")
604
<< QString("AbcDEfgh")
605
<< bool(insert_text);
606
QTest::newRow(QString(insert_mode + "exact_case5").toLatin1())
607
<< QString(">H<H<H>H>H<H!H!H")
608
<< QString("aBcDef01")
609
<< QString("AbcDEf01")
610
<< QString("AbcDEf01")
611
<< bool(insert_text);
612
QTest::newRow(QString(insert_mode + "exact_case6").toLatin1())
613
<< QString(">h<h<h>h>h<h!h!h")
614
<< QString("aBcDef92")
615
<< QString("AbcDEf92")
616
<< QString("AbcDEf92")
617
<< bool(insert_text);
619
QTest::newRow(QString(insert_mode + "illegal_keys1").toLatin1())
620
<< QString("AAAAAAAA")
621
<< QString("A2#a;.0!")
624
<< bool(insert_text);
625
QTest::newRow(QString(insert_mode + "illegal_keys2").toLatin1())
627
<< QString("f4f4f4f4")
630
<< bool(insert_text);
631
QTest::newRow(QString(insert_mode + "blank=input").toLatin1())
636
<< bool(insert_text);
640
void tst_QLineEdit::setInputMask()
642
QFETCH(QString, mask);
643
QFETCH(QString, input);
644
QFETCH(QString, expectedText);
645
QFETCH(QString, expectedDisplay);
646
QFETCH(bool, insert_text);
648
QEXPECT_FAIL( "keys blank=input", "To eat blanks or not? Known issue. Task 43172", Abort);
649
QEXPECT_FAIL( "insert blank=input", "To eat blanks or not? Known issue. Task 43172", Abort);
651
// First set the input mask
652
testWidget->setInputMask(mask);
654
// then either insert using insert() or keyboard
656
testWidget->insert(input);
658
psKeyClick(testWidget, Qt::Key_Home);
659
for (int i=0; i<input.length(); i++)
660
QTest::keyClick(testWidget, input.at(i).toLatin1());
663
QCOMPARE(testWidget->text(), expectedText);
664
QCOMPARE(testWidget->displayText(), expectedDisplay);
667
void tst_QLineEdit::inputMask_data()
669
QTest::addColumn<QString>("mask");
670
QTest::addColumn<QString>("expectedMask");
672
// if no mask is set a nul string should be returned
673
QTest::newRow("nul 1") << QString("") << QString();
674
QTest::newRow("nul 2") << QString() << QString();
676
// try different masks
677
QTest::newRow("mask 1") << QString("000.000.000.000") << QString("000.000.000.000");
678
QTest::newRow("mask 2") << QString("000.000.000.000;#") << QString("000.000.000.000;#");
679
QTest::newRow("mask 3") << QString("AAA.aa.999.###;") << QString("AAA.aa.999.###");
680
QTest::newRow("mask 4") << QString(">abcdef<GHIJK") << QString(">abcdef<GHIJK");
682
// set an invalid input mask...
683
// the current behaviour is that this exact (faulty) string is returned.
684
QTest::newRow("invalid") << QString("ABCDEFGHIKLMNOP;") << QString("ABCDEFGHIKLMNOP");
686
// verify that we can unset the mask again
687
QTest::newRow("unset") << QString("") << QString();
690
void tst_QLineEdit::inputMask()
692
QFETCH(QString, mask);
693
QFETCH(QString, expectedMask);
695
testWidget->setInputMask(mask);
696
QCOMPARE(testWidget->inputMask(), expectedMask);
699
void tst_QLineEdit::clearInputMask()
701
testWidget->setInputMask("000.000.000.000");
702
QVERIFY(testWidget->inputMask() != QString::null);
703
testWidget->setInputMask(QString::null);
704
QCOMPARE(testWidget->inputMask(), QString());
707
void tst_QLineEdit::keypress_inputMask_data()
709
QTest::addColumn<QString>("mask");
710
QTest::addColumn<QTestEventList>("keys");
711
QTest::addColumn<QString>("expectedText");
712
QTest::addColumn<QString>("expectedDisplayText");
717
keys.addKeyClick(Qt::Key_Home);
718
keys.addKeyClick(Qt::Key_A);
719
keys.addKeyClick(Qt::Key_1);
720
keys.addKeyClick(Qt::Key_Period);
721
keys.addKeyClick(Qt::Key_2);
722
keys.addKeyClick(Qt::Key_B);
723
QTest::newRow("jumping on period(separator)") << QString("000.000;_") << keys << QString("1.2") << QString("1__.2__");
728
keys.addKeyClick(Qt::Key_Home);
729
keys.addKeyClick(Qt::Key_0);
730
keys.addKeyClick(Qt::Key_Exclam);
731
keys.addKeyClick('P');
732
keys.addKeyClick(Qt::Key_3);
733
QTest::newRow("jumping on input") << QString("D0.AA.XX.AA.00;_") << keys << QString("0..!P..3") << QString("_0.__.!P.__.3_");
738
keys.addKeyClick(Qt::Key_Home);
739
keys.addKeyClick(Qt::Key_Delete);
740
QTest::newRow("delete") << QString("000.000;_") << keys << QString(".") << QString("___.___");
744
// selecting all and delete
745
keys.addKeyClick(Qt::Key_Home);
746
keys.addKeyClick(Qt::Key_End, Qt::ShiftModifier);
747
keys.addKeyClick(Qt::Key_Delete);
748
QTest::newRow("deleting all") << QString("000.000;_") << keys << QString(".") << QString("___.___");
752
// inserting '12.12' then two backspaces
753
keys.addKeyClick(Qt::Key_Home);
754
keys.addKeyClick(Qt::Key_1);
755
keys.addKeyClick(Qt::Key_2);
756
keys.addKeyClick(Qt::Key_Period);
757
keys.addKeyClick(Qt::Key_1);
758
keys.addKeyClick(Qt::Key_2);
759
keys.addKeyClick(Qt::Key_Backspace);
760
keys.addKeyClick(Qt::Key_Backspace);
761
QTest::newRow("backspace") << QString("000.000;_") << keys << QString("12.") << QString("12_.___");
766
keys.addKeyClick(Qt::Key_Home);
767
keys.addKeyClick(Qt::Key_1);
768
keys.addKeyClick(Qt::Key_2);
769
keys.addKeyClick(Qt::Key_A);
770
keys.addKeyClick(Qt::Key_B);
771
QTest::newRow("uppercase") << QString("9999 >AA;_") << keys << QString("12 AB") << QString("12__ AB");
775
void tst_QLineEdit::keypress_inputMask()
777
QFETCH(QString, mask);
778
QFETCH(QTestEventList, keys);
779
QFETCH(QString, expectedText);
780
QFETCH(QString, expectedDisplayText);
782
testWidget->setInputMask(mask);
783
keys.simulate(testWidget);
785
QCOMPARE(testWidget->text(), expectedText);
786
QCOMPARE(testWidget->displayText(), expectedDisplayText);
790
void tst_QLineEdit::hasAcceptableInputMask_data()
792
QTest::addColumn<QString>("optionalMask");
793
QTest::addColumn<QString>("requiredMask");
794
QTest::addColumn<QString>("invalid");
795
QTest::addColumn<QString>("valid");
797
QTest::newRow("Alphabetic optional and required")
798
<< QString("aaaa") << QString("AAAA") << QString("ab") << QString("abcd");
799
QTest::newRow("Alphanumeric optional and require")
800
<< QString("nnnn") << QString("NNNN") << QString("R2") << QString("R2D2");
801
QTest::newRow("Any optional and required")
802
<< QString("xxxx") << QString("XXXX") << QString("+-") << QString("+-*/");
803
QTest::newRow("Numeric (0-9) required")
804
<< QString("0000") << QString("9999") << QString("11") << QString("1138");
805
QTest::newRow("Numeric (1-9) optional and required")
806
<< QString("dddd") << QString("DDDD") << QString("12") << QString("1234");
809
void tst_QLineEdit::hasAcceptableInputMask()
811
QFocusEvent lostFocus(QEvent::FocusOut);
812
QFETCH(QString, optionalMask);
813
QFETCH(QString, requiredMask);
814
QFETCH(QString, invalid);
815
QFETCH(QString, valid);
817
// test that invalid input (for required) work for optionalMask
818
testWidget->setInputMask(optionalMask);
820
testWidget->setText(invalid);
821
qApp->sendEvent(testWidget, &lostFocus);
824
// at the moment we don't strip the blank character if it is valid input, this makes the test between x vs X useless
825
QEXPECT_FAIL( "Any optional and required", "To eat blanks or not? Known issue. Task 43172", Abort);
828
testWidget->setInputMask(requiredMask);
830
testWidget->setText(invalid);
831
validInput = testWidget->hasAcceptableInput();
832
QVERIFY(!validInput);
835
testWidget->setText(valid);
836
qApp->sendEvent(testWidget, &lostFocus);
840
static const int chars = 8;
841
class ValidatorWithFixup : public QValidator
844
ValidatorWithFixup(QWidget *parent = 0)
848
QValidator::State validate(QString &str, int &) const
850
const int s = str.size();
853
} else if (s > chars) {
859
void fixup(QString &str) const
861
str = str.leftJustified(chars, 'X', true);
867
void tst_QLineEdit::hasAcceptableInputValidator()
869
QFocusEvent lostFocus(QEvent::FocusOut);
870
ValidatorWithFixup val;
871
testWidget->setValidator(&val);
872
testWidget->setText("foobar");
873
qApp->sendEvent(testWidget, &lostFocus);
874
QVERIFY(testWidget->hasAcceptableInput());
879
void tst_QLineEdit::maskCharacter_data()
881
QTest::addColumn<QString>("mask");
882
QTest::addColumn<QString>("input");
883
QTest::addColumn<bool>("expectedValid");
885
QTest::newRow("Hex") << QString("H")
886
<< QString("0123456789abcdefABCDEF") << true;
887
QTest::newRow("hex") << QString("h")
888
<< QString("0123456789abcdefABCDEF") << true;
889
QTest::newRow("HexInvalid") << QString("H")
890
<< QString("ghijklmnopqrstuvwxyzGHIJKLMNOPQRSTUVWXYZ")
892
QTest::newRow("hexInvalid") << QString("h")
893
<< QString("ghijklmnopqrstuvwxyzGHIJKLMNOPQRSTUVWXYZ")
895
QTest::newRow("Bin") << QString("B")
896
<< QString("01") << true;
897
QTest::newRow("bin") << QString("b")
898
<< QString("01") << true;
899
QTest::newRow("BinInvalid") << QString("B")
900
<< QString("23456789qwertyuiopasdfghjklzxcvbnm")
902
QTest::newRow("binInvalid") << QString("b")
903
<< QString("23456789qwertyuiopasdfghjklzxcvbnm")
907
void tst_QLineEdit::maskCharacter()
909
QFETCH(QString, mask);
910
QFETCH(QString, input);
911
QFETCH(bool, expectedValid);
913
QFocusEvent lostFocus(QEvent::FocusOut);
915
testWidget->setInputMask(mask);
916
for (int i = 0; i < input.size(); ++i) {
917
QString in = QString(input.at(i));
918
QString expected = expectedValid ? in : QString();
919
testWidget->setText(QString(input.at(i)));
920
qApp->sendEvent(testWidget, &lostFocus);
921
QCOMPARE(testWidget->text(), expected);
926
#define REPLACE_UNTIL_END 1
928
void tst_QLineEdit::undo_data()
930
QTest::addColumn<QStringList>("insertString");
931
QTest::addColumn<IntList>("insertIndex");
932
QTest::addColumn<IntList>("insertMode");
933
QTest::addColumn<QStringList>("expectedString");
934
QTest::addColumn<bool>("use_keys");
936
for (int i=0; i<2; i++) {
937
QString keys_str = "keyboard";
938
bool use_keys = true;
947
QStringList insertString;
948
QStringList expectedString;
951
insertMode << NORMAL;
955
insertMode << NORMAL;
959
insertMode << NORMAL;
963
insertMode << NORMAL;
967
insertMode << NORMAL;
970
expectedString << "12345";
971
expectedString << "1235";
972
expectedString << "135";
973
expectedString << "15";
974
expectedString << "";
976
QTest::newRow(QString(keys_str + "_numbers").toLatin1()) <<
986
QStringList insertString;
987
QStringList expectedString;
990
insertMode << NORMAL;
991
insertString << "World"; // World
994
insertMode << NORMAL;
995
insertString << "Hello"; // HelloWorld
998
insertMode << NORMAL;
999
insertString << "Well"; // WellHelloWorld
1002
insertMode << NORMAL;
1003
insertString << "There"; // WellHelloThereWorld;
1005
expectedString << "WellHelloThereWorld";
1006
expectedString << "WellHelloWorld";
1007
expectedString << "HelloWorld";
1008
expectedString << "World";
1009
expectedString << "";
1011
QTest::newRow(QString(keys_str + "_helloworld").toLatin1()) <<
1019
IntList insertIndex;
1021
QStringList insertString;
1022
QStringList expectedString;
1025
insertMode << NORMAL;
1026
insertString << "Ensuring";
1029
insertMode << NORMAL;
1030
insertString << " instan";
1033
insertMode << NORMAL;
1034
insertString << "an ";
1037
insertMode << REPLACE_UNTIL_END;
1038
insertString << " unique instance.";
1040
expectedString << "Ensuring a unique instance.";
1041
expectedString << "Ensuring an instan";
1042
expectedString << "Ensuring instan";
1043
expectedString << "";
1045
QTest::newRow(QString(keys_str + "_patterns").toLatin1()) <<
1055
void tst_QLineEdit::undo()
1057
QFETCH(QStringList, insertString);
1058
QFETCH(IntList, insertIndex);
1059
QFETCH(IntList, insertMode);
1060
QFETCH(QStringList, expectedString);
1061
QFETCH(bool, use_keys);
1063
QVERIFY(!testWidget->isUndoAvailable());
1067
// STEP 1: First build up an undo history by inserting or typing some strings...
1068
for (i=0; i<insertString.size(); ++i) {
1069
if (insertIndex[i] > -1)
1070
testWidget->setCursorPosition(insertIndex[i]);
1072
// experimental stuff
1073
if (insertMode[i] == REPLACE_UNTIL_END) {
1074
testWidget->setSelection(insertIndex[i], 8);
1076
// This is what I actually want...
1077
// QTest::keyClick(testWidget, Qt::Key_End, Qt::ShiftModifier);
1081
QTest::keyClicks(testWidget, insertString[i]);
1083
testWidget->insert(insertString[i]);
1086
// STEP 2: Next call undo several times and see if we can restore to the previous state
1087
for (i=0; i<expectedString.size()-1; ++i) {
1088
QCOMPARE(testWidget->text(), expectedString[i]);
1089
QVERIFY(testWidget->isUndoAvailable());
1093
// STEP 3: Verify that we have undone everything
1094
QVERIFY(!testWidget->isUndoAvailable());
1095
QVERIFY(testWidget->text().isEmpty());
1098
if (m_keyboardScheme == QPlatformTheme::WindowsKeyboardScheme) {
1099
// Repeat the test using shortcut instead of undo()
1100
for (i=0; i<insertString.size(); ++i) {
1101
if (insertIndex[i] > -1)
1102
testWidget->setCursorPosition(insertIndex[i]);
1103
if (insertMode[i] == REPLACE_UNTIL_END)
1104
testWidget->setSelection(insertIndex[i], 8);
1106
QTest::keyClicks(testWidget, insertString[i]);
1108
testWidget->insert(insertString[i]);
1110
for (i=0; i<expectedString.size()-1; ++i) {
1111
QCOMPARE(testWidget->text(), expectedString[i]);
1112
QVERIFY(testWidget->isUndoAvailable());
1113
QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
1119
void tst_QLineEdit::redo_data()
1121
QTest::addColumn<QStringList>("insertString");
1122
QTest::addColumn<IntList>("insertIndex");
1123
QTest::addColumn<QStringList>("expectedString");
1126
IntList insertIndex;
1127
QStringList insertString;
1128
QStringList expectedString;
1131
insertString << "World"; // World
1133
insertString << "Hello"; // HelloWorld
1135
insertString << "Well"; // WellHelloWorld
1137
insertString << "There"; // WellHelloThereWorld;
1139
expectedString << "World";
1140
expectedString << "HelloWorld";
1141
expectedString << "WellHelloWorld";
1142
expectedString << "WellHelloThereWorld";
1144
QTest::newRow("Inserts and setting cursor") << insertString << insertIndex << expectedString;
1148
void tst_QLineEdit::redo()
1150
QFETCH(QStringList, insertString);
1151
QFETCH(IntList, insertIndex);
1152
QFETCH(QStringList, expectedString);
1154
QVERIFY(!testWidget->isUndoAvailable());
1155
QVERIFY(!testWidget->isRedoAvailable());
1158
// inserts the diff strings at diff positions
1159
for (i=0; i<insertString.size(); ++i) {
1160
if (insertIndex[i] > -1)
1161
testWidget->setCursorPosition(insertIndex[i]);
1162
testWidget->insert(insertString[i]);
1165
QVERIFY(!testWidget->isRedoAvailable());
1168
while (!testWidget->text().isEmpty())
1171
for (i=0; i<expectedString.size(); ++i) {
1172
QVERIFY(testWidget->isRedoAvailable());
1174
QCOMPARE(testWidget->text() , expectedString[i]);
1177
QVERIFY(!testWidget->isRedoAvailable());
1180
if (m_keyboardScheme == QPlatformTheme::WindowsKeyboardScheme) {
1181
// repeat test, this time using shortcuts instead of undo()/redo()
1183
while (!testWidget->text().isEmpty())
1184
QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
1186
for (i = 0; i < expectedString.size(); ++i) {
1187
QVERIFY(testWidget->isRedoAvailable());
1188
QTest::keyClick(testWidget, Qt::Key_Backspace,
1189
Qt::ShiftModifier | Qt::AltModifier);
1190
QCOMPARE(testWidget->text() , expectedString[i]);
1193
QVERIFY(!testWidget->isRedoAvailable());
1197
void tst_QLineEdit::undo_keypressevents_data()
1199
QTest::addColumn<QTestEventList>("keys");
1200
QTest::addColumn<QStringList>("expectedString");
1203
QTestEventList keys;
1204
QStringList expectedString;
1206
keys.addKeyClick('A');
1207
keys.addKeyClick('F');
1208
keys.addKeyClick('R');
1209
keys.addKeyClick('A');
1210
keys.addKeyClick('I');
1211
keys.addKeyClick('D');
1212
psKeyClick(keys, Qt::Key_Home);
1214
keys.addKeyClick('V');
1215
keys.addKeyClick('E');
1216
keys.addKeyClick('R');
1217
keys.addKeyClick('Y');
1219
keys.addKeyClick(Qt::Key_Left);
1220
keys.addKeyClick(Qt::Key_Left);
1221
keys.addKeyClick(Qt::Key_Left);
1222
keys.addKeyClick(Qt::Key_Left);
1224
keys.addKeyClick('B');
1225
keys.addKeyClick('E');
1226
psKeyClick(keys, Qt::Key_End);
1228
keys.addKeyClick(Qt::Key_Exclam);
1230
expectedString << "BEVERYAFRAID!";
1231
expectedString << "BEVERYAFRAID";
1232
expectedString << "VERYAFRAID";
1233
expectedString << "AFRAID";
1235
QTest::newRow("Inserts and moving cursor") << keys << expectedString;
1239
QTestEventList keys;
1240
QStringList expectedString;
1243
keys.addKeyClick(Qt::Key_1);
1244
keys.addKeyClick(Qt::Key_2);
1245
keys.addKeyClick(Qt::Key_3);
1246
keys.addKeyClick(Qt::Key_4);
1247
psKeyClick(keys, Qt::Key_Home);
1250
keys.addKeyClick(Qt::Key_Right);
1251
keys.addKeyClick(Qt::Key_Right);
1254
keys.addKeyClick(Qt::Key_Right, Qt::ShiftModifier);
1255
keys.addKeyClick(Qt::Key_Right, Qt::ShiftModifier);
1258
keys.addKeyClick(Qt::Key_Delete);
1260
expectedString << "12";
1261
expectedString << "1234";
1263
QTest::newRow("Inserts,moving,selection and delete") << keys << expectedString;
1267
QTestEventList keys;
1268
QStringList expectedString;
1271
keys.addKeyClick('A');
1272
keys.addKeyClick('B');
1274
keys.addKeyClick(Qt::Key_1);
1275
keys.addKeyClick(Qt::Key_2);
1277
psKeyClick(keys, Qt::Key_Home);
1280
keys.addKeyClick(Qt::Key_Right, Qt::ShiftModifier);
1281
keys.addKeyClick(Qt::Key_Right, Qt::ShiftModifier);
1284
keys.addKeyClick(Qt::Key_Delete);
1286
// undoing deletion of 'AB'
1287
keys.addKeyClick(Qt::Key_Z, Qt::ControlModifier);
1289
// unselect any current selection
1290
keys.addKeyClick(Qt::Key_Right);
1291
#ifdef Q_OS_WIN //Mac has a specialcase to handle jumping to the end of a selection
1292
keys.addKeyClick(Qt::Key_Left);
1296
keys.addKeyClick(Qt::Key_Right, Qt::ShiftModifier);
1297
keys.addKeyClick(Qt::Key_Right, Qt::ShiftModifier);
1300
keys.addKeyClick(Qt::Key_Delete);
1302
expectedString << "AB";
1303
expectedString << "AB12";
1305
QTest::newRow("Inserts,moving,selection, delete and undo") << keys << expectedString;
1309
QTestEventList keys;
1310
QStringList expectedString;
1313
keys.addKeyClick(Qt::Key_A);
1314
keys.addKeyClick(Qt::Key_B);
1315
keys.addKeyClick(Qt::Key_C);
1316
keys.addKeyClick(Qt::Key_D);
1319
keys.addKeyClick(Qt::Key_Left);
1320
keys.addKeyClick(Qt::Key_Left);
1323
keys.addKeyClick(Qt::Key_1);
1324
keys.addKeyClick(Qt::Key_2);
1325
keys.addKeyClick(Qt::Key_3);
1326
keys.addKeyClick(Qt::Key_4);
1329
keys.addKeyClick(Qt::Key_Left, Qt::ShiftModifier);
1330
keys.addKeyClick(Qt::Key_Left, Qt::ShiftModifier);
1331
keys.addKeyClick(Qt::Key_Left, Qt::ShiftModifier);
1332
keys.addKeyClick(Qt::Key_Left, Qt::ShiftModifier);
1334
// overwriting '1234' with '5'
1335
keys.addKeyClick(Qt::Key_5);
1337
// undoing deletion of 'AB'
1338
keys.addKeyClick(Qt::Key_Z, Qt::ControlModifier);
1340
// overwriting '1234' with '6'
1341
keys.addKeyClick(Qt::Key_6);
1343
expectedString << "ab6cd";
1344
// for versions previous to 3.2 we overwrite needed two undo operations
1345
expectedString << "ab1234cd";
1346
expectedString << "abcd";
1348
QTest::newRow("Inserts,moving,selection and undo, removing selection") << keys << expectedString;
1352
QTestEventList keys;
1353
QStringList expectedString;
1356
keys.addKeyClick('A');
1357
keys.addKeyClick('B');
1358
keys.addKeyClick('C');
1361
keys.addKeyClick(Qt::Key_Backspace);
1363
expectedString << "AB";
1364
expectedString << "ABC";
1366
QTest::newRow("Inserts,backspace") << keys << expectedString;
1370
QTestEventList keys;
1371
QStringList expectedString;
1374
keys.addKeyClick('A');
1375
keys.addKeyClick('B');
1376
keys.addKeyClick('C');
1379
keys.addKeyClick(Qt::Key_Backspace);
1382
keys.addKeyClick('Z');
1384
expectedString << "ABZ";
1385
expectedString << "AB";
1386
expectedString << "ABC";
1388
QTest::newRow("Inserts,backspace,inserts") << keys << expectedString;
1393
QTestEventList keys;
1394
QStringList expectedString;
1397
keys.addKeyClick(Qt::Key_1);
1398
keys.addKeyClick(Qt::Key_2);
1399
keys.addKeyClick(Qt::Key_3);
1400
psKeyClick(keys, Qt::Key_Home);
1403
psKeyClick(keys, Qt::Key_End, Qt::ShiftModifier);
1405
// overwriting '123' with 'ABC'
1406
keys.addKeyClick('A');
1407
keys.addKeyClick('B');
1408
keys.addKeyClick('C');
1410
expectedString << "ABC";
1411
// for versions previous to 3.2 we overwrite needed two undo operations
1412
expectedString << "123";
1414
QTest::newRow("Inserts,moving,selection and overwriting") << keys << expectedString;
1418
void tst_QLineEdit::undo_keypressevents()
1420
QFETCH(QTestEventList, keys);
1421
QFETCH(QStringList, expectedString);
1423
keys.simulate(testWidget);
1425
for (int i=0; i<expectedString.size(); ++i) {
1426
QCOMPARE(testWidget->text() , expectedString[i]);
1429
QVERIFY(testWidget->text().isEmpty());
1432
#ifndef QT_NO_CLIPBOARD
1433
void tst_QLineEdit::QTBUG5786_undoPaste()
1435
if (!PlatformClipboard::isAvailable())
1436
QSKIP("this machine doesn't support the clipboard");
1437
QString initial("initial");
1438
QString string("test");
1439
QString additional("add");
1440
QApplication::clipboard()->setText(string);
1441
QLineEdit edit(initial);
1442
QCOMPARE(edit.text(), initial);
1444
QCOMPARE(edit.text(), initial + string);
1446
QCOMPARE(edit.text(), initial + string + string);
1447
edit.insert(additional);
1448
QCOMPARE(edit.text(), initial + string + string + additional);
1450
QCOMPARE(edit.text(), initial + string + string);
1452
QCOMPARE(edit.text(), initial + string);
1454
QCOMPARE(edit.text(), initial);
1456
QApplication::clipboard()->setText(QString());
1458
QVERIFY(edit.text().isEmpty());
1464
void tst_QLineEdit::clear()
1466
// checking that clear of empty/nullstring doesn't add to undo history
1468
while (max > 0 && testWidget->isUndoAvailable()) {
1473
testWidget->clear();
1474
// QVERIFY(!testWidget->isUndoAvailable());
1476
// checks that clear actually clears
1477
testWidget->insert("I am Legend");
1478
testWidget->clear();
1479
QVERIFY(testWidget->text().isEmpty());
1481
// checks that clears can be undone
1483
QCOMPARE(testWidget->text(), QString("I am Legend"));
1486
void tst_QLineEdit::editingFinished()
1488
if (testWidget->hasAcceptableInput())
1494
void tst_QLineEdit::text_data()
1496
QTest::addColumn<QString>("insertString");
1498
QTest::newRow("Plain text0") << QString("Hello World");
1499
QTest::newRow("Plain text1") << QString("");
1500
QTest::newRow("Plain text2") << QString("A");
1501
QTest::newRow("Plain text3") << QString("ryyryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryry");
1502
QTest::newRow("Plain text4") << QString("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890`~!@#$%^&*()_-+={[}]|\\:;'?/>.<,\"");
1503
QTest::newRow("Newlines") << QString("A\nB\nC\n");
1504
QTest::newRow("Text with nbsp") << QString("Hello") + QChar(0xa0) + "World";
1507
void tst_QLineEdit::text()
1509
QFETCH(QString, insertString);
1510
testWidget->setText(insertString);
1511
QCOMPARE(testWidget->text(), insertString);
1514
void tst_QLineEdit::textMask_data()
1516
QTest::addColumn<QString>("insertString");
1518
QTest::newRow( "Plain text1" ) << QString( "" );
1521
void tst_QLineEdit::textMask()
1523
QFETCH( QString, insertString );
1524
testWidget->setInputMask( "#" );
1525
testWidget->setText( insertString );
1526
QCOMPARE( testWidget->text(), insertString );
1529
void tst_QLineEdit::setText()
1531
QSignalSpy editedSpy(testWidget, SIGNAL(textEdited(QString)));
1532
QSignalSpy changedSpy(testWidget, SIGNAL(textChanged(QString)));
1533
testWidget->setText("hello");
1534
QCOMPARE(editedSpy.count(), 0);
1535
QCOMPARE(changedSpy.value(0).value(0).toString(), QString("hello"));
1538
void tst_QLineEdit::displayText_data()
1540
QTest::addColumn<QString>("insertString");
1541
QTest::addColumn<QString>("expectedString");
1542
QTest::addColumn<QLineEdit::EchoMode>("mode");
1543
QTest::addColumn<bool>("use_setText");
1546
QLineEdit::EchoMode m;
1548
for (int i=0; i<2; i++) {
1549
QString key_mode_str;
1552
key_mode_str = "setText_";
1555
key_mode_str = "useKeys_";
1556
use_setText = false;
1558
s = key_mode_str + "Normal";
1559
m = QLineEdit::Normal;
1560
QTest::newRow(QString(s + " text0").toLatin1()) << QString("Hello World") <<
1561
QString("Hello World") <<
1562
m << bool(use_setText);
1563
QTest::newRow(QString(s + " text1").toLatin1()) << QString("") <<
1565
m << bool(use_setText);
1566
QTest::newRow(QString(s + " text2").toLatin1()) << QString("A") <<
1568
m << bool(use_setText);
1569
QTest::newRow(QString(s + " text3").toLatin1()) << QString("ryyryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryry") <<
1570
QString("ryyryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryry") <<
1571
m << bool(use_setText);
1572
QTest::newRow(QString(s + " text4").toLatin1()) << QString("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890`~!@#$%^&*()_-+={[}]|\\:;'?/>.<,\"") <<
1573
QString("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890`~!@#$%^&*()_-+={[}]|\\:;'?/>.<,\"") <<
1574
m << bool(use_setText);
1575
QTest::newRow(QString(s + " text with nbsp").toLatin1()) << QString("Hello") + QChar(0xa0) + "World" <<
1576
QString("Hello") + QChar(0xa0) + "World" <<
1577
m << bool(use_setText);
1578
s = key_mode_str + "NoEcho";
1579
m = QLineEdit::NoEcho;
1580
QTest::newRow(QString(s + " text0").toLatin1()) << QString("Hello World") <<
1582
m << bool(use_setText);
1583
QTest::newRow(QString(s + " text1").toLatin1()) << QString("") <<
1585
m << bool(use_setText);
1586
QTest::newRow(QString(s + " text2").toLatin1()) << QString("A") <<
1588
m << bool(use_setText);
1589
QTest::newRow(QString(s + " text3").toLatin1()) << QString("ryyryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryry") <<
1591
m << bool(use_setText);
1592
QTest::newRow(QString(s + " text4").toLatin1()) << QString("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890`~!@#$%^&*()_-+={[}]|\\:;'?/>.<,\"") <<
1594
m << bool(use_setText);
1595
QTest::newRow(QString(s + " text with nbsp").toLatin1()) << QString("Hello") + QChar(0xa0) + "World" <<
1597
m << bool(use_setText);
1598
s = key_mode_str + "Password";
1599
m = QLineEdit::Password;
1600
QChar passChar = qApp->style()->styleHint(QStyle::SH_LineEdit_PasswordCharacter, 0, testWidget);
1603
input = "Hello World";
1604
pass.resize(input.length());
1605
pass.fill(passChar);
1606
QTest::newRow(QString(s + " text0").toLatin1()) << input << pass << m << bool(use_setText);
1607
QTest::newRow(QString(s + " text1").toLatin1()) << QString("") <<
1609
m << bool(use_setText);
1610
QTest::newRow(QString(s + " text2").toLatin1()) << QString("A") << QString(passChar) << m << bool(use_setText);
1611
input = QString("ryyryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryrryryryryryryryryryryryryry");
1612
pass.resize(input.length());
1613
pass.fill(passChar);
1614
QTest::newRow(QString(s + " text3").toLatin1()) << input << pass << m << bool(use_setText);
1615
input = QString("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890`~!@#$%^&*()_-+={[}]|\\:;'?/>.<,\"");
1616
pass.fill(passChar, input.length());
1617
QTest::newRow(QString(s + " text4").toLatin1()) << input << pass << m << bool(use_setText);
1618
input = QString("Hello") + QChar(0xa0) + "World";
1619
pass.resize(input.length());
1620
pass.fill(passChar);
1621
QTest::newRow(QString(s + " text with nbsp").toLatin1()) << input << pass << m << bool(use_setText);
1625
void tst_QLineEdit::displayText()
1627
QFETCH(QString, insertString);
1628
QFETCH(QString, expectedString);
1629
QFETCH(QLineEdit::EchoMode, mode);
1630
//QFETCH(bool, use_setText); Currently unused.
1632
testWidget->setEchoMode(mode);
1633
testWidget->setText(insertString);
1634
QCOMPARE(testWidget->displayText(), expectedString);
1635
QVERIFY(testWidget->echoMode() == mode);
1638
void tst_QLineEdit::passwordEchoOnEdit()
1640
QStyleOptionFrameV2 opt;
1641
QChar fillChar = testWidget->style()->styleHint(QStyle::SH_LineEdit_PasswordCharacter, &opt, testWidget);
1643
testWidget->setEchoMode(QLineEdit::PasswordEchoOnEdit);
1644
testWidget->setFocus();
1645
testWidget->raise();
1646
QTRY_VERIFY(testWidget->hasFocus());
1648
QTest::keyPress(testWidget, '0');
1649
QTest::keyPress(testWidget, '1');
1650
QTest::keyPress(testWidget, '2');
1651
QTest::keyPress(testWidget, '3');
1652
QTest::keyPress(testWidget, '4');
1653
QCOMPARE(testWidget->displayText(), QString("01234"));
1654
testWidget->clearFocus();
1655
QVERIFY(!testWidget->hasFocus());
1656
QCOMPARE(testWidget->displayText(), QString(5, fillChar));
1657
testWidget->setFocus();
1658
QTRY_VERIFY(testWidget->hasFocus());
1660
QCOMPARE(testWidget->displayText(), QString(5, fillChar));
1661
QTest::keyPress(testWidget, '0');
1662
QCOMPARE(testWidget->displayText(), QString("0"));
1664
// restore clean state
1665
testWidget->setEchoMode(QLineEdit::Normal);
1668
void tst_QLineEdit::passwordEchoDelay()
1670
int delay = qGuiApp->styleHints()->passwordMaskDelay();
1671
#if defined QT_BUILD_INTERNAL
1672
QLineEditPrivate *priv = QLineEditPrivate::get(testWidget);
1673
QWidgetLineControl *control = priv->control;
1674
control->m_passwordMaskDelayOverride = 200;
1678
QSKIP("Platform not defining echo delay and overriding only possible in internal build");
1680
QStyleOptionFrameV2 opt;
1681
QChar fillChar = testWidget->style()->styleHint(QStyle::SH_LineEdit_PasswordCharacter, &opt, testWidget);
1683
testWidget->setEchoMode(QLineEdit::Password);
1684
testWidget->setFocus();
1685
testWidget->raise();
1686
QTRY_VERIFY(testWidget->hasFocus());
1688
QTest::keyPress(testWidget, '0');
1689
QTest::keyPress(testWidget, '1');
1690
QTest::keyPress(testWidget, '2');
1691
QCOMPARE(testWidget->displayText(), QString(2, fillChar) + QLatin1Char('2'));
1692
QTest::keyPress(testWidget, '3');
1693
QTest::keyPress(testWidget, '4');
1694
QCOMPARE(testWidget->displayText(), QString(4, fillChar) + QLatin1Char('4'));
1695
QTest::keyPress(testWidget, Qt::Key_Backspace);
1696
QCOMPARE(testWidget->displayText(), QString(4, fillChar));
1697
QTest::keyPress(testWidget, '4');
1698
QCOMPARE(testWidget->displayText(), QString(4, fillChar) + QLatin1Char('4'));
1699
QTest::qWait(delay);
1700
QTRY_COMPARE(testWidget->displayText(), QString(5, fillChar));
1701
QTest::keyPress(testWidget, '5');
1702
QCOMPARE(testWidget->displayText(), QString(5, fillChar) + QLatin1Char('5'));
1703
testWidget->clearFocus();
1704
QVERIFY(!testWidget->hasFocus());
1705
QCOMPARE(testWidget->displayText(), QString(6, fillChar));
1706
testWidget->setFocus();
1707
QTRY_VERIFY(testWidget->hasFocus());
1708
QCOMPARE(testWidget->displayText(), QString(6, fillChar));
1709
QTest::keyPress(testWidget, '6');
1710
QCOMPARE(testWidget->displayText(), QString(6, fillChar) + QLatin1Char('6'));
1712
QInputMethodEvent ev;
1713
ev.setCommitString(QLatin1String("7"));
1714
QApplication::sendEvent(testWidget, &ev);
1715
QCOMPARE(testWidget->displayText(), QString(7, fillChar) + QLatin1Char('7'));
1717
testWidget->setCursorPosition(3);
1718
QCOMPARE(testWidget->displayText(), QString(7, fillChar) + QLatin1Char('7'));
1719
QTest::keyPress(testWidget, 'a');
1720
QCOMPARE(testWidget->displayText(), QString(3, fillChar) + QLatin1Char('a') + QString(5, fillChar));
1721
QTest::keyPress(testWidget, Qt::Key_Backspace);
1722
QCOMPARE(testWidget->displayText(), QString(8, fillChar));
1724
// restore clean state
1725
testWidget->setEchoMode(QLineEdit::Normal);
1728
void tst_QLineEdit::maxLength_mask_data()
1730
QTest::addColumn<QString>("mask");
1731
QTest::addColumn<int>("expectedLength");
1733
QTest::newRow("mask_case") << QString(">000<>00<000") << 8;
1734
QTest::newRow("mask_nocase") << QString("00000000") << 8;
1735
QTest::newRow("mask_null") << QString() << 32767;
1736
QTest::newRow("mask_escape") << QString("\\A\\aAA") << 4;
1739
void tst_QLineEdit::maxLength_mask()
1741
QFETCH(QString, mask);
1742
QFETCH(int, expectedLength);
1744
testWidget->setInputMask(mask);
1746
QCOMPARE(testWidget->maxLength(), expectedLength);
1749
void tst_QLineEdit::maxLength_data()
1751
QTest::addColumn<QString>("insertString");
1752
QTest::addColumn<QString>("expectedString");
1753
QTest::addColumn<int>("length");
1754
QTest::addColumn<bool>("insertBeforeSettingMaxLength");
1755
QTest::addColumn<bool>("use_setText");
1757
QTest::newRow("keyclick before0") << QString("this is a test.") << QString("this is a test.") << 20 << bool(true) << bool(false);
1758
QTest::newRow("keyclick before1") << QString("this is a test.") << QString("this is a ") << 10 << bool(true) << bool(false);
1759
QTest::newRow("keyclick after0") << QString("this is a test.") << QString("this is a test.") << 20 << bool(false) << bool(false);
1760
QTest::newRow("keyclick after1") << QString("this is a test.") << QString("this is a ") << 10 << bool(false) << bool(false);
1761
QTest::newRow("settext before0") << QString("this is a test.") << QString("this is a test.") << 20 << bool(true) << bool(true);
1762
QTest::newRow("settext before1") << QString("this is a test.") << QString("this is a ") << 10 << bool(true) << bool(true);
1763
QTest::newRow("settext after0") << QString("this is a test.") << QString("this is a test.") << 20 << bool(false) << bool(true);
1764
QTest::newRow("settext after1") << QString("this is a test.") << QString("this is a ") << 10 << bool(false) << bool(true);
1767
void tst_QLineEdit::maxLength()
1769
QFETCH(QString, insertString);
1770
QFETCH(QString, expectedString);
1771
QFETCH(int, length);
1772
QFETCH(bool, insertBeforeSettingMaxLength);
1773
QFETCH(bool, use_setText);
1775
// in some cases we set the maxLength _before_ entering the text.
1776
if (!insertBeforeSettingMaxLength)
1777
testWidget->setMaxLength(length);
1779
// I expect MaxLength to work BOTH with entering live characters AND with setting the text.
1781
// Enter insertString using setText.
1782
testWidget->setText(insertString);
1784
// Enter insertString as a sequence of keyClicks
1785
QTest::keyClicks(testWidget, insertString);
1788
// in all other cases we set the maxLength _after_ entering the text.
1789
if (insertBeforeSettingMaxLength) {
1791
testWidget->setMaxLength(length);
1793
// Make sure that the textChanged is not emitted unless the text is actually changed
1794
if (insertString == expectedString) {
1795
QVERIFY(changed_count == 0);
1797
QVERIFY(changed_count == 1);
1801
// and check if we get the expected string back
1802
QCOMPARE(testWidget->text(), expectedString);
1805
void tst_QLineEdit::isReadOnly()
1807
QVERIFY(!testWidget->isReadOnly());
1809
// start with a basic text
1810
QTest::keyClicks(testWidget, "the quick brown fox");
1811
QCOMPARE(testWidget->text(), QString("the quick brown fox"));
1813
// do a quick check to verify that we can indeed edit the text
1814
testWidget->home(false);
1815
testWidget->cursorForward(false, 10);
1816
QTest::keyClicks(testWidget, "dark ");
1817
QCOMPARE(testWidget->text(), QString("the quick dark brown fox"));
1819
testWidget->setReadOnly(true);
1820
QVERIFY(testWidget->isReadOnly());
1822
// verify that we cannot edit the text anymore
1823
testWidget->home(false);
1824
testWidget->cursorForward(false, 10);
1825
QTest::keyClick(testWidget, Qt::Key_Delete);
1826
QCOMPARE(testWidget->text(), QString("the quick dark brown fox"));
1827
testWidget->cursorForward(false, 10);
1828
QTest::keyClicks(testWidget, "this should not have any effect!! ");
1829
QCOMPARE(testWidget->text(), QString("the quick dark brown fox"));
1832
class BlinkTestLineEdit : public QLineEdit
1835
void paintEvent(QPaintEvent *e)
1838
QLineEdit::paintEvent(e);
1844
void tst_QLineEdit::noCursorBlinkWhenReadOnly()
1846
int cursorFlashTime = QApplication::cursorFlashTime();
1847
if (cursorFlashTime == 0)
1849
BlinkTestLineEdit le;
1852
QTest::qWaitForWindowActive(&le);
1854
QTest::qWait(cursorFlashTime);
1855
QVERIFY(le.updates > 0);
1856
le.setReadOnly(true);
1859
QTest::qWait(cursorFlashTime);
1860
QCOMPARE(le.updates, 0);
1861
le.setReadOnly(false);
1864
QTest::qWait(cursorFlashTime);
1865
QVERIFY(le.updates > 0);
1868
static void figureOutProperKey(Qt::Key &key, Qt::KeyboardModifiers &pressState)
1871
static bool tst_lineedit_randomized = false;
1872
// Mac has 3 different ways of accomplishing this (same for moving to the back)
1873
// So I guess we should just randomly do this for now. Which may get people mad, but if
1874
// we fail at one point, it's just a matter of setting roll to the correct value
1875
// instead of random.
1877
if (!tst_lineedit_randomized) {
1878
tst_lineedit_randomized = true;
1879
::srandom(ulong(time(0)));
1881
long roll = ::random() % 3;
1884
key = key == Qt::Key_Home ? Qt::Key_Up : Qt::Key_Down;
1888
key = key == Qt::Key_Home ? Qt::Key_Left : Qt::Key_Right;
1889
pressState |= (roll == 1) ? Qt::ControlModifier : Qt::MetaModifier;
1893
// Naively kill the warning.
1895
pressState = pressState;
1899
// Platform specific move. Home and End do nothing on the Mac,
1900
// so do something a bit smarter than tons of #ifdefs
1901
void tst_QLineEdit::psKeyClick(QWidget *target, Qt::Key key, Qt::KeyboardModifiers pressState)
1903
figureOutProperKey(key, pressState);
1904
QTest::keyClick(target, key, pressState);
1907
void tst_QLineEdit::psKeyClick(QTestEventList &keys, Qt::Key key, Qt::KeyboardModifiers pressState)
1909
figureOutProperKey(key, pressState);
1910
keys.addKeyClick(key, pressState);
1913
void tst_QLineEdit::cursorPosition()
1915
QVERIFY(testWidget->cursorPosition() == 0);
1917
// start with a basic text
1918
QTest::keyClicks(testWidget, "The");
1919
QCOMPARE(testWidget->cursorPosition(), 3);
1920
QTest::keyClicks(testWidget, " quick");
1921
QCOMPARE(testWidget->cursorPosition(), 9);
1922
QTest::keyClicks(testWidget, " brown fox jumps over the lazy dog");
1923
QCOMPARE(testWidget->cursorPosition(), 43);
1925
// The text we have now is:
1927
// 012345678901234567890123456789012345678901234567890
1928
// The quick brown fox jumps over the lazy dog
1930
// next we will check some of the cursor movement functions
1931
testWidget->end(false);
1932
QCOMPARE(testWidget->cursorPosition() , 43);
1933
testWidget->cursorForward(false, -1);
1934
QCOMPARE(testWidget->cursorPosition() , 42);
1935
testWidget->cursorBackward(false, 1);
1936
QCOMPARE(testWidget->cursorPosition() , 41);
1937
testWidget->home(false);
1938
QCOMPARE(testWidget->cursorPosition() , 0);
1939
testWidget->cursorForward(false, 1);
1940
QCOMPARE(testWidget->cursorPosition() , 1);
1941
testWidget->cursorForward(false, 9);
1942
QCOMPARE(testWidget->cursorPosition() , 10);
1943
testWidget->cursorWordForward(false); // 'fox'
1944
QCOMPARE(testWidget->cursorPosition(), 16);
1945
testWidget->cursorWordForward(false); // 'jumps'
1946
QCOMPARE(testWidget->cursorPosition(), 20);
1947
testWidget->cursorWordBackward(false); // 'fox'
1948
QCOMPARE(testWidget->cursorPosition(), 16);
1949
testWidget->cursorWordBackward(false); // 'brown'
1950
testWidget->cursorWordBackward(false); // 'quick'
1951
testWidget->cursorWordBackward(false); // 'The'
1952
QCOMPARE(testWidget->cursorPosition(), 0);
1953
testWidget->cursorWordBackward(false); // 'The'
1954
QCOMPARE(testWidget->cursorPosition(), 0);
1956
// Cursor position should be 0 here!
1959
QTest::keyClick(testWidget, Qt::Key_Right);
1960
QCOMPARE(testWidget->cursorPosition(), 5);
1961
psKeyClick(testWidget, Qt::Key_End);
1962
QCOMPARE(testWidget->cursorPosition(), 43);
1963
QTest::keyClick(testWidget, Qt::Key_Left);
1964
QCOMPARE(testWidget->cursorPosition(), 42);
1965
QTest::keyClick(testWidget, Qt::Key_Left);
1966
QCOMPARE(testWidget->cursorPosition(), 41);
1967
psKeyClick(testWidget, Qt::Key_Home);
1968
QCOMPARE(testWidget->cursorPosition(), 0);
1970
// cursorposition when maxlength is set
1972
testWidget->clear();
1973
testWidget->setMaxLength(maxLength);
1974
QCOMPARE(testWidget->cursorPosition() , 0);
1975
QTest::keyClicks(testWidget, "123ABC123");
1976
QCOMPARE(testWidget->cursorPosition() , maxLength);
1977
psKeyClick(testWidget, Qt::Key_Home);
1978
QCOMPARE(testWidget->cursorPosition() , 0);
1979
psKeyClick(testWidget, Qt::Key_End);
1980
QCOMPARE(testWidget->cursorPosition() , maxLength);
1983
/* // tested in cursorPosition
1984
void tst_QLineEdit::cursorLeft()
1985
void tst_QLineEdit::cursorRight()
1986
void tst_QLineEdit::cursorForward()
1987
void tst_QLineEdit::cursorBackward()
1988
void tst_QLineEdit::cursorWordForward()
1989
void tst_QLineEdit::cursorWordBackward()
1990
void tst_QLineEdit::home()
1991
void tst_QLineEdit::end()
1994
void tst_QLineEdit::cursorPositionChanged_data()
1996
QTest::addColumn<QTestEventList>("input");
1997
QTest::addColumn<int>("lastPos");
1998
QTest::addColumn<int>("newPos");
2000
QTestEventList keys;
2001
keys.addKeyClick(Qt::Key_A);
2002
QTest::newRow("a") << keys << 0 << 1;
2005
keys.addKeyClick(Qt::Key_A);
2006
keys.addKeyClick(Qt::Key_B);
2007
keys.addKeyClick(Qt::Key_C);
2008
psKeyClick(keys, Qt::Key_Home);
2009
QTest::newRow("abc<home>") << keys << 3 << 0;
2012
keys.addKeyClick(Qt::Key_A);
2013
keys.addKeyClick(Qt::Key_B);
2014
keys.addKeyClick(Qt::Key_C);
2015
keys.addKeyClick(Qt::Key_Left);
2016
QTest::newRow("abc<left>") << keys << 3 << 2;
2019
keys.addKeyClick(Qt::Key_A);
2020
keys.addKeyClick(Qt::Key_B);
2021
keys.addKeyClick(Qt::Key_C);
2022
keys.addKeyClick(Qt::Key_Right);
2023
QTest::newRow("abc<right>") << keys << 2 << 3;
2026
keys.addKeyClick(Qt::Key_A);
2027
keys.addKeyClick(Qt::Key_B);
2028
keys.addKeyClick(Qt::Key_C);
2029
psKeyClick(keys, Qt::Key_Home);
2030
keys.addKeyClick(Qt::Key_Right);
2031
QTest::newRow("abc<home><right>") << keys << 0 << 1;
2034
keys.addKeyClick(Qt::Key_A);
2035
keys.addKeyClick(Qt::Key_B);
2036
keys.addKeyClick(Qt::Key_C);
2037
keys.addKeyClick(Qt::Key_Backspace);
2038
QTest::newRow("abc<backspace>") << keys << 3 << 2;
2041
keys.addKeyClick(Qt::Key_A);
2042
keys.addKeyClick(Qt::Key_B);
2043
keys.addKeyClick(Qt::Key_C);
2044
keys.addKeyClick(Qt::Key_Delete);
2045
QTest::newRow("abc<delete>") << keys << 2 << 3;
2048
keys.addKeyClick(Qt::Key_A);
2049
keys.addKeyClick(Qt::Key_B);
2050
keys.addKeyClick(Qt::Key_C);
2051
keys.addKeyClick(Qt::Key_Left);
2052
keys.addKeyClick(Qt::Key_Delete);
2053
QTest::newRow("abc<left><delete>") << keys << 3 << 2;
2056
keys.addKeyClick(Qt::Key_A);
2057
keys.addKeyClick(Qt::Key_B);
2058
keys.addKeyClick(Qt::Key_C);
2059
psKeyClick(keys, Qt::Key_Home);
2060
psKeyClick(keys, Qt::Key_End);
2061
QTest::newRow("abc<home><end>") << keys << 0 << 3;
2064
keys.addKeyClick(Qt::Key_A);
2065
keys.addKeyClick(Qt::Key_B);
2066
keys.addKeyClick(Qt::Key_C);
2067
keys.addKeyClick(Qt::Key_Space);
2068
keys.addKeyClick(Qt::Key_D);
2069
keys.addKeyClick(Qt::Key_E);
2070
keys.addKeyClick(Qt::Key_F);
2071
keys.addKeyClick(Qt::Key_Home);
2072
keys.addKeyClick(Qt::Key_Right, Qt::ControlModifier);
2073
QTest::newRow("abc efg<home><ctrl-right>") << keys
2082
keys.addKeyClick(Qt::Key_A);
2083
keys.addKeyClick(Qt::Key_B);
2084
keys.addKeyClick(Qt::Key_C);
2085
keys.addKeyClick(Qt::Key_Space);
2086
keys.addKeyClick(Qt::Key_D);
2087
keys.addKeyClick(Qt::Key_E);
2088
keys.addKeyClick(Qt::Key_F);
2089
keys.addKeyClick(Qt::Key_Up);
2090
keys.addKeyClick(Qt::Key_Right, Qt::AltModifier);
2091
QTest::newRow("mac equivalent abc efg<up><option-right>") << keys << 0 << 4;
2095
keys.addKeyClick(Qt::Key_A);
2096
keys.addKeyClick(Qt::Key_B);
2097
keys.addKeyClick(Qt::Key_C);
2098
keys.addKeyClick(Qt::Key_Space);
2099
keys.addKeyClick(Qt::Key_D);
2100
keys.addKeyClick(Qt::Key_E);
2101
keys.addKeyClick(Qt::Key_F);
2102
keys.addKeyClick(Qt::Key_Left, Qt::ControlModifier);
2103
QTest::newRow("abc efg<ctrl-left>") << keys << 7
2111
keys.addKeyClick(Qt::Key_A);
2112
keys.addKeyClick(Qt::Key_B);
2113
keys.addKeyClick(Qt::Key_C);
2114
keys.addKeyClick(Qt::Key_Space);
2115
keys.addKeyClick(Qt::Key_D);
2116
keys.addKeyClick(Qt::Key_E);
2117
keys.addKeyClick(Qt::Key_F);
2118
keys.addKeyClick(Qt::Key_Left, Qt::AltModifier);
2119
QTest::newRow("mac equivalent abc efg<option-left>") << keys << 7 << 4;
2125
void tst_QLineEdit::cursorPositionChanged()
2127
QFETCH(QTestEventList, input);
2128
QFETCH(int, lastPos);
2129
QFETCH(int, newPos);
2133
input.simulate(testWidget);
2134
QCOMPARE(lastCursorPos, lastPos);
2135
QCOMPARE(newCursorPos, newPos);
2138
void tst_QLineEdit::selectedText()
2140
QString testString = "Abc defg hijklmno, p 'qrst' uvw xyz";
2142
// start with a basic text
2143
testWidget->setText(testString);
2144
selection_count = 0;
2146
// The text we have now is:
2148
// 012345678901234567890123456789012345678901234567890
2149
// Abc defg hijklmno, p 'qrst' uvw xyz
2151
testWidget->home(false);
2152
QVERIFY(!testWidget->hasSelectedText());
2153
QCOMPARE(testWidget->selectedText(), QString());
2155
// play a bit with the cursorForward, cursorBackward(), etc
2156
testWidget->cursorForward(true, 9);
2157
QVERIFY(testWidget->hasSelectedText());
2158
QCOMPARE(testWidget->selectedText(), QString("Abc defg "));
2159
QVERIFY(selection_count == 1);
2162
testWidget->home(false);
2163
QVERIFY(!testWidget->hasSelectedText());
2164
QCOMPARE(testWidget->selectedText(), QString());
2165
selection_count = 0;
2168
/* // tested in selectedText
2169
void tst_QLineEdit::backspace()
2170
void tst_QLineEdit::del()
2171
void tst_QLineEdit::selectionChanged()
2172
void tst_QLineEdit::selectAll()
2173
void tst_QLineEdit::deselect()
2176
void tst_QLineEdit::onSelectionChanged()
2181
void tst_QLineEdit::deleteSelectedText()
2183
const QString text = QString::fromLatin1("bar");
2184
QLineEdit edit( text );
2185
QCOMPARE(edit.text(), text);
2189
QTest::keyClick(&edit, Qt::Key_Delete, 0);
2190
QVERIFY(edit.text().isEmpty());
2195
QMenu *menu = edit.createStandardContextMenu();
2196
for (int i = 0; i < menu->actions().count(); ++i) {
2197
QAction *current = menu->actions().at(i);
2198
if (current->text() == QLineEdit::tr("Delete")) {
2199
current->trigger(); //this will delete the whole text selected
2200
QVERIFY(edit.text().isEmpty());
2207
void tst_QLineEdit::textChangedAndTextEdited()
2212
QTest::keyClick(testWidget, Qt::Key_A);
2213
QCOMPARE(changed_count, 1);
2214
QVERIFY(edited_count == changed_count);
2215
QTest::keyClick(testWidget, 'b');
2216
QCOMPARE(changed_count, 2);
2217
QVERIFY(edited_count == changed_count);
2218
QTest::keyClick(testWidget, 'c');
2219
QCOMPARE(changed_count, 3);
2220
QVERIFY(edited_count == changed_count);
2221
QTest::keyClick(testWidget, ' ');
2222
QCOMPARE(changed_count, 4);
2223
QVERIFY(edited_count == changed_count);
2224
QTest::keyClick(testWidget, 'd');
2225
QCOMPARE(changed_count, 5);
2226
QVERIFY(edited_count == changed_count);
2230
changed_string = QString::null;
2232
testWidget->setText("foo");
2233
QCOMPARE(changed_count, 1);
2234
QCOMPARE(edited_count, 0);
2235
QCOMPARE(changed_string, QString("foo"));
2239
changed_string = QString::null;
2241
testWidget->setText("");
2242
QCOMPARE(changed_count, 1);
2243
QCOMPARE(edited_count, 0);
2244
QVERIFY(changed_string.isEmpty());
2245
QVERIFY(!changed_string.isNull());
2248
void tst_QLineEdit::onTextChanged(const QString &text)
2251
changed_string = text;
2254
void tst_QLineEdit::onTextEdited(const QString &/*text*/)
2260
void tst_QLineEdit::onCursorPositionChanged(int oldPos, int newPos)
2262
lastCursorPos = oldPos;
2263
newCursorPos = newPos;
2266
void tst_QLineEdit::returnPressed()
2270
QTest::keyClick(testWidget, Qt::Key_Return);
2271
QVERIFY(return_count == 1);
2274
QTest::keyClick(testWidget, 'A');
2275
QVERIFY(return_count == 0);
2276
QTest::keyClick(testWidget, 'b');
2277
QVERIFY(return_count == 0);
2278
QTest::keyClick(testWidget, 'c');
2279
QVERIFY(return_count == 0);
2280
QTest::keyClick(testWidget, ' ');
2281
QVERIFY(return_count == 0);
2282
QTest::keyClick(testWidget, 'd');
2283
QVERIFY(return_count == 0);
2284
psKeyClick(testWidget, Qt::Key_Home);
2285
QVERIFY(return_count == 0);
2286
psKeyClick(testWidget, Qt::Key_End);
2287
QVERIFY(return_count == 0);
2288
QTest::keyClick(testWidget, Qt::Key_Escape);
2289
QVERIFY(return_count == 0);
2290
QTest::keyClick(testWidget, Qt::Key_Return);
2291
QVERIFY(return_count == 1);
2294
// int validator that fixes all !isNumber to '0'
2295
class QIntFixValidator : public QIntValidator {
2297
QIntFixValidator(int min, int max, QObject *parent) : QIntValidator(min, max, parent) {}
2298
void fixup (QString &input) const {
2299
for (int i=0; i<input.length(); ++i)
2300
if (!input.at(i).isNumber()) {
2301
input[(int)i] = QChar('0');
2306
void tst_QLineEdit::returnPressed_maskvalidator_data() {
2307
QTest::addColumn<QString>("inputMask");
2308
QTest::addColumn<bool>("hasValidator");
2309
QTest::addColumn<QTestEventList>("input");
2310
QTest::addColumn<QString>("expectedText");
2311
QTest::addColumn<bool>("returnPressed");
2314
QTestEventList keys;
2315
keys.addKeyClick(Qt::Key_Home);
2316
keys.addKeyClick(Qt::Key_1);
2317
keys.addKeyClick(Qt::Key_2);
2318
keys.addKeyClick(Qt::Key_3);
2319
keys.addKeyClick(Qt::Key_Return);
2320
QTest::newRow("no mask, no validator, input '123<cr>'")
2328
QTestEventList keys;
2329
keys.addKeyClick(Qt::Key_Home);
2330
keys.addKeyClick(Qt::Key_1);
2331
keys.addKeyClick(Qt::Key_2);
2332
keys.addKeyClick(Qt::Key_Return);
2333
QTest::newRow("mask '999', no validator, input '12<cr>'")
2341
QTestEventList keys;
2342
keys.addKeyClick(Qt::Key_Home);
2343
keys.addKeyClick(Qt::Key_1);
2344
keys.addKeyClick(Qt::Key_2);
2345
keys.addKeyClick(Qt::Key_3);
2346
keys.addKeyClick(Qt::Key_Return);
2347
QTest::newRow("mask '999', no validator, input '123<cr>'")
2355
QTestEventList keys;
2356
keys.addKeyClick(Qt::Key_Home);
2357
keys.addKeyClick(Qt::Key_1);
2358
keys.addKeyClick(Qt::Key_2);
2359
keys.addKeyClick(Qt::Key_3);
2360
keys.addKeyClick(Qt::Key_Return);
2361
QTest::newRow("no mask, intfix validator(0,999), input '123<cr>'")
2369
QTestEventList keys;
2370
keys.addKeyClick(Qt::Key_Home);
2371
keys.addKeyClick(Qt::Key_7);
2372
keys.addKeyClick(Qt::Key_7);
2373
keys.addKeyClick(Qt::Key_7);
2374
keys.addKeyClick(Qt::Key_7);
2375
keys.addKeyClick(Qt::Key_Return);
2376
QTest::newRow("no mask, intfix validator(0,999), input '7777<cr>'")
2384
QTestEventList keys;
2385
keys.addKeyClick(Qt::Key_Home);
2386
keys.addKeyClick(Qt::Key_1);
2387
keys.addKeyClick(Qt::Key_2);
2388
keys.addKeyClick(Qt::Key_Return);
2389
QTest::newRow("mask '999', intfix validator(0,999), input '12<cr>'")
2397
QTestEventList keys;
2398
keys.addKeyClick(Qt::Key_Home);
2399
keys.addKeyClick(Qt::Key_Return);
2400
QTest::newRow("mask '999', intfix validator(0,999), input '<cr>'")
2409
void tst_QLineEdit::returnPressed_maskvalidator()
2411
QFETCH(QString, inputMask);
2412
QFETCH(bool, hasValidator);
2413
QFETCH(QTestEventList, input);
2414
QFETCH(QString, expectedText);
2415
QFETCH(bool, returnPressed);
2417
QEXPECT_FAIL("mask '999', intfix validator(0,999), input '12<cr>'", "QIntValidator has changed behaviour. Does not accept spaces. Task 43082.", Abort);
2419
testWidget->setInputMask(inputMask);
2421
testWidget->setValidator(new QIntFixValidator(0, 999, testWidget));
2424
input.simulate(testWidget);
2426
QCOMPARE(testWidget->text(), expectedText);
2427
QCOMPARE(return_count , returnPressed ? 1 : 0);
2430
void tst_QLineEdit::onReturnPressed()
2435
void tst_QLineEdit::setValidator()
2437
// Verify that we can set and re-set a validator.
2438
QVERIFY(!testWidget->validator());
2440
QIntValidator iv1(0);
2441
testWidget->setValidator(&iv1);
2442
QCOMPARE(testWidget->validator(), static_cast<const QValidator*>(&iv1));
2444
testWidget->setValidator(0);
2445
QVERIFY(testWidget->validator() == 0);
2447
QIntValidator iv2(0, 99, 0);
2448
testWidget->setValidator(&iv2);
2449
QCOMPARE(testWidget->validator(), static_cast<const QValidator *>(&iv2));
2451
testWidget->setValidator(0);
2452
QVERIFY(testWidget->validator() == 0);
2455
void tst_QLineEdit::setValidator_QIntValidator_data()
2457
QTest::addColumn<int>("mini");
2458
QTest::addColumn<int>("maxi");
2459
QTest::addColumn<QString>("input");
2460
QTest::addColumn<QString>("expectedText");
2461
QTest::addColumn<bool>("useKeys");
2462
QTest::addColumn<bool>("is_valid");
2464
for (int i=0; i<2; i++) {
2465
bool useKeys = false;
2466
QString inputMode = "insert ";
2468
inputMode = "useKeys ";
2473
QTest::newRow(QString(inputMode + "range [0,9] valid '1'").toLatin1())
2481
QTest::newRow(QString(inputMode + "range [3,7] valid '3'").toLatin1())
2489
QTest::newRow(QString(inputMode + "range [3,7] valid '7'").toLatin1())
2497
QTest::newRow(QString(inputMode + "range [0,100] valid '9'").toLatin1())
2505
QTest::newRow(QString(inputMode + "range [0,100] valid '12'").toLatin1())
2513
QTest::newRow(QString(inputMode + "range [-100,100] valid '-12'").toLatin1())
2522
// characters not allowed in QIntValidator
2523
QTest::newRow(QString(inputMode + "range [0,9] inv 'a-a'").toLatin1())
2531
QTest::newRow(QString(inputMode + "range [0,9] inv 'A'").toLatin1())
2538
// minus sign only allowed with a range on the negative side
2539
QTest::newRow(QString(inputMode + "range [0,100] inv '-'").toLatin1())
2546
QTest::newRow(QString(inputMode + "range [0,100] int '153'").toLatin1())
2550
<< QString(useKeys ? "15" : "")
2552
<< bool(useKeys ? true : false);
2553
QTest::newRow(QString(inputMode + "range [-100,100] int '-153'").toLatin1())
2557
<< QString(useKeys ? "-15" : "")
2559
<< bool(useKeys ? true : false);
2560
QTest::newRow(QString(inputMode + "range [3,7] int '2'").toLatin1())
2568
QTest::newRow(QString(inputMode + "range [3,7] int '8'").toLatin1())
2578
void tst_QLineEdit::setValidator_QIntValidator()
2582
QFETCH(QString, input);
2583
QFETCH(QString, expectedText);
2584
QFETCH(bool, useKeys);
2585
QFETCH(bool, is_valid);
2587
QIntValidator intValidator(mini, maxi, 0);
2588
testWidget->setValidator(&intValidator);
2589
QVERIFY(testWidget->text().isEmpty());
2590
//qDebug("1 input: '" + input + "' Exp: '" + expectedText + "'");
2592
// tests valid input
2594
testWidget->insert(input);
2596
QTest::keyClicks(testWidget, input);
2598
QTest::keyClick(testWidget, Qt::Key_Return);
2599
QCOMPARE(return_count, int(is_valid)); // assuming that is_valid = true equals 1
2601
//qDebug("2 input: '" + input + "' Exp: '" + expectedText + "'");
2602
// QCOMPARE(testWidget->displayText(), expectedText);
2603
QCOMPARE(testWidget->text(), expectedText);
2606
#define NO_PIXMAP_TESTS
2608
void tst_QLineEdit::frame_data()
2610
#ifndef NO_PIXMAP_TESTS
2611
#if defined Q_OS_WIN
2612
QTest::addColumn<QPixmap>("noFrame");
2613
QTest::addColumn<QPixmap>("useFrame");
2615
QTest::newRow("win");
2617
// QTest::newRow("x11");
2622
void tst_QLineEdit::frame()
2624
testWidget->setFrame(false);
2625
// verify that the editor is shown without a frame
2626
#ifndef NO_PIXMAP_TESTS
2627
#if defined Q_OS_WIN
2628
QTEST(testWidget, "noFrame");
2631
QVERIFY(!testWidget->hasFrame());
2633
testWidget->setFrame(true);
2634
// verify that the editor is shown with a frame
2635
#ifndef NO_PIXMAP_TESTS
2636
#if defined Q_OS_WIN
2637
QTEST(testWidget, "useFrame");
2640
QVERIFY(testWidget->hasFrame());
2643
void tst_QLineEdit::setAlignment_data()
2645
#ifndef NO_PIXMAP_TESTS
2646
#if defined Q_OS_WIN
2647
QTest::addColumn<QPixmap>("left");
2648
QTest::addColumn<QPixmap>("right");
2649
QTest::addColumn<QPixmap>("hcenter");
2650
QTest::addColumn<QPixmap>("auto");
2652
QTest::newRow("win");
2654
// QTest::newRow("x11");
2659
void tst_QLineEdit::setAlignment()
2661
testWidget->setText("left");
2662
testWidget->setAlignment(Qt::AlignLeft);
2663
#ifndef NO_PIXMAP_TESTS
2664
#if defined Q_OS_WIN
2665
QTEST(testWidget, "left");
2668
QVERIFY(testWidget->alignment() == Qt::AlignLeft);
2670
testWidget->setText("hcenter");
2671
testWidget->setAlignment(Qt::AlignHCenter);
2672
#ifndef NO_PIXMAP_TESTS
2673
#if defined Q_OS_WIN
2674
QTEST(testWidget, "hcenter");
2677
QVERIFY(testWidget->alignment() == Qt::AlignHCenter);
2679
testWidget->setText("right");
2680
testWidget->setAlignment(Qt::AlignRight);
2681
#ifndef NO_PIXMAP_TESTS
2682
#if defined Q_OS_WIN
2683
QTEST(testWidget, "right");
2686
QVERIFY(testWidget->alignment() == Qt::AlignRight);
2688
testWidget->setAlignment(Qt::AlignTop);
2689
QVERIFY(testWidget->alignment() == Qt::AlignTop);
2691
testWidget->setAlignment(Qt::AlignBottom);
2692
QVERIFY(testWidget->alignment() == Qt::AlignBottom);
2694
testWidget->setAlignment(Qt::AlignCenter);
2695
QVERIFY(testWidget->alignment() == Qt::AlignCenter);
2698
void tst_QLineEdit::isModified()
2700
QVERIFY(!testWidget->isModified());
2701
testWidget->setText("bla");
2702
QVERIFY(!testWidget->isModified());
2704
psKeyClick(testWidget, Qt::Key_Home);
2705
QVERIFY(!testWidget->isModified());
2706
QTest::keyClick(testWidget, Qt::Key_Right);
2707
QVERIFY(!testWidget->isModified());
2708
QTest::keyClick(testWidget, Qt::Key_Right);
2709
QVERIFY(!testWidget->isModified());
2710
QTest::keyClick(testWidget, Qt::Key_Right);
2711
QVERIFY(!testWidget->isModified());
2712
QTest::keyClick(testWidget, Qt::Key_Left);
2713
QVERIFY(!testWidget->isModified());
2714
psKeyClick(testWidget, Qt::Key_End);
2715
QVERIFY(!testWidget->isModified());
2717
QTest::keyClicks(testWidget, "T");
2718
QVERIFY(testWidget->isModified());
2719
QTest::keyClicks(testWidget, "his is a string");
2720
QVERIFY(testWidget->isModified());
2722
testWidget->setText("");
2723
QVERIFY(!testWidget->isModified());
2724
testWidget->setText("foo");
2725
QVERIFY(!testWidget->isModified());
2729
Obsolete function but as long as we provide it, it needs to work.
2732
void tst_QLineEdit::edited()
2734
QVERIFY(!testWidget->isModified());
2735
testWidget->setText("bla");
2736
QVERIFY(!testWidget->isModified());
2738
psKeyClick(testWidget, Qt::Key_Home);
2739
QVERIFY(!testWidget->isModified());
2740
QTest::keyClick(testWidget, Qt::Key_Right);
2741
QVERIFY(!testWidget->isModified());
2742
QTest::keyClick(testWidget, Qt::Key_Right);
2743
QVERIFY(!testWidget->isModified());
2744
QTest::keyClick(testWidget, Qt::Key_Right);
2745
QVERIFY(!testWidget->isModified());
2746
QTest::keyClick(testWidget, Qt::Key_Left);
2747
QVERIFY(!testWidget->isModified());
2748
psKeyClick(testWidget, Qt::Key_End);
2749
QVERIFY(!testWidget->isModified());
2751
QTest::keyClicks(testWidget, "T");
2752
QVERIFY(testWidget->isModified());
2753
QTest::keyClicks(testWidget, "his is a string");
2754
QVERIFY(testWidget->isModified());
2756
testWidget->setModified(false);
2757
QVERIFY(!testWidget->isModified());
2759
testWidget->setModified(true);
2760
QVERIFY(testWidget->isModified());
2763
void tst_QLineEdit::insert()
2765
testWidget->insert("This");
2766
testWidget->insert(" is");
2767
testWidget->insert(" a");
2768
testWidget->insert(" test");
2770
QCOMPARE(testWidget->text(), QString("This is a test"));
2772
testWidget->cursorWordBackward(false);
2773
testWidget->cursorBackward(false, 1);
2774
testWidget->insert(" nice");
2775
QCOMPARE(testWidget->text(), QString("This is a nice test"));
2777
testWidget->setCursorPosition(-1);
2778
testWidget->insert("No Crash! ");
2779
QCOMPARE(testWidget->text(), QString("No Crash! This is a nice test"));
2782
void tst_QLineEdit::setSelection_data()
2784
QTest::addColumn<QString>("text");
2785
QTest::addColumn<int>("start");
2786
QTest::addColumn<int>("length");
2787
QTest::addColumn<int>("expectedCursor");
2788
QTest::addColumn<QString>("expectedText");
2789
QTest::addColumn<bool>("expectedHasSelectedText");
2791
QString text = "Abc defg hijklmno, p 'qrst' uvw xyz";
2792
int start, length, pos;
2794
start = 0; length = 1; pos = 1;
2795
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2796
<< text << start << length << pos << QString("A") << true;
2798
start = 0; length = 2; pos = 2;
2799
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2800
<< text << start << length << pos << QString("Ab") << true;
2802
start = 0; length = 4; pos = 4;
2803
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2804
<< text << start << length << pos << QString("Abc ") << true;
2806
start = -1; length = 0; pos = text.length();
2807
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2808
<< text << start << length << pos << QString() << false;
2810
start = 34; length = 1; pos = 35;
2811
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2812
<< text << start << length << pos << QString("z") << true;
2814
start = 34; length = 2; pos = 35;
2815
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2816
<< text << start << length << pos << QString("z") << true;
2818
start = 34; length = -1; pos = 33;
2819
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2820
<< text << start << length << pos << QString("y") << true;
2822
start = 1; length = -2; pos = 0;
2823
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2824
<< text << start << length << pos << QString("A") << true;
2826
start = -1; length = -1; pos = text.length();
2827
QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
2828
<< text << start << length << pos << QString() << false;
2832
void tst_QLineEdit::setSelection()
2834
QFETCH(QString, text);
2836
QFETCH(int, length);
2837
QFETCH(int, expectedCursor);
2838
QFETCH(QString, expectedText);
2839
QFETCH(bool, expectedHasSelectedText);
2841
testWidget->setText(text);
2842
testWidget->setSelection(start, length);
2843
QCOMPARE(testWidget->hasSelectedText(), expectedHasSelectedText);
2844
QCOMPARE(testWidget->selectedText(), expectedText);
2845
if (expectedCursor >= 0)
2846
QCOMPARE(testWidget->cursorPosition(), expectedCursor);
2849
#ifndef QT_NO_CLIPBOARD
2850
void tst_QLineEdit::cut()
2852
if (!PlatformClipboard::isAvailable())
2853
QSKIP("Autotests run from cron and pasteboard don't get along quite ATM");
2855
// test newlines in cut'n'paste
2856
testWidget->setText("A\nB\nC\n");
2857
testWidget->setSelection(0, 6);
2859
psKeyClick(testWidget, Qt::Key_Home);
2860
testWidget->paste();
2861
QCOMPARE(testWidget->text(), QString("A\nB\nC\n"));
2863
// 01234567890123456789012345678901234567890
2864
testWidget->setText("Abc defg hijklmno");
2866
testWidget->setSelection(0, 3);
2868
QCOMPARE(testWidget->text(), QString(" defg hijklmno"));
2870
psKeyClick(testWidget, Qt::Key_End);
2871
testWidget->paste();
2872
QCOMPARE(testWidget->text(), QString(" defg hijklmnoAbc"));
2874
psKeyClick(testWidget, Qt::Key_Home);
2876
QCOMPARE(testWidget->text(), QString("defg hijklmnoAbc"));
2878
testWidget->setSelection(0, 4);
2880
psKeyClick(testWidget, Qt::Key_End);
2881
testWidget->paste();
2882
QCOMPARE(testWidget->text(), QString("defg hijklmnoAbcdefg"));
2884
QTest::keyClick(testWidget, Qt::Key_Left);
2885
QTest::keyClick(testWidget, Qt::Key_Left);
2886
QTest::keyClick(testWidget, Qt::Key_Left);
2887
QTest::keyClick(testWidget, Qt::Key_Left);
2888
QTest::keyClick(testWidget, Qt::Key_Left);
2889
QTest::keyClick(testWidget, Qt::Key_Left);
2890
QTest::keyClick(testWidget, Qt::Key_Left);
2891
QTest::keyClick(testWidget, ' ');
2892
QCOMPARE(testWidget->text(), QString("defg hijklmno Abcdefg"));
2894
testWidget->setSelection(0, 5);
2896
QCOMPARE(testWidget->text(), QString("hijklmno Abcdefg"));
2898
testWidget->end(false);
2899
QTest::keyClick(testWidget, ' ');
2900
testWidget->paste();
2901
QCOMPARE(testWidget->text(), QString("hijklmno Abcdefg defg"));
2903
testWidget->home(false);
2904
testWidget->cursorWordForward(true);
2906
testWidget->end(false);
2907
QTest::keyClick(testWidget, ' ');
2908
testWidget->paste();
2909
testWidget->cursorBackward(true, 1);
2911
QCOMPARE(testWidget->text(), QString("Abcdefg defg hijklmno"));
2915
class InputMaskValidator : public QValidator
2918
InputMaskValidator(QObject *parent, const char *name = 0) : QValidator(parent) { setObjectName(name); }
2919
State validate(QString &text, int &pos) const
2921
InputMaskValidator *that = (InputMaskValidator *)this;
2922
that->validateText = text;
2923
that->validatePos = pos;
2926
QString validateText;
2930
void tst_QLineEdit::inputMaskAndValidator_data()
2932
QTest::addColumn<QString>("inputMask");
2933
QTest::addColumn<QTestEventList>("keys");
2934
QTest::addColumn<QString>("validateText");
2935
QTest::addColumn<int>("validatePos");
2937
QTestEventList inputKeys;
2938
inputKeys.addKeyClick(Qt::Key_1);
2939
inputKeys.addKeyClick(Qt::Key_2);
2941
QTest::newRow("task28291") << "000;_" << inputKeys << "12_" << 2;
2944
void tst_QLineEdit::inputMaskAndValidator()
2946
QFETCH(QString, inputMask);
2947
QFETCH(QTestEventList, keys);
2948
QFETCH(QString, validateText);
2949
QFETCH(int, validatePos);
2951
InputMaskValidator imv(testWidget);
2952
testWidget->setValidator(&imv);
2954
testWidget->setInputMask(inputMask);
2955
keys.simulate(testWidget);
2957
QCOMPARE(imv.validateText, validateText);
2958
QCOMPARE(imv.validatePos, validatePos);
2961
void tst_QLineEdit::maxLengthAndInputMask()
2963
// Really a test for #30447
2964
QVERIFY(testWidget->inputMask().isNull());
2965
testWidget->setMaxLength(10);
2966
QVERIFY(testWidget->maxLength() == 10);
2967
testWidget->setInputMask(QString::null);
2968
QVERIFY(testWidget->inputMask().isNull());
2969
QVERIFY(testWidget->maxLength() == 10);
2973
class LineEdit : public QLineEdit
2976
LineEdit() { state = Other; }
2978
void keyPressEvent(QKeyEvent *e)
2980
QLineEdit::keyPressEvent(e);
2981
if (e->key() == Qt::Key_Enter) {
2982
state = e->isAccepted() ? Accepted : Ignored;
2996
friend class tst_QLineEdit;
2999
Q_DECLARE_METATYPE(LineEdit::State);
3000
void tst_QLineEdit::returnPressedKeyEvent()
3004
QCOMPARE((int)lineedit.state, (int)LineEdit::Other);
3005
QTest::keyClick(&lineedit, Qt::Key_Enter);
3006
QCOMPARE((int)lineedit.state, (int)LineEdit::Ignored);
3007
connect(&lineedit, SIGNAL(returnPressed()), this, SLOT(onReturnPressed()));
3008
QTest::keyClick(&lineedit, Qt::Key_Enter);
3009
QCOMPARE((int)lineedit.state, (int)LineEdit::Ignored);
3010
disconnect(&lineedit, SIGNAL(returnPressed()), this, SLOT(onReturnPressed()));
3011
QTest::keyClick(&lineedit, Qt::Key_Enter);
3012
QCOMPARE((int)lineedit.state, (int)LineEdit::Ignored);
3013
QTest::keyClick(&lineedit, Qt::Key_1);
3014
QCOMPARE((int)lineedit.state, (int)LineEdit::Other);
3017
void tst_QLineEdit::keepSelectionOnTabFocusIn()
3019
testWidget->setText("hello world");
3021
QFocusEvent e(QEvent::FocusIn, Qt::TabFocusReason);
3022
QApplication::sendEvent(testWidget, &e);
3024
QCOMPARE(testWidget->selectedText(), QString("hello world"));
3025
testWidget->setSelection(0, 5);
3026
QCOMPARE(testWidget->selectedText(), QString("hello"));
3028
QFocusEvent e(QEvent::FocusIn, Qt::TabFocusReason);
3029
QApplication::sendEvent(testWidget, &e);
3031
QCOMPARE(testWidget->selectedText(), QString("hello"));
3034
void tst_QLineEdit::readOnlyStyleOption()
3036
bool wasReadOnly = testWidget->isReadOnly();
3037
QStyle *oldStyle = testWidget->style();
3039
StyleOptionTestStyle myStyle;
3040
testWidget->setStyle(&myStyle);
3042
myStyle.setReadOnly(true);
3043
testWidget->setReadOnly(true);
3044
testWidget->repaint();
3045
qApp->processEvents();
3047
testWidget->setReadOnly(false);
3048
myStyle.setReadOnly(false);
3049
testWidget->repaint();
3050
qApp->processEvents();
3052
testWidget->setReadOnly(wasReadOnly);
3053
testWidget->setStyle(oldStyle);
3056
void tst_QLineEdit::validateOnFocusOut()
3058
QSignalSpy editingFinishedSpy(testWidget, SIGNAL(editingFinished()));
3059
testWidget->setValidator(new QIntValidator(100, 999, 0));
3060
QTest::keyPress(testWidget, '1');
3061
QTest::keyPress(testWidget, '0');
3062
QCOMPARE(testWidget->text(), QString("10"));
3063
testWidget->clearFocus();
3064
QCOMPARE(editingFinishedSpy.count(), 0);
3066
testWidget->setFocus();
3067
testWidget->activateWindow();
3068
QTRY_VERIFY(testWidget->hasFocus());
3070
QTest::keyPress(testWidget, '0');
3071
QTRY_COMPARE(testWidget->text(), QString("100"));
3073
testWidget->clearFocus();
3074
QCOMPARE(editingFinishedSpy.count(), 1);
3077
void tst_QLineEdit::editInvalidText()
3079
testWidget->clear();
3080
testWidget->setValidator(new QIntValidator(0, 120, 0));
3081
testWidget->setText("1234");
3083
QVERIFY(!testWidget->hasAcceptableInput());
3084
QTest::keyPress(testWidget, Qt::Key_Backspace);
3085
QTest::keyPress(testWidget, Qt::Key_Backspace);
3086
QTest::keyPress(testWidget, Qt::Key_A);
3087
QTest::keyPress(testWidget, Qt::Key_B);
3088
QTest::keyPress(testWidget, Qt::Key_C);
3089
QTest::keyPress(testWidget, Qt::Key_1);
3090
QVERIFY(testWidget->hasAcceptableInput());
3091
QCOMPARE(testWidget->text(), QString("12"));
3092
testWidget->cursorBackward(false);
3093
testWidget->cursorBackward(true, 2);
3094
QTest::keyPress(testWidget, Qt::Key_Delete);
3095
QVERIFY(testWidget->hasAcceptableInput());
3096
QCOMPARE(testWidget->text(), QString("2"));
3097
QTest::keyPress(testWidget, Qt::Key_1);
3098
QVERIFY(testWidget->hasAcceptableInput());
3099
QCOMPARE(testWidget->text(), QString("12"));
3101
testWidget->setValidator(0);
3104
void tst_QLineEdit::charWithAltOrCtrlModifier()
3106
testWidget->clear();
3107
QCOMPARE(testWidget->text(), QString(""));
3108
QTest::keyPress(testWidget, Qt::Key_Plus);
3109
QCOMPARE(testWidget->text(), QString("+"));
3110
QTest::keyPress(testWidget, Qt::Key_Plus, Qt::ControlModifier);
3111
QCOMPARE(testWidget->text(), QString("++"));
3112
QTest::keyPress(testWidget, Qt::Key_Plus, Qt::AltModifier);
3113
QCOMPARE(testWidget->text(), QString("+++"));
3114
QTest::keyPress(testWidget, Qt::Key_Plus, Qt::AltModifier | Qt::ControlModifier);
3115
QCOMPARE(testWidget->text(), QString("++++"));
3118
void tst_QLineEdit::leftKeyOnSelectedText()
3120
testWidget->clear();
3121
testWidget->setText("0123");
3122
testWidget->setCursorPosition(4);
3123
QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
3124
QCOMPARE(testWidget->cursorPosition(), 3);
3125
QCOMPARE(testWidget->selectedText(), QString("3"));
3126
QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
3127
QCOMPARE(testWidget->cursorPosition(), 2);
3128
QCOMPARE(testWidget->selectedText(), QString("23"));
3129
QTest::keyClick(testWidget, Qt::Key_Left);
3131
QCOMPARE(testWidget->cursorPosition(), 1);
3133
// Selection is cleared ands cursor remains at position 2.
3134
// X11 used to behave like window prior to 4.2. Changes caused by QKeySequence
3135
// resulted in an inadvertant change in behavior
3136
QCOMPARE(testWidget->cursorPosition(), 2);
3140
void tst_QLineEdit::inlineCompletion()
3142
testWidget->clear();
3143
QStandardItemModel *model = new QStandardItemModel;
3144
QStandardItem *root = model->invisibleRootItem();
3145
QStandardItem *items[5];
3146
for (int i = 0; i < 5; i++) {
3147
items[i] = new QStandardItem(QString("item%1").arg(i));
3148
if ((i+2)%2 == 0) { // disable 0,2,4
3149
items[i]->setFlags(items[i]->flags() & ~Qt::ItemIsEnabled);
3151
root->appendRow(items[i]);
3153
QCompleter *completer = new QCompleter(model);
3154
completer->setCompletionMode(QCompleter::InlineCompletion);
3155
completer->setCaseSensitivity(Qt::CaseInsensitive);
3156
testWidget->setFocus();
3157
QTRY_COMPARE(qApp->activeWindow(), (QWidget*)testWidget);
3158
testWidget->setCompleter(completer);
3161
QTest::keyClick(testWidget, Qt::Key_X);
3162
QCOMPARE(testWidget->selectedText(), QString());
3163
QCOMPARE(testWidget->text(), QString("x"));
3164
QTest::keyClick(testWidget, Qt::Key_Down, Qt::ControlModifier);
3165
QCOMPARE(testWidget->selectedText(), QString());
3166
QCOMPARE(testWidget->text(), QString("x"));
3167
QTest::keyClick(testWidget, Qt::Key_Up, Qt::ControlModifier);
3168
QCOMPARE(testWidget->selectedText(), QString());
3169
QCOMPARE(testWidget->text(), QString("x"));
3171
testWidget->clear();
3172
QTest::keyClick(testWidget, Qt::Key_I);
3173
QCOMPARE(testWidget->selectedText(), QString("tem1"));
3175
Qt::KeyboardModifiers keyboardModifiers = Qt::ControlModifier;
3177
keyboardModifiers |= Qt::AltModifier;
3179
QTest::keyClick(testWidget, Qt::Key_Down, keyboardModifiers);
3180
QCOMPARE(testWidget->selectedText(), QString("tem3"));
3182
// wraps around (Default)
3183
QTest::keyClick(testWidget, Qt::Key_Down, keyboardModifiers);
3184
QCOMPARE(testWidget->selectedText(), QString("tem1"));
3186
QTest::keyClick(testWidget, Qt::Key_Up, keyboardModifiers);
3187
QCOMPARE(testWidget->selectedText(), QString("tem3"));
3190
completer->setWrapAround(false);
3191
QTest::keyClick(testWidget, Qt::Key_Down, keyboardModifiers);
3192
QCOMPARE(testWidget->selectedText(), QString("tem3"));
3193
QTest::keyClick(testWidget, Qt::Key_Up, keyboardModifiers); // item1
3194
QTest::keyClick(testWidget, Qt::Key_Up, keyboardModifiers); // item1
3195
QCOMPARE(testWidget->selectedText(), QString("tem1"));
3198
root->appendRow(new QStandardItem("item11"));
3199
root->appendRow(new QStandardItem("item12"));
3200
testWidget->clear();
3201
QTest::keyClick(testWidget, Qt::Key_I);
3202
QCOMPARE(testWidget->selectedText(), QString("tem1"));
3203
QTest::keyClick(testWidget, Qt::Key_Delete);
3204
QCOMPARE(testWidget->selectedText(), QString());
3205
QTest::keyClick(testWidget, Qt::Key_Down, keyboardModifiers);
3206
QCOMPARE(testWidget->selectedText(), QString("tem1")); // neato
3207
testWidget->setText("item1");
3208
testWidget->setSelection(1, 2);
3209
QTest::keyClick(testWidget, Qt::Key_Down, keyboardModifiers);
3210
testWidget->end(false);
3211
QCOMPARE(testWidget->text(), QString("item1")); // no effect for selection in "middle"
3212
QTest::keyClick(testWidget, Qt::Key_Down, keyboardModifiers); // item1
3213
QTest::keyClick(testWidget, Qt::Key_Down, keyboardModifiers); // item11
3214
QCOMPARE(testWidget->text(), QString("item11"));
3220
void tst_QLineEdit::noTextEditedOnClear()
3222
testWidget->setText("Test");
3223
QSignalSpy textEditedSpy(testWidget, SIGNAL(textEdited(QString)));
3224
testWidget->clear();
3225
QCOMPARE(textEditedSpy.count(), 0);
3228
void tst_QLineEdit::textMargin_data()
3230
QTest::addColumn<int>("left");
3231
QTest::addColumn<int>("top");
3232
QTest::addColumn<int>("right");
3233
QTest::addColumn<int>("bottom");
3235
QTest::addColumn<QPoint>("mousePressPos");
3236
QTest::addColumn<int>("cursorPosition");
3238
QLineEdit testWidget;
3239
QFontMetrics metrics(testWidget.font());
3240
const QString s = QLatin1String("MMM MMM MMM");
3242
// Different styles generate different offsets, so
3243
// calculate the width rather than hardcode it.
3244
const int pixelWidthOfM = metrics.width(s, 1);
3245
const int pixelWidthOfMMM_MM = metrics.width(s, 6);
3247
QTest::newRow("default-0") << 0 << 0 << 0 << 0 << QPoint(pixelWidthOfMMM_MM, 0) << 6;
3248
QTest::newRow("default-1") << 0 << 0 << 0 << 0 << QPoint(1, 1) << 0;
3249
QTest::newRow("default-2") << -1 << 0 << -1 << 0 << QPoint(pixelWidthOfMMM_MM, 0) << 6;
3250
QTest::newRow("default-3") << 0 << 0 << 0 << 0 << QPoint(pixelWidthOfM, 1) << 1;
3252
QTest::newRow("hor-0") << 10 << 0 << 10 << 0 << QPoint(1, 1) << 0;
3253
QTest::newRow("hor-1") << 10 << 0 << 10 << 0 << QPoint(10, 1) << 0;
3254
QTest::newRow("hor-2") << 20 << 0 << 10 << 0 << QPoint(20, 1) << 0;
3256
if (!qApp->style()->inherits("QMacStyle")) { //MacStyle doesn't support verticals margins.
3257
QTest::newRow("default-2-ver") << -1 << -1 << -1 << -1 << QPoint(pixelWidthOfMMM_MM, 0) << 6;
3258
QTest::newRow("ver") << 0 << 10 << 0 << 10 << QPoint(1, 1) << 0;
3262
void tst_QLineEdit::textMargin()
3267
QFETCH(int, bottom);
3268
QFETCH(QPoint, mousePressPos);
3269
QFETCH(int, cursorPosition);
3271
// Put the line edit into a toplevel window to avoid
3272
// resizing by the window system.
3274
QLineEdit testWidget(&tlw);
3275
testWidget.setGeometry(100, 100, 100, 30);
3276
testWidget.setText("MMM MMM MMM");
3277
testWidget.setCursorPosition(6);
3279
QSize sizeHint = testWidget.sizeHint();
3280
testWidget.setTextMargins(left, top, right, bottom);
3281
sizeHint.setWidth(sizeHint.width() + left + right);
3282
sizeHint.setHeight(sizeHint.height() + top +bottom);
3283
QCOMPARE(testWidget.sizeHint(), sizeHint);
3284
testWidget.setFrame(false);
3291
testWidget.getTextMargins(&l, &t, &r, &b);
3295
QCOMPARE(bottom, b);
3297
QTest::mouseClick(&testWidget, Qt::LeftButton, 0, mousePressPos);
3298
QTRY_COMPARE(testWidget.cursorPosition(), cursorPosition);
3301
#ifndef QTEST_NO_CURSOR
3302
void tst_QLineEdit::cursor()
3304
testWidget->setReadOnly(false);
3305
QCOMPARE(testWidget->cursor().shape(), Qt::IBeamCursor);
3306
testWidget->setReadOnly(true);
3307
QCOMPARE(testWidget->cursor().shape(), Qt::ArrowCursor);
3308
testWidget->setReadOnly(false);
3309
QCOMPARE(testWidget->cursor().shape(), Qt::IBeamCursor);
3313
class task180999_Widget : public QWidget
3316
task180999_Widget(QWidget *parent = 0) : QWidget(parent)
3318
QHBoxLayout *layout = new QHBoxLayout(this);
3319
lineEdit1.setText("some text 1 ...");
3320
lineEdit2.setText("some text 2 ...");
3321
layout->addWidget(&lineEdit1);
3322
layout->addWidget(&lineEdit2);
3325
QLineEdit lineEdit1;
3326
QLineEdit lineEdit2;
3329
void tst_QLineEdit::task180999_focus()
3331
task180999_Widget widget;
3333
widget.lineEdit1.setFocus();
3336
widget.lineEdit2.setFocus();
3337
widget.lineEdit2.selectAll();
3340
widget.lineEdit1.setFocus();
3343
widget.activateWindow();
3345
QTRY_VERIFY(!widget.lineEdit2.hasSelectedText());
3348
void tst_QLineEdit::task174640_editingFinished()
3351
QVBoxLayout *layout = new QVBoxLayout(&mw);
3352
QLineEdit *le1 = new QLineEdit(&mw);
3353
QLineEdit *le2 = new QLineEdit(&mw);
3354
layout->addWidget(le1);
3355
layout->addWidget(le2);
3358
QApplication::setActiveWindow(&mw);
3359
mw.activateWindow();
3360
QVERIFY(QTest::qWaitForWindowActive(&mw));
3361
QCOMPARE(&mw, QApplication::activeWindow());
3363
QSignalSpy editingFinishedSpy(le1, SIGNAL(editingFinished()));
3367
QTRY_VERIFY(le1->hasFocus());
3368
QCOMPARE(editingFinishedSpy.count(), 0);
3372
QTRY_VERIFY(le2->hasFocus());
3373
QCOMPARE(editingFinishedSpy.count(), 1);
3374
editingFinishedSpy.clear();
3378
QTRY_VERIFY(le1->hasFocus());
3380
QMenu *testMenu1 = new QMenu(le1);
3381
testMenu1->addAction("foo");
3382
testMenu1->addAction("bar");
3384
QVERIFY(QTest::qWaitForWindowExposed(testMenu1));
3386
mw.activateWindow();
3389
QCOMPARE(editingFinishedSpy.count(), 0);
3390
QTRY_VERIFY(le1->hasFocus());
3392
QMenu *testMenu2 = new QMenu(le2);
3393
testMenu2->addAction("foo2");
3394
testMenu2->addAction("bar2");
3396
QVERIFY(QTest::qWaitForWindowExposed(testMenu2));
3398
mw.activateWindow();
3400
QCOMPARE(editingFinishedSpy.count(), 1);
3403
#ifndef QT_NO_COMPLETER
3404
class task198789_Widget : public QWidget
3408
task198789_Widget(QWidget *parent = 0) : QWidget(parent)
3410
QStringList wordList;
3411
wordList << "alpha" << "omega" << "omicron" << "zeta";
3413
lineEdit = new QLineEdit(this);
3414
completer = new QCompleter(wordList, this);
3415
lineEdit->setCompleter(completer);
3417
connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));
3420
QLineEdit *lineEdit;
3421
QCompleter *completer;
3422
QString currentCompletion;
3425
void textChanged(const QString &)
3427
currentCompletion = completer->currentCompletion();
3431
void tst_QLineEdit::task198789_currentCompletion()
3433
task198789_Widget widget;
3435
qApp->processEvents();
3436
QTest::keyPress(widget.lineEdit, 'o');
3437
QTest::keyPress(widget.lineEdit, 'm');
3438
QTest::keyPress(widget.lineEdit, 'i');
3439
QCOMPARE(widget.currentCompletion, QLatin1String("omicron"));
3442
void tst_QLineEdit::task210502_caseInsensitiveInlineCompletion()
3444
QString completion("ABCD");
3445
QStringList completions;
3446
completions << completion;
3448
QCompleter completer(completions);
3449
completer.setCaseSensitivity(Qt::CaseInsensitive);
3450
completer.setCompletionMode(QCompleter::InlineCompletion);
3451
lineEdit.setCompleter(&completer);
3453
QApplication::setActiveWindow(&lineEdit);
3454
QVERIFY(QTest::qWaitForWindowActive(&lineEdit));
3455
lineEdit.setFocus();
3456
QTRY_VERIFY(lineEdit.hasFocus());
3457
QTest::keyPress(&lineEdit, 'a');
3458
QTest::keyPress(&lineEdit, Qt::Key_Return);
3459
QCOMPARE(lineEdit.text(), completion);
3462
#endif // QT_NO_COMPLETER
3465
void tst_QLineEdit::task229938_dontEmitChangedWhenTextIsNotChanged()
3468
lineEdit.setMaxLength(5);
3470
QTest::qWaitForWindowExposed(&lineEdit); // to be safe and avoid failing setFocus with window managers
3471
lineEdit.setFocus();
3472
QSignalSpy changedSpy(&lineEdit, SIGNAL(textChanged(QString)));
3474
QTest::keyPress(&lineEdit, 'a');
3475
QTest::keyPress(&lineEdit, 'b');
3476
QTest::keyPress(&lineEdit, 'c');
3477
QTest::keyPress(&lineEdit, 'd');
3478
QTest::keyPress(&lineEdit, 'e');
3479
QTest::keyPress(&lineEdit, 'f');
3480
QCOMPARE(changedSpy.count(), 5);
3483
void tst_QLineEdit::task233101_cursorPosAfterInputMethod_data()
3485
QTest::addColumn<int>("maxLength");
3486
QTest::addColumn<int>("cursorPos");
3487
QTest::addColumn<int>("replacementStart");
3488
QTest::addColumn<int>("replacementLength");
3489
QTest::addColumn<QString>("commitString");
3491
QTest::newRow("data1") << 4 << 4 << 0 << 0 << QString("");
3492
QTest::newRow("data2") << 4 << 4 << 0 << 0 << QString("x");
3493
QTest::newRow("data3") << 4 << 4 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
3494
QTest::newRow("data4") << 4 << 3 << 0 << 0 << QString("");
3495
QTest::newRow("data5") << 4 << 3 << 0 << 0 << QString("x");
3496
QTest::newRow("data6") << 4 << 3 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
3497
QTest::newRow("data7") << 4 << 0 << 0 << 0 << QString("");
3498
QTest::newRow("data8") << 4 << 0 << 0 << 0 << QString("x");
3499
QTest::newRow("data9") << 4 << 0 << 0 << 0 << QString("xxxxxxxxxxxxxxxx");
3501
QTest::newRow("data10") << 4 << 4 << -4 << 4 << QString("");
3502
QTest::newRow("data11") << 4 << 4 << -4 << 4 << QString("x");
3503
QTest::newRow("data12") << 4 << 4 << -4 << 4 << QString("xxxxxxxxxxxxxxxx");
3504
QTest::newRow("data13") << 4 << 3 << -3 << 4 << QString("");
3505
QTest::newRow("data14") << 4 << 3 << -3 << 4 << QString("x");
3506
QTest::newRow("data15") << 4 << 3 << -3 << 4 << QString("xxxxxxxxxxxxxxxx");
3507
QTest::newRow("data16") << 4 << 0 << 0 << 4 << QString("");
3508
QTest::newRow("data17") << 4 << 0 << 0 << 4 << QString("x");
3509
QTest::newRow("data18") << 4 << 0 << 0 << 4 << QString("xxxxxxxxxxxxxxxx");
3511
QTest::newRow("data19") << 4 << 4 << -4 << 0 << QString("");
3512
QTest::newRow("data20") << 4 << 4 << -4 << 0 << QString("x");
3513
QTest::newRow("data21") << 4 << 4 << -4 << 0 << QString("xxxxxxxxxxxxxxxx");
3514
QTest::newRow("data22") << 4 << 3 << -3 << 0 << QString("");
3515
QTest::newRow("data23") << 4 << 3 << -3 << 0 << QString("x");
3516
QTest::newRow("data24") << 4 << 3 << -3 << 0 << QString("xxxxxxxxxxxxxxxx");
3519
void tst_QLineEdit::task233101_cursorPosAfterInputMethod()
3521
QFETCH(int, maxLength);
3522
QFETCH(int, cursorPos);
3523
QFETCH(int, replacementStart);
3524
QFETCH(int, replacementLength);
3525
QFETCH(QString, commitString);
3528
lineEdit.setMaxLength(maxLength);
3529
lineEdit.insert(QString().fill(QLatin1Char('a'), cursorPos));
3530
QCOMPARE(lineEdit.cursorPosition(), cursorPos);
3532
QInputMethodEvent event;
3533
event.setCommitString(QLatin1String("x"), replacementStart, replacementLength);
3534
qApp->sendEvent(&lineEdit, &event);
3535
QVERIFY(lineEdit.cursorPosition() >= 0);
3536
QVERIFY(lineEdit.cursorPosition() <= lineEdit.text().size());
3537
QVERIFY(lineEdit.text().size() <= lineEdit.maxLength());
3540
void tst_QLineEdit::task241436_passwordEchoOnEditRestoreEchoMode()
3542
QStyleOptionFrameV2 opt;
3543
QChar fillChar = testWidget->style()->styleHint(QStyle::SH_LineEdit_PasswordCharacter, &opt, testWidget);
3545
testWidget->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3546
testWidget->setFocus();
3547
QApplication::setActiveWindow(testWidget);
3548
QTRY_VERIFY(testWidget->hasFocus());
3550
QTest::keyPress(testWidget, '0');
3551
QCOMPARE(testWidget->displayText(), QString("0"));
3552
testWidget->setEchoMode(QLineEdit::Normal);
3553
testWidget->clearFocus();
3554
QCOMPARE(testWidget->displayText(), QString("0"));
3556
testWidget->activateWindow();
3557
testWidget->setFocus();
3558
testWidget->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3559
QTest::keyPress(testWidget, '0');
3560
QCOMPARE(testWidget->displayText(), QString("0"));
3561
testWidget->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3562
QCOMPARE(testWidget->displayText(), QString("0"));
3563
testWidget->clearFocus();
3564
QCOMPARE(testWidget->displayText(), QString(fillChar));
3566
// restore clean state
3567
testWidget->setEchoMode(QLineEdit::Normal);
3570
void tst_QLineEdit::task248948_redoRemovedSelection()
3572
testWidget->setText("a");
3573
testWidget->selectAll();
3574
QTest::keyPress(testWidget, Qt::Key_Delete);
3577
QTest::keyPress(testWidget, 'a');
3578
QTest::keyPress(testWidget, 'b');
3579
QCOMPARE(testWidget->text(), QLatin1String("ab"));
3582
void tst_QLineEdit::taskQTBUG_4401_enterKeyClearsPassword()
3584
QString password("Wanna guess?");
3586
testWidget->setText(password);
3587
testWidget->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3588
testWidget->setFocus();
3589
testWidget->selectAll();
3590
QApplication::setActiveWindow(testWidget);
3591
QTRY_VERIFY(testWidget->hasFocus());
3593
QTest::keyPress(testWidget, Qt::Key_Enter);
3594
QTRY_COMPARE(testWidget->text(), password);
3597
void tst_QLineEdit::taskQTBUG_4679_moveToStartEndOfBlock()
3600
const QString text("there are no blocks for lineEdit");
3601
testWidget->setText(text);
3602
testWidget->setCursorPosition(5);
3603
QCOMPARE(testWidget->cursorPosition(), 5);
3604
testWidget->setFocus();
3605
QTest::keyPress(testWidget, Qt::Key_A, Qt::MetaModifier);
3606
QCOMPARE(testWidget->cursorPosition(), 0);
3607
QTest::keyPress(testWidget, Qt::Key_E, Qt::MetaModifier);
3608
QCOMPARE(testWidget->cursorPosition(), text.size());
3612
void tst_QLineEdit::taskQTBUG_4679_selectToStartEndOfBlock()
3615
const QString text("there are no blocks for lineEdit, select all");
3616
testWidget->setText(text);
3617
testWidget->setCursorPosition(5);
3618
QCOMPARE(testWidget->cursorPosition(), 5);
3619
testWidget->setFocus();
3620
QTest::keyPress(testWidget, Qt::Key_A, Qt::MetaModifier | Qt::ShiftModifier);
3621
QCOMPARE(testWidget->cursorPosition(), 0);
3622
QVERIFY(testWidget->hasSelectedText());
3623
QCOMPARE(testWidget->selectedText(), text.mid(0, 5));
3625
QTest::keyPress(testWidget, Qt::Key_E, Qt::MetaModifier | Qt::ShiftModifier);
3626
QCOMPARE(testWidget->cursorPosition(), text.size());
3627
QVERIFY(testWidget->hasSelectedText());
3628
QCOMPARE(testWidget->selectedText(), text.mid(5));
3632
#ifndef QT_NO_CONTEXTMENU
3633
void tst_QLineEdit::taskQTBUG_7902_contextMenuCrash()
3635
// Would pass before the associated commit, but left as a guard.
3636
QLineEdit *w = new QLineEdit;
3638
QVERIFY(QTest::qWaitForWindowExposed(w));
3641
w->connect(&ti, SIGNAL(timeout()), w, SLOT(deleteLater()));
3644
QContextMenuEvent *cme = new QContextMenuEvent(QContextMenuEvent::Mouse, w->rect().center());
3645
qApp->postEvent(w, cme);
3648
// No crash, it's allright.
3652
void tst_QLineEdit::taskQTBUG_7395_readOnlyShortcut()
3654
//ReadOnly QLineEdit should not intercept shortcut.
3656
le.setReadOnly(true);
3658
QAction action(QString::fromLatin1("hello"), &le);
3659
action.setShortcut(QString::fromLatin1("p"));
3660
QSignalSpy spy(&action, SIGNAL(triggered()));
3661
le.addAction(&action);
3664
QVERIFY(QTest::qWaitForWindowExposed(&le));
3665
QApplication::setActiveWindow(&le);
3666
QVERIFY(QTest::qWaitForWindowActive(&le));
3668
QTRY_VERIFY(le.hasFocus());
3670
QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_P);
3671
QCOMPARE(spy.count(), 1);
3674
void tst_QLineEdit::QTBUG697_paletteCurrentColorGroup()
3676
if (m_keyboardScheme != QPlatformTheme::X11KeyboardScheme)
3677
QSKIP("Only tested on X11");
3680
QPalette p = le.palette();
3681
p.setBrush(QPalette::Active, QPalette::Highlight, Qt::green);
3682
p.setBrush(QPalette::Inactive, QPalette::Highlight, Qt::red);
3686
QApplication::setActiveWindow(&le);
3687
QVERIFY(QTest::qWaitForWindowActive(&le));
3689
QTRY_VERIFY(le.hasFocus());
3692
QImage img(le.size(),QImage::Format_ARGB32 );
3694
QCOMPARE(img.pixel(10, le.height()/2), QColor(Qt::green).rgb());
3695
QApplication::setActiveWindow(0);
3697
QCOMPARE(img.pixel(10, le.height()/2), QColor(Qt::red).rgb());
3700
void tst_QLineEdit::QTBUG13520_textNotVisible()
3703
le.setAlignment( Qt::AlignRight | Qt::AlignVCenter);
3705
QVERIFY(QTest::qWaitForWindowExposed(&le));
3706
le.setText("01-ST16-01SIL-MPL001wfgsdfgsdgsdfgsdfgsdfgsdfgsdfg");
3707
le.setCursorPosition(0);
3708
QTest::qWait(100); //just make sure we get he lineedit correcly painted
3710
QVERIFY(le.cursorRect().center().x() < le.width() / 2);
3715
class UpdateRegionLineEdit : public QLineEdit
3718
QRegion updateRegion;
3720
void paintEvent(QPaintEvent *event)
3722
updateRegion = event->region();
3726
void tst_QLineEdit::QTBUG7174_inputMaskCursorBlink()
3728
UpdateRegionLineEdit edit;
3729
edit.setInputMask(QLatin1String("AAAA"));
3731
edit.setText(QLatin1String("AAAA"));
3733
QRect cursorRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect();
3734
QVERIFY(QTest::qWaitForWindowExposed(&edit));
3735
edit.updateRegion = QRegion();
3736
QTest::qWait(QApplication::cursorFlashTime());
3737
QVERIFY(edit.updateRegion.contains(cursorRect));
3740
void tst_QLineEdit::QTBUG16850_setSelection()
3743
le.setInputMask("00:0");
3745
le.setSelection(3, 1);
3746
QCOMPARE(le.selectionStart(), 3);
3747
QCOMPARE(le.selectedText(), QString("1"));
3750
void tst_QLineEdit::bidiVisualMovement_data()
3752
QTest::addColumn<QString>("logical");
3753
QTest::addColumn<int>("basicDir");
3754
QTest::addColumn<IntList>("positionList");
3756
QTest::newRow("Latin text")
3757
<< QString::fromUtf8("abc")
3758
<< (int) QChar::DirL
3759
<< (IntList() << 0 << 1 << 2 << 3);
3760
QTest::newRow("Hebrew text, one item")
3761
<< QString::fromUtf8("\327\220\327\221\327\222")
3762
<< (int) QChar::DirR
3763
<< (QList<int>() << 0 << 1 << 2 << 3);
3764
QTest::newRow("Hebrew text after Latin text")
3765
<< QString::fromUtf8("abc\327\220\327\221\327\222")
3766
<< (int) QChar::DirL
3767
<< (QList<int>() << 0 << 1 << 2 << 6 << 5 << 4 << 3);
3768
QTest::newRow("Latin text after Hebrew text")
3769
<< QString::fromUtf8("\327\220\327\221\327\222abc")
3770
<< (int) QChar::DirR
3771
<< (QList<int>() << 0 << 1 << 2 << 6 << 5 << 4 << 3);
3772
QTest::newRow("LTR, 3 items")
3773
<< QString::fromUtf8("abc\327\220\327\221\327\222abc")
3774
<< (int) QChar::DirL
3775
<< (QList<int>() << 0 << 1 << 2 << 5 << 4 << 3 << 6 << 7 << 8 << 9);
3776
QTest::newRow("RTL, 3 items")
3777
<< QString::fromUtf8("\327\220\327\221\327\222abc\327\220\327\221\327\222")
3778
<< (int) QChar::DirR
3779
<< (QList<int>() << 0 << 1 << 2 << 5 << 4 << 3 << 6 << 7 << 8 << 9);
3780
QTest::newRow("LTR, 4 items")
3781
<< QString::fromUtf8("abc\327\220\327\221\327\222abc\327\220\327\221\327\222")
3782
<< (int) QChar::DirL
3783
<< (QList<int>() << 0 << 1 << 2 << 5 << 4 << 3 << 6 << 7 << 8 << 12 << 11 << 10 << 9);
3784
QTest::newRow("RTL, 4 items")
3785
<< QString::fromUtf8("\327\220\327\221\327\222abc\327\220\327\221\327\222abc")
3786
<< (int) QChar::DirR
3787
<< (QList<int>() << 0 << 1 << 2 << 5 << 4 << 3 << 6 << 7 << 8 << 12 << 11 << 10 << 9);
3790
void tst_QLineEdit::bidiVisualMovement()
3792
QFETCH(QString, logical);
3793
QFETCH(int, basicDir);
3794
QFETCH(IntList, positionList);
3797
le.setText(logical);
3799
le.setCursorMoveStyle(Qt::VisualMoveStyle);
3800
le.setCursorPosition(0);
3803
int i = 0, oldPos, newPos = 0;
3807
QVERIFY(oldPos == positionList[i]);
3808
if (basicDir == QChar::DirL) {
3809
QTest::keyClick(&le, Qt::Key_Right);
3811
QTest::keyClick(&le, Qt::Key_Left);
3812
newPos = le.cursorPosition();
3813
moved = (oldPos != newPos);
3817
QVERIFY(i == positionList.size());
3822
QVERIFY(oldPos == positionList[i]);
3823
if (basicDir == QChar::DirL) {
3824
QTest::keyClick(&le, Qt::Key_Left);
3827
QTest::keyClick(&le, Qt::Key_Right);
3829
newPos = le.cursorPosition();
3830
moved = (oldPos != newPos);
3831
} while (moved && i >= 0);
3834
void tst_QLineEdit::bidiLogicalMovement_data()
3836
bidiVisualMovement_data();
3839
void tst_QLineEdit::bidiLogicalMovement()
3841
QFETCH(QString, logical);
3842
QFETCH(int, basicDir);
3845
le.setText(logical);
3847
le.setCursorMoveStyle(Qt::LogicalMoveStyle);
3848
le.setCursorPosition(0);
3851
int i = 0, oldPos, newPos = 0;
3855
QVERIFY(oldPos == i);
3856
if (basicDir == QChar::DirL) {
3857
QTest::keyClick(&le, Qt::Key_Right);
3859
QTest::keyClick(&le, Qt::Key_Left);
3860
newPos = le.cursorPosition();
3861
moved = (oldPos != newPos);
3868
QVERIFY(oldPos == i);
3869
if (basicDir == QChar::DirL) {
3870
QTest::keyClick(&le, Qt::Key_Left);
3873
QTest::keyClick(&le, Qt::Key_Right);
3875
newPos = le.cursorPosition();
3876
moved = (oldPos != newPos);
3877
} while (moved && i >= 0);
3880
void tst_QLineEdit::selectAndCursorPosition()
3882
testWidget->setText("This is a long piece of text");
3884
testWidget->setSelection(0, 5);
3885
QCOMPARE(testWidget->cursorPosition(), 5);
3886
testWidget->setSelection(5, -5);
3887
QCOMPARE(testWidget->cursorPosition(), 0);
3890
void tst_QLineEdit::inputMethod()
3892
// widget accepts input
3893
QInputMethodQueryEvent queryEvent(Qt::ImEnabled);
3894
QApplication::sendEvent(testWidget, &queryEvent);
3895
QCOMPARE(queryEvent.value(Qt::ImEnabled).toBool(), true);
3897
testWidget->setEnabled(false);
3898
QApplication::sendEvent(testWidget, &queryEvent);
3899
QCOMPARE(queryEvent.value(Qt::ImEnabled).toBool(), false);
3900
testWidget->setEnabled(true);
3902
// removing focus allows input method to commit preedit
3903
testWidget->setText("");
3904
testWidget->activateWindow();
3905
QTRY_VERIFY(testWidget->hasFocus());
3906
QTRY_COMPARE(qApp->focusObject(), testWidget);
3908
m_platformInputContext.setCommitString("text");
3909
m_platformInputContext.m_commitCallCount = 0;
3910
QList<QInputMethodEvent::Attribute> attributes;
3911
QInputMethodEvent preeditEvent("preedit text", attributes);
3912
QApplication::sendEvent(testWidget, &preeditEvent);
3914
testWidget->clearFocus();
3915
QCOMPARE(m_platformInputContext.m_commitCallCount, 1);
3916
QCOMPARE(testWidget->text(), QString("text"));
3919
void tst_QLineEdit::inputMethodSelection()
3921
testWidget->setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
3922
testWidget->setSelection(0,0);
3923
QSignalSpy selectionSpy(testWidget, SIGNAL(selectionChanged()));
3925
QCOMPARE(selectionSpy.count(), 0);
3926
QCOMPARE(testWidget->selectionStart(), -1);
3928
testWidget->setSelection(0,5);
3930
QCOMPARE(selectionSpy.count(), 1);
3931
QCOMPARE(testWidget->selectionStart(), 0);
3935
QList<QInputMethodEvent::Attribute> attributes;
3936
attributes << QInputMethodEvent::Attribute(QInputMethodEvent::Selection, 12, 5, QVariant());
3937
QInputMethodEvent event("", attributes);
3938
QApplication::sendEvent(testWidget, &event);
3941
QCOMPARE(selectionSpy.count(), 2);
3942
QCOMPARE(testWidget->selectionStart(), 12);
3944
// selection removed
3946
QList<QInputMethodEvent::Attribute> attributes;
3947
attributes << QInputMethodEvent::Attribute(QInputMethodEvent::Selection, 0, 0, QVariant());
3948
QInputMethodEvent event("", attributes);
3949
QApplication::sendEvent(testWidget, &event);
3952
QCOMPARE(selectionSpy.count(), 3);
3955
Q_DECLARE_METATYPE(Qt::InputMethodHints)
3956
void tst_QLineEdit::inputMethodQueryImHints_data()
3958
QTest::addColumn<Qt::InputMethodHints>("hints");
3960
QTest::newRow("None") << static_cast<Qt::InputMethodHints>(Qt::ImhNone);
3961
QTest::newRow("Password") << static_cast<Qt::InputMethodHints>(Qt::ImhHiddenText);
3962
QTest::newRow("Normal") << static_cast<Qt::InputMethodHints>(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText | Qt::ImhSensitiveData);
3965
void tst_QLineEdit::inputMethodQueryImHints()
3967
QFETCH(Qt::InputMethodHints, hints);
3968
testWidget->setInputMethodHints(hints);
3970
QVariant value = testWidget->inputMethodQuery(Qt::ImHints);
3971
QCOMPARE(static_cast<Qt::InputMethodHints>(value.toInt()), hints);
3974
void tst_QLineEdit::undoRedoAndEchoModes_data()
3976
QTest::addColumn<int>("echoMode");
3977
QTest::addColumn<QStringList>("input");
3978
QTest::addColumn<QStringList>("expected");
3980
QStringList input(QList<QString>() << "aaa" << "bbb" << "ccc");
3982
QTest::newRow("Normal")
3983
<< (int) QLineEdit::Normal
3985
<< QStringList(QList<QString>() << "aaa" << "ccc" << "");
3987
QTest::newRow("NoEcho")
3988
<< (int) QLineEdit::NoEcho
3990
<< QStringList(QList<QString>() << "" << "" << "");
3992
QTest::newRow("Password")
3993
<< (int) QLineEdit::Password
3995
<< QStringList(QList<QString>() << "" << "" << "");
3997
QTest::newRow("PasswordEchoOnEdit")
3998
<< (int) QLineEdit::PasswordEchoOnEdit
4000
<< QStringList(QList<QString>() << "" << "" << "");
4003
void tst_QLineEdit::undoRedoAndEchoModes()
4005
QFETCH(int, echoMode);
4006
QFETCH(QStringList, input);
4007
QFETCH(QStringList, expected);
4009
// create some history for the QLineEdit
4010
testWidget->clear();
4011
testWidget->setEchoMode(QLineEdit::EchoMode(echoMode));
4012
testWidget->insert(input.at(0));
4013
testWidget->selectAll();
4014
testWidget->backspace();
4015
testWidget->insert(input.at(1));
4018
QVERIFY(testWidget->isUndoAvailable());
4020
QCOMPARE(testWidget->text(), expected.at(0));
4021
testWidget->insert(input.at(2));
4022
testWidget->selectAll();
4023
testWidget->backspace();
4024
QCOMPARE(testWidget->isUndoAvailable(), echoMode == QLineEdit::Normal);
4026
QCOMPARE(testWidget->text(), expected.at(1));
4029
QCOMPARE(testWidget->isRedoAvailable(), echoMode == QLineEdit::Normal);
4031
QCOMPARE(testWidget->text(), expected.at(2));
4032
QVERIFY(!testWidget->isRedoAvailable());
4034
QCOMPARE(testWidget->text(), expected.at(2));
4037
QTEST_MAIN(tst_QLineEdit)
4038
#include "tst_qlineedit.moc"