2011-04-27 12:13:26 +00:00
/****************************************************************************
* *
* * Copyright ( C ) 2011 Nokia Corporation and / or its subsidiary ( - ies ) .
* * All rights reserved .
* * Contact : Nokia Corporation ( qt - info @ nokia . com )
* *
* * This file is part of the test suite of the Qt Toolkit .
* *
* * $ QT_BEGIN_LICENSE : LGPL $
* * GNU Lesser General Public License Usage
2011-07-07 12:52:03 +00:00
* * This file may be used under the terms of the GNU Lesser General Public
* * License version 2.1 as published by the Free Software Foundation and
* * appearing in the file LICENSE . LGPL included in the packaging of this
* * file . Please review the following information to ensure the GNU Lesser
* * General Public License version 2.1 requirements will be met :
* * http : //www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
2011-04-27 12:13:26 +00:00
* *
* * In addition , as a special exception , Nokia gives you certain additional
2011-07-07 12:52:03 +00:00
* * rights . These rights are described in the Nokia Qt LGPL Exception
2011-04-27 12:13:26 +00:00
* * version 1.1 , included in the file LGPL_EXCEPTION . txt in this package .
* *
2011-07-07 12:52:03 +00:00
* * GNU General Public License Usage
* * Alternatively , this file may be used under the terms of the GNU General
* * Public License version 3.0 as published by the Free Software Foundation
* * and appearing in the file LICENSE . GPL included in the packaging of this
* * file . Please review the following information to ensure the GNU General
* * Public License version 3.0 requirements will be met :
* * http : //www.gnu.org/copyleft/gpl.html.
* *
* * Other Usage
* * Alternatively , this file may be used in accordance with the terms and
* * conditions contained in a signed written agreement between you and Nokia .
2011-04-27 12:13:26 +00:00
* *
* *
* *
* *
* *
* * $ QT_END_LICENSE $
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <qtest.h>
# include <QtTest/QSignalSpy>
2011-10-12 03:46:02 +00:00
# include "../shared/util.h"
2011-04-27 12:13:26 +00:00
# include <QtDeclarative/qdeclarativeengine.h>
# include <QFile>
2011-10-14 08:51:42 +00:00
# include <QtDeclarative/qquickview.h>
2011-09-27 05:53:46 +00:00
# include <QtGui/qguiapplication.h>
2011-11-25 07:27:09 +00:00
# include <QtGui/qstylehints.h>
2011-09-28 13:56:36 +00:00
# include <QInputPanel>
2011-10-14 08:51:42 +00:00
# include <private/qquicktextinput_p.h>
# include <private/qquicktextinput_p_p.h>
2011-04-27 12:13:26 +00:00
# include <QDebug>
# include <QDir>
# include <QStyle>
2011-05-16 03:49:56 +00:00
# include <QtOpenGL/QGLShaderProgram>
2011-06-01 07:45:55 +00:00
# include <math.h>
2011-11-21 14:50:06 +00:00
# include <qplatforminputcontext_qpa.h>
# include <private/qinputpanel_p.h>
2011-04-27 12:13:26 +00:00
2011-11-10 02:09:13 +00:00
# ifdef Q_OS_MAC
# include <Carbon/Carbon.h>
# endif
2011-07-19 05:15:58 +00:00
# include "qplatformdefs.h"
2011-10-14 08:51:42 +00:00
Q_DECLARE_METATYPE ( QQuickTextInput : : SelectionMode )
2011-06-01 07:45:55 +00:00
DEFINE_BOOL_CONFIG_OPTION ( qmlDisableDistanceField , QML_DISABLE_DISTANCEFIELD )
2011-04-27 12:13:26 +00:00
QString createExpectedFileIfNotFound ( const QString & filebasename , const QImage & actual )
{
// XXX This will be replaced by some clever persistent platform image store.
2011-10-12 03:46:02 +00:00
QString persistent_dir = TESTDATA ( " " ) ;
2011-04-27 12:13:26 +00:00
QString arch = " unknown-architecture " ; // QTest needs to help with this.
QString expectfile = persistent_dir + QDir : : separator ( ) + filebasename + " - " + arch + " .png " ;
if ( ! QFile : : exists ( expectfile ) ) {
actual . save ( expectfile ) ;
qWarning ( ) < < " created " < < expectfile ;
}
return expectfile ;
}
2011-11-14 01:03:05 +00:00
typedef QPair < int , QChar > Key ;
2011-10-14 08:51:42 +00:00
class tst_qquicktextinput : public QObject
2011-04-27 12:13:26 +00:00
{
Q_OBJECT
public :
2011-10-14 08:51:42 +00:00
tst_qquicktextinput ( ) ;
2011-04-27 12:13:26 +00:00
private slots :
2011-05-16 03:49:56 +00:00
void initTestCase ( ) ;
void cleanupTestCase ( ) ;
2011-04-27 12:13:26 +00:00
void text ( ) ;
void width ( ) ;
void font ( ) ;
void color ( ) ;
void selection ( ) ;
void isRightToLeft_data ( ) ;
void isRightToLeft ( ) ;
void moveCursorSelection_data ( ) ;
void moveCursorSelection ( ) ;
void moveCursorSelectionSequence_data ( ) ;
void moveCursorSelectionSequence ( ) ;
void dragMouseSelection ( ) ;
void mouseSelectionMode_data ( ) ;
void mouseSelectionMode ( ) ;
2011-09-29 00:53:15 +00:00
void tripleClickSelectsAll ( ) ;
2011-04-27 12:13:26 +00:00
void horizontalAlignment_data ( ) ;
void horizontalAlignment ( ) ;
void horizontalAlignment_RightToLeft ( ) ;
void positionAt ( ) ;
void maxLength ( ) ;
void masks ( ) ;
void validators ( ) ;
void inputMethods ( ) ;
void passwordCharacter ( ) ;
void cursorDelegate ( ) ;
void cursorVisible ( ) ;
void cursorRectangle ( ) ;
void navigation ( ) ;
void navigation_RTL ( ) ;
void copyAndPaste ( ) ;
2011-11-14 01:03:05 +00:00
void copyAndPasteKeySequence ( ) ;
2011-04-27 12:13:26 +00:00
void canPasteEmpty ( ) ;
void canPaste ( ) ;
void readOnly ( ) ;
2011-09-28 13:56:36 +00:00
void openInputPanel ( ) ;
2011-04-27 12:13:26 +00:00
void setHAlignClearCache ( ) ;
void focusOutClearSelection ( ) ;
void echoMode ( ) ;
2011-07-19 05:15:58 +00:00
# ifdef QT_GUI_PASSWORD_ECHO_DELAY
void passwordEchoDelay ( ) ;
# endif
2011-04-27 12:13:26 +00:00
void geometrySignals ( ) ;
void testQtQuick11Attributes ( ) ;
void testQtQuick11Attributes_data ( ) ;
void preeditAutoScroll ( ) ;
2011-11-10 01:29:07 +00:00
void preeditCursorRectangle ( ) ;
2011-04-27 12:13:26 +00:00
void inputMethodComposing ( ) ;
void cursorRectangleSize ( ) ;
2011-11-14 01:03:05 +00:00
void keySequence_data ( ) ;
void keySequence ( ) ;
void undo_data ( ) ;
void undo ( ) ;
void redo_data ( ) ;
void redo ( ) ;
void undo_keypressevents_data ( ) ;
void undo_keypressevents ( ) ;
2011-10-21 01:01:39 +00:00
void QTBUG_19956 ( ) ;
void QTBUG_19956_data ( ) ;
void QTBUG_19956_regexp ( ) ;
2011-04-27 12:13:26 +00:00
private :
2011-10-14 08:51:42 +00:00
void simulateKey ( QQuickView * , int key ) ;
2011-04-27 12:13:26 +00:00
2011-11-14 01:03:05 +00:00
void simulateKeys ( QWindow * window , const QList < Key > & keys ) ;
void simulateKeys ( QWindow * window , const QKeySequence & sequence ) ;
2011-04-27 12:13:26 +00:00
QDeclarativeEngine engine ;
QStringList standard ;
QStringList colorStrings ;
} ;
2011-11-14 01:03:05 +00:00
typedef QList < int > IntList ;
Q_DECLARE_METATYPE ( IntList )
typedef QList < Key > KeyList ;
Q_DECLARE_METATYPE ( KeyList )
void tst_qquicktextinput : : simulateKeys ( QWindow * window , const QList < Key > & keys )
{
for ( int i = 0 ; i < keys . count ( ) ; + + i ) {
const int key = keys . at ( i ) . first ;
const int modifiers = key & Qt : : KeyboardModifierMask ;
const QString text = ! keys . at ( i ) . second . isNull ( ) ? QString ( keys . at ( i ) . second ) : QString ( ) ;
QKeyEvent press ( QEvent : : KeyPress , Qt : : Key ( key ) , Qt : : KeyboardModifiers ( modifiers ) , text ) ;
QKeyEvent release ( QEvent : : KeyRelease , Qt : : Key ( key ) , Qt : : KeyboardModifiers ( modifiers ) , text ) ;
QGuiApplication : : sendEvent ( window , & press ) ;
QGuiApplication : : sendEvent ( window , & release ) ;
}
}
void tst_qquicktextinput : : simulateKeys ( QWindow * window , const QKeySequence & sequence )
{
for ( uint i = 0 ; i < sequence . count ( ) ; + + i ) {
const int key = sequence [ i ] ;
const int modifiers = key & Qt : : KeyboardModifierMask ;
QTest : : keyClick ( window , Qt : : Key ( key & ~ modifiers ) , Qt : : KeyboardModifiers ( modifiers ) ) ;
}
}
QList < Key > & operator < < ( QList < Key > & keys , const QKeySequence & sequence )
{
for ( int i = 0 ; i < sequence . count ( ) ; + + i )
keys < < Key ( sequence [ i ] , QChar ( ) ) ;
return keys ;
}
template < int N > QList < Key > & operator < < ( QList < Key > & keys , const char ( & characters ) [ N ] )
{
for ( int i = 0 ; i < N - 1 ; + + i ) {
int key = QTest : : asciiToKey ( characters [ i ] ) ;
QChar character = QLatin1Char ( characters [ i ] ) ;
keys < < Key ( key , character ) ;
}
return keys ;
}
QList < Key > & operator < < ( QList < Key > & keys , Qt : : Key key )
{
keys < < Key ( key , QChar ( ) ) ;
return keys ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : initTestCase ( )
2011-05-16 03:49:56 +00:00
{
}
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : cleanupTestCase ( )
2011-05-16 03:49:56 +00:00
{
}
2011-10-14 08:51:42 +00:00
tst_qquicktextinput : : tst_qquicktextinput ( )
2011-04-27 12:13:26 +00:00
{
standard < < " the quick brown fox jumped over the lazy dog "
< < " It's supercalifragisiticexpialidocious! "
< < " Hello, world! "
< < " !dlrow ,olleH "
< < " spacey text " ;
colorStrings < < " aliceblue "
< < " antiquewhite "
< < " aqua "
< < " darkkhaki "
< < " darkolivegreen "
< < " dimgray "
< < " palevioletred "
< < " lightsteelblue "
< < " #000000 "
< < " #AAAAAA "
< < " #FFFFFF "
< < " #2AC05F " ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : text ( )
2011-04-27 12:13:26 +00:00
{
{
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( " import QtQuick 2.0 \n TextInput { text: \" \" } " , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > text ( ) , QString ( " " ) ) ;
delete textinputObject ;
}
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" " + standard . at ( i ) + " \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > text ( ) , standard . at ( i ) ) ;
delete textinputObject ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : width ( )
2011-04-27 12:13:26 +00:00
{
// uses Font metrics to find the width for standard
{
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( " import QtQuick 2.0 \n TextInput { text: \" \" } " , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > width ( ) , 0.0 ) ;
delete textinputObject ;
}
2011-06-01 07:45:55 +00:00
bool requiresUnhintedMetrics = ! qmlDisableDistanceField ( ) ;
2011-04-27 12:13:26 +00:00
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
QFont f ;
2011-06-01 07:45:55 +00:00
qreal metricWidth = 0.0 ;
if ( requiresUnhintedMetrics ) {
QString s = standard . at ( i ) ;
s . replace ( QLatin1Char ( ' \n ' ) , QChar : : LineSeparator ) ;
QTextLayout layout ( s ) ;
layout . setFlags ( Qt : : TextExpandTabs | Qt : : TextShowMnemonic ) ;
{
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
}
layout . beginLayout ( ) ;
forever {
QTextLine line = layout . createLine ( ) ;
if ( ! line . isValid ( ) )
break ;
}
layout . endLayout ( ) ;
metricWidth = ceil ( layout . boundingRect ( ) . width ( ) ) ;
} else {
QFontMetricsF fm ( f ) ;
metricWidth = fm . width ( standard . at ( i ) ) ;
}
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" " + standard . at ( i ) + " \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
int delta = abs ( int ( int ( textinputObject - > width ( ) ) - metricWidth ) ) ;
QVERIFY ( delta < = 3.0 ) ; // As best as we can hope for cross-platform.
delete textinputObject ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : font ( )
2011-04-27 12:13:26 +00:00
{
//test size, then bold, then italic, then family
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { font.pointSize: 40; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > font ( ) . pointSize ( ) , 40 ) ;
QCOMPARE ( textinputObject - > font ( ) . bold ( ) , false ) ;
QCOMPARE ( textinputObject - > font ( ) . italic ( ) , false ) ;
delete textinputObject ;
}
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { font.bold: true; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > font ( ) . bold ( ) , true ) ;
QCOMPARE ( textinputObject - > font ( ) . italic ( ) , false ) ;
delete textinputObject ;
}
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { font.italic: true; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > font ( ) . italic ( ) , true ) ;
QCOMPARE ( textinputObject - > font ( ) . bold ( ) , false ) ;
delete textinputObject ;
}
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { font.family: \" Helvetica \" ; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > font ( ) . family ( ) , QString ( " Helvetica " ) ) ;
QCOMPARE ( textinputObject - > font ( ) . bold ( ) , false ) ;
QCOMPARE ( textinputObject - > font ( ) . italic ( ) , false ) ;
delete textinputObject ;
}
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { font.family: \" \" ; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > font ( ) . family ( ) , QString ( " " ) ) ;
delete textinputObject ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : color ( )
2011-04-27 12:13:26 +00:00
{
//test color
for ( int i = 0 ; i < colorStrings . size ( ) ; i + + )
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { color: \" " + colorStrings . at ( i ) + " \" ; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > color ( ) , QColor ( colorStrings . at ( i ) ) ) ;
delete textinputObject ;
}
//test selection color
for ( int i = 0 ; i < colorStrings . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextInput { selectionColor: \" " + colorStrings . at ( i ) + " \" ; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > selectionColor ( ) , QColor ( colorStrings . at ( i ) ) ) ;
delete textinputObject ;
}
//test selected text color
for ( int i = 0 ; i < colorStrings . size ( ) ; i + + )
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { selectedTextColor: \" " + colorStrings . at ( i ) + " \" ; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > selectedTextColor ( ) , QColor ( colorStrings . at ( i ) ) ) ;
delete textinputObject ;
}
{
QString colorStr = " #AA001234 " ;
QColor testColor ( " #001234 " ) ;
testColor . setAlpha ( 170 ) ;
QString componentStr = " import QtQuick 2.0 \n TextInput { color: \" " + colorStr + " \" ; text: \" Hello World \" } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QCOMPARE ( textinputObject - > color ( ) , testColor ) ;
delete textinputObject ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : selection ( )
2011-04-27 12:13:26 +00:00
{
QString testStr = standard [ 0 ] ;
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" " + testStr + " \" ; } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
//Test selection follows cursor
2011-10-17 11:03:58 +00:00
for ( int i = 0 ; i < = testStr . size ( ) ; i + + ) {
2011-04-27 12:13:26 +00:00
textinputObject - > setCursorPosition ( i ) ;
QCOMPARE ( textinputObject - > cursorPosition ( ) , i ) ;
QCOMPARE ( textinputObject - > selectionStart ( ) , i ) ;
QCOMPARE ( textinputObject - > selectionEnd ( ) , i ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
}
textinputObject - > setCursorPosition ( 0 ) ;
QVERIFY ( textinputObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
// Verify invalid positions are ignored.
textinputObject - > setCursorPosition ( - 1 ) ;
QVERIFY ( textinputObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
textinputObject - > setCursorPosition ( textinputObject - > text ( ) . count ( ) + 1 ) ;
QVERIFY ( textinputObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
//Test selection
2011-10-17 11:03:58 +00:00
for ( int i = 0 ; i < = testStr . size ( ) ; i + + ) {
2011-04-27 12:13:26 +00:00
textinputObject - > select ( 0 , i ) ;
QCOMPARE ( testStr . mid ( 0 , i ) , textinputObject - > selectedText ( ) ) ;
}
2011-10-17 11:03:58 +00:00
for ( int i = 0 ; i < = testStr . size ( ) ; i + + ) {
2011-04-27 12:13:26 +00:00
textinputObject - > select ( i , testStr . size ( ) ) ;
QCOMPARE ( testStr . mid ( i , testStr . size ( ) - i ) , textinputObject - > selectedText ( ) ) ;
}
textinputObject - > setCursorPosition ( 0 ) ;
QVERIFY ( textinputObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
//Test Error Ignoring behaviour
textinputObject - > setCursorPosition ( 0 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
textinputObject - > select ( - 10 , 0 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
textinputObject - > select ( 100 , 110 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
textinputObject - > select ( 0 , - 10 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
textinputObject - > select ( 0 , 100 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
textinputObject - > select ( 0 , 10 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . size ( ) = = 10 ) ;
textinputObject - > select ( - 10 , 10 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . size ( ) = = 10 ) ;
textinputObject - > select ( 100 , 101 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . size ( ) = = 10 ) ;
textinputObject - > select ( 0 , - 10 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . size ( ) = = 10 ) ;
textinputObject - > select ( 0 , 100 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . size ( ) = = 10 ) ;
textinputObject - > deselect ( ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
textinputObject - > select ( 0 , 10 ) ;
QVERIFY ( textinputObject - > selectedText ( ) . size ( ) = = 10 ) ;
textinputObject - > deselect ( ) ;
QVERIFY ( textinputObject - > selectedText ( ) . isNull ( ) ) ;
2011-11-15 11:43:16 +00:00
// test input method selection
QSignalSpy selectionSpy ( textinputObject , SIGNAL ( selectedTextChanged ( ) ) ) ;
textinputObject - > setFocus ( true ) ;
{
QList < QInputMethodEvent : : Attribute > attributes ;
attributes < < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Selection , 12 , 5 , QVariant ( ) ) ;
QInputMethodEvent event ( " " , attributes ) ;
QApplication : : sendEvent ( textinputObject , & event ) ;
}
QCOMPARE ( selectionSpy . count ( ) , 1 ) ;
QCOMPARE ( textinputObject - > selectionStart ( ) , 12 ) ;
QCOMPARE ( textinputObject - > selectionEnd ( ) , 17 ) ;
2011-04-27 12:13:26 +00:00
delete textinputObject ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : isRightToLeft_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < bool > ( " emptyString " ) ;
QTest : : addColumn < bool > ( " firstCharacter " ) ;
QTest : : addColumn < bool > ( " lastCharacter " ) ;
QTest : : addColumn < bool > ( " middleCharacter " ) ;
QTest : : addColumn < bool > ( " startString " ) ;
QTest : : addColumn < bool > ( " midString " ) ;
QTest : : addColumn < bool > ( " endString " ) ;
const quint16 arabic_str [ ] = { 0x0638 , 0x0643 , 0x00646 , 0x0647 , 0x0633 , 0x0638 , 0x0643 , 0x00646 , 0x0647 , 0x0633 , 0x0647 } ;
QTest : : newRow ( " Empty " ) < < " " < < false < < false < < false < < false < < false < < false < < false ;
QTest : : newRow ( " Neutral " ) < < " 23244242 " < < false < < false < < false < < false < < false < < false < < false ;
QTest : : newRow ( " LTR " ) < < " Hello world " < < false < < false < < false < < false < < false < < false < < false ;
QTest : : newRow ( " RTL " ) < < QString : : fromUtf16 ( arabic_str , 11 ) < < false < < true < < true < < true < < true < < true < < true ;
QTest : : newRow ( " Bidi RTL + LTR + RTL " ) < < QString : : fromUtf16 ( arabic_str , 11 ) + QString ( " Hello world " ) + QString : : fromUtf16 ( arabic_str , 11 ) < < false < < true < < true < < false < < true < < true < < true ;
QTest : : newRow ( " Bidi LTR + RTL + LTR " ) < < QString ( " Hello world " ) + QString : : fromUtf16 ( arabic_str , 11 ) + QString ( " Hello world " ) < < false < < false < < false < < true < < false < < false < < false ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : isRightToLeft ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , text ) ;
QFETCH ( bool , emptyString ) ;
QFETCH ( bool , firstCharacter ) ;
QFETCH ( bool , lastCharacter ) ;
QFETCH ( bool , middleCharacter ) ;
QFETCH ( bool , startString ) ;
QFETCH ( bool , midString ) ;
QFETCH ( bool , endString ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput textInput ;
2011-04-27 12:13:26 +00:00
textInput . setText ( text ) ;
// first test that the right string is delivered to the QString::isRightToLeft()
QCOMPARE ( textInput . isRightToLeft ( 0 , 0 ) , text . mid ( 0 , 0 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textInput . isRightToLeft ( 0 , 1 ) , text . mid ( 0 , 1 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textInput . isRightToLeft ( text . count ( ) - 2 , text . count ( ) - 1 ) , text . mid ( text . count ( ) - 2 , text . count ( ) - 1 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textInput . isRightToLeft ( text . count ( ) / 2 , text . count ( ) / 2 + 1 ) , text . mid ( text . count ( ) / 2 , text . count ( ) / 2 + 1 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textInput . isRightToLeft ( 0 , text . count ( ) / 4 ) , text . mid ( 0 , text . count ( ) / 4 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textInput . isRightToLeft ( text . count ( ) / 4 , 3 * text . count ( ) / 4 ) , text . mid ( text . count ( ) / 4 , 3 * text . count ( ) / 4 ) . isRightToLeft ( ) ) ;
if ( text . isEmpty ( ) )
QTest : : ignoreMessage ( QtWarningMsg , " <Unknown File>: QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start. " ) ;
QCOMPARE ( textInput . isRightToLeft ( 3 * text . count ( ) / 4 , text . count ( ) - 1 ) , text . mid ( 3 * text . count ( ) / 4 , text . count ( ) - 1 ) . isRightToLeft ( ) ) ;
// then test that the feature actually works
QCOMPARE ( textInput . isRightToLeft ( 0 , 0 ) , emptyString ) ;
QCOMPARE ( textInput . isRightToLeft ( 0 , 1 ) , firstCharacter ) ;
QCOMPARE ( textInput . isRightToLeft ( text . count ( ) - 2 , text . count ( ) - 1 ) , lastCharacter ) ;
QCOMPARE ( textInput . isRightToLeft ( text . count ( ) / 2 , text . count ( ) / 2 + 1 ) , middleCharacter ) ;
QCOMPARE ( textInput . isRightToLeft ( 0 , text . count ( ) / 4 ) , startString ) ;
QCOMPARE ( textInput . isRightToLeft ( text . count ( ) / 4 , 3 * text . count ( ) / 4 ) , midString ) ;
if ( text . isEmpty ( ) )
QTest : : ignoreMessage ( QtWarningMsg , " <Unknown File>: QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start. " ) ;
QCOMPARE ( textInput . isRightToLeft ( 3 * text . count ( ) / 4 , text . count ( ) - 1 ) , endString ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : moveCursorSelection_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " testStr " ) ;
QTest : : addColumn < int > ( " cursorPosition " ) ;
QTest : : addColumn < int > ( " movePosition " ) ;
2011-10-14 08:51:42 +00:00
QTest : : addColumn < QQuickTextInput : : SelectionMode > ( " mode " ) ;
2011-04-27 12:13:26 +00:00
QTest : : addColumn < int > ( " selectionStart " ) ;
QTest : : addColumn < int > ( " selectionEnd " ) ;
QTest : : addColumn < bool > ( " reversible " ) ;
// () contains the text selected by the cursor.
// <> contains the actual selection.
QTest : : newRow ( " (t)he|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 1 < < QQuickTextInput : : SelectCharacters < < 0 < < 1 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " do(g)|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 43 < < 44 < < QQuickTextInput : : SelectCharacters < < 43 < < 44 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " jum(p)ed|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 23 < < 24 < < QQuickTextInput : : SelectCharacters < < 23 < < 24 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " jumped( )over|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 26 < < 27 < < QQuickTextInput : : SelectCharacters < < 26 < < 27 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " (the )|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 4 < < QQuickTextInput : : SelectCharacters < < 0 < < 4 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " ( dog)|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 40 < < 44 < < QQuickTextInput : : SelectCharacters < < 40 < < 44 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " ( jumped )|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 19 < < 27 < < QQuickTextInput : : SelectCharacters < < 19 < < 27 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " th(e qu)ick|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 2 < < 6 < < QQuickTextInput : : SelectCharacters < < 2 < < 6 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " la(zy d)og|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 38 < < 42 < < QQuickTextInput : : SelectCharacters < < 38 < < 42 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " jum(ped ov)er|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 23 < < 29 < < QQuickTextInput : : SelectCharacters < < 23 < < 29 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " ()the|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 0 < < QQuickTextInput : : SelectCharacters < < 0 < < 0 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dog()|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 44 < < 44 < < QQuickTextInput : : SelectCharacters < < 44 < < 44 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " jum()ped|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 23 < < 23 < < QQuickTextInput : : SelectCharacters < < 23 < < 23 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(t)he>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 1 < < QQuickTextInput : : SelectWords < < 0 < < 3 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <do(g)>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 43 < < 44 < < QQuickTextInput : : SelectWords < < 41 < < 44 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <jum(p)ed>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 23 < < 24 < < QQuickTextInput : : SelectWords < < 20 < < 26 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <jumped( )>over|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 26 < < 27 < < QQuickTextInput : : SelectWords < < 20 < < 27 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " jumped<( )over>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 27 < < 26 < < QQuickTextInput : : SelectWords < < 26 < < 31 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(the )>quick|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 4 < < QQuickTextInput : : SelectWords < < 0 < < 4 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(the )quick>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 4 < < 0 < < QQuickTextInput : : SelectWords < < 0 < < 9 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <lazy( dog)>|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 40 < < 44 < < QQuickTextInput : : SelectWords < < 36 < < 44 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " lazy<( dog)>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 44 < < 40 < < QQuickTextInput : : SelectWords < < 40 < < 44 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <fox( jumped )>over|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 19 < < 27 < < QQuickTextInput : : SelectWords < < 16 < < 27 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " fox<( jumped )over>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 27 < < 19 < < QQuickTextInput : : SelectWords < < 19 < < 31 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <th(e qu)ick>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 2 < < 6 < < QQuickTextInput : : SelectWords < < 0 < < 9 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <la(zy d)og|words> " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 38 < < 42 < < QQuickTextInput : : SelectWords < < 36 < < 44 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <jum(ped ov)er>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 23 < < 29 < < QQuickTextInput : : SelectWords < < 20 < < 31 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <()>the|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 0 < < QQuickTextInput : : SelectWords < < 0 < < 0 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dog<()>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 44 < < 44 < < QQuickTextInput : : SelectWords < < 44 < < 44 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " jum<()>ped|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 23 < < 23 < < QQuickTextInput : : SelectWords < < 23 < < 23 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<(,)> |words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 5 < < 6 < < QQuickTextInput : : SelectWords < < 5 < < 6 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<(, )>world|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 5 < < 7 < < QQuickTextInput : : SelectWords < < 5 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<(, )world>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 7 < < 5 < < QQuickTextInput : : SelectWords < < 5 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <Hel(lo, )>world|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 3 < < 7 < < QQuickTextInput : : SelectWords < < 0 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <Hel(lo, )world>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 7 < < 3 < < QQuickTextInput : : SelectWords < < 0 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <Hel(lo)>,|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 3 < < 5 < < QQuickTextInput : : SelectWords < < 0 < < 5 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<()>,|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 5 < < 5 < < QQuickTextInput : : SelectWords < < 5 < < 5 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello,<()>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 6 < < 6 < < QQuickTextInput : : SelectWords < < 6 < < 6 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<,( )>world|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 6 < < 7 < < QQuickTextInput : : SelectWords < < 5 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello,<( )world>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 7 < < 6 < < QQuickTextInput : : SelectWords < < 6 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<,( world)>|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 6 < < 12 < < QQuickTextInput : : SelectWords < < 5 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello,<( world)>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 12 < < 6 < < QQuickTextInput : : SelectWords < < 6 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<,( world!)>|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 6 < < 13 < < QQuickTextInput : : SelectWords < < 5 < < 13 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello,<( world!)>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 13 < < 6 < < QQuickTextInput : : SelectWords < < 6 < < 13 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<(, world!)>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 5 < < 13 < < QQuickTextInput : : SelectWords < < 5 < < 13 < < true ;
2011-04-27 12:13:26 +00:00
// Fails due to an issue with QTextBoundaryFinder and punctuation at the end of strings.
// QTBUG-11365
// QTest::newRow("world<(!)>|words")
2011-10-14 08:51:42 +00:00
// << standard[2] << 12 << 13 << QQuickTextInput::SelectWords << 12 << 13 << true;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " world!<()>)|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 13 < < 13 < < QQuickTextInput : : SelectWords < < 13 < < 13 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " world<()>!)|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 12 < < 12 < < QQuickTextInput : : SelectWords < < 12 < < 12 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(,)>olleH |words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 8 < < QQuickTextInput : : SelectWords < < 7 < < 8 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <dlrow( ,)>olleH|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 6 < < 8 < < QQuickTextInput : : SelectWords < < 1 < < 8 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dlrow<( ,)>olleH|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 8 < < 6 < < QQuickTextInput : : SelectWords < < 6 < < 8 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <dlrow( ,ol)leH>|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 6 < < 10 < < QQuickTextInput : : SelectWords < < 1 < < 13 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dlrow<( ,ol)leH>|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 10 < < 6 < < QQuickTextInput : : SelectWords < < 6 < < 13 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " ,<(ol)leH>,|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 8 < < 10 < < QQuickTextInput : : SelectWords < < 8 < < 13 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " ,<()>olleH|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 8 < < 8 < < QQuickTextInput : : SelectWords < < 8 < < 8 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <()>,olleH|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 7 < < QQuickTextInput : : SelectWords < < 7 < < 7 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <dlrow( )>,olleH|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 6 < < 7 < < QQuickTextInput : : SelectWords < < 1 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dlrow<( ),>olleH|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 6 < < QQuickTextInput : : SelectWords < < 6 < < 8 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(dlrow )>,olleH|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 1 < < 7 < < QQuickTextInput : : SelectWords < < 1 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(dlrow ),>olleH|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 1 < < QQuickTextInput : : SelectWords < < 1 < < 8 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(!dlrow )>,olleH|words,ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 0 < < 7 < < QQuickTextInput : : SelectWords < < 0 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(!dlrow ),>olleH|words,rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 0 < < QQuickTextInput : : SelectWords < < 0 < < 8 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " (!dlrow ,)olleH|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 0 < < 8 < < QQuickTextInput : : SelectWords < < 0 < < 8 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(!)>dlrow|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 0 < < 1 < < QQuickTextInput : : SelectWords < < 0 < < 1 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <()>!dlrow|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 0 < < 0 < < QQuickTextInput : : SelectWords < < 0 < < 0 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " !<()>dlrow|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 1 < < 1 < < QQuickTextInput : : SelectWords < < 1 < < 1 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <s(pac)ey> text |words " )
2011-10-14 08:51:42 +00:00
< < standard [ 4 ] < < 1 < < 4 < < QQuickTextInput : : SelectWords < < 1 < < 7 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " spacey <t(ex)t> |words " )
2011-10-14 08:51:42 +00:00
< < standard [ 4 ] < < 11 < < 13 < < QQuickTextInput : : SelectWords < < 10 < < 14 < < false ; // Should be reversible. QTBUG-11365
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <( )>spacey text |words|ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 4 ] < < 0 < < 1 < < QQuickTextInput : : SelectWords < < 0 < < 1 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <( )spacey> text |words|rtl " )
2011-10-14 08:51:42 +00:00
< < standard [ 4 ] < < 1 < < 0 < < QQuickTextInput : : SelectWords < < 0 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " spacey <text( )>|words|ltr " )
2011-10-14 08:51:42 +00:00
< < standard [ 4 ] < < 14 < < 15 < < QQuickTextInput : : SelectWords < < 10 < < 15 < < false ;
2011-04-27 12:13:26 +00:00
// QTBUG-11365
// QTest::newRow("spacey text<( )>|words|rtl")
2011-10-14 08:51:42 +00:00
// << standard[4] << 15 << 14 << QQuickTextInput::SelectWords << 14 << 15 << false;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <()> spacey text |words " )
2011-10-14 08:51:42 +00:00
< < standard [ 4 ] < < 0 < < 0 < < QQuickTextInput : : SelectWords < < 0 < < 0 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " spacey text <()>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 4 ] < < 15 < < 15 < < QQuickTextInput : : SelectWords < < 15 < < 15 < < false ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : moveCursorSelection ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , testStr ) ;
QFETCH ( int , cursorPosition ) ;
QFETCH ( int , movePosition ) ;
2011-10-14 08:51:42 +00:00
QFETCH ( QQuickTextInput : : SelectionMode , mode ) ;
2011-04-27 12:13:26 +00:00
QFETCH ( int , selectionStart ) ;
QFETCH ( int , selectionEnd ) ;
QFETCH ( bool , reversible ) ;
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" " + testStr + " \" ; } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
textinputObject - > setCursorPosition ( cursorPosition ) ;
textinputObject - > moveCursorSelection ( movePosition , mode ) ;
QCOMPARE ( textinputObject - > selectedText ( ) , testStr . mid ( selectionStart , selectionEnd - selectionStart ) ) ;
QCOMPARE ( textinputObject - > selectionStart ( ) , selectionStart ) ;
QCOMPARE ( textinputObject - > selectionEnd ( ) , selectionEnd ) ;
if ( reversible ) {
textinputObject - > setCursorPosition ( movePosition ) ;
textinputObject - > moveCursorSelection ( cursorPosition , mode ) ;
QCOMPARE ( textinputObject - > selectedText ( ) , testStr . mid ( selectionStart , selectionEnd - selectionStart ) ) ;
QCOMPARE ( textinputObject - > selectionStart ( ) , selectionStart ) ;
QCOMPARE ( textinputObject - > selectionEnd ( ) , selectionEnd ) ;
}
delete textinputObject ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : moveCursorSelectionSequence_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " testStr " ) ;
QTest : : addColumn < int > ( " cursorPosition " ) ;
QTest : : addColumn < int > ( " movePosition1 " ) ;
QTest : : addColumn < int > ( " movePosition2 " ) ;
QTest : : addColumn < int > ( " selection1Start " ) ;
QTest : : addColumn < int > ( " selection1End " ) ;
QTest : : addColumn < int > ( " selection2Start " ) ;
QTest : : addColumn < int > ( " selection2End " ) ;
// () contains the text selected by the cursor.
// <> contains the actual selection.
// ^ is the revised cursor position.
// {} contains the revised selection.
QTest : : newRow ( " the {<quick( bro)wn> f^ox} jumped|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 17
< < 4 < < 15
< < 4 < < 19 ;
QTest : : newRow ( " the quick<( {bro)wn> f^ox} jumped|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 17
< < 9 < < 15
< < 10 < < 19 ;
QTest : : newRow ( " the {<quick( bro)wn> ^}fox jumped|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 16
< < 4 < < 15
< < 4 < < 16 ;
QTest : : newRow ( " the quick<( {bro)wn> ^}fox jumped|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 16
< < 9 < < 15
< < 10 < < 16 ;
QTest : : newRow ( " the {<quick( bro)wn^>} fox jumped|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 15
< < 4 < < 15
< < 4 < < 15 ;
QTest : : newRow ( " the quick<( {bro)wn^>} f^ox jumped|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 15
< < 9 < < 15
< < 10 < < 15 ;
QTest : : newRow ( " the {<quick() ^}bro)wn> fox|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 10
< < 4 < < 15
< < 4 < < 10 ;
QTest : : newRow ( " the quick<( {^bro)wn>} fox|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 10
< < 9 < < 15
< < 10 < < 15 ;
QTest : : newRow ( " the {<quick^}( bro)wn> fox|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 9
< < 4 < < 15
< < 4 < < 9 ;
QTest : : newRow ( " the quick{<(^ bro)wn>} fox|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 9
< < 9 < < 15
< < 9 < < 15 ;
QTest : : newRow ( " the {<qui^ck}( bro)wn> fox|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 7
< < 4 < < 15
< < 4 < < 9 ;
QTest : : newRow ( " the {<qui^ck}( bro)wn> fox|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 7
< < 9 < < 15
< < 4 < < 15 ;
QTest : : newRow ( " the {<^quick}( bro)wn> fox|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 4
< < 4 < < 15
< < 4 < < 9 ;
QTest : : newRow ( " the {<^quick}( bro)wn> fox|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 4
< < 9 < < 15
< < 4 < < 15 ;
QTest : : newRow ( " the{^ <quick}( bro)wn> fox|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 3
< < 4 < < 15
< < 3 < < 9 ;
QTest : : newRow ( " the{^ <quick}( bro)wn> fox|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 3
< < 9 < < 15
< < 3 < < 15 ;
QTest : : newRow ( " {t^he <quick}( bro)wn> fox|ltr " )
< < standard [ 0 ]
< < 9 < < 13 < < 1
< < 4 < < 15
< < 0 < < 9 ;
QTest : : newRow ( " {t^he <quick}( bro)wn> fox|rtl " )
< < standard [ 0 ]
< < 13 < < 9 < < 1
< < 9 < < 15
< < 0 < < 15 ;
QTest : : newRow ( " {<He(ll)o>, w^orld}!|ltr " )
< < standard [ 2 ]
< < 2 < < 4 < < 8
< < 0 < < 5
< < 0 < < 12 ;
QTest : : newRow ( " {<He(ll)o>, w^orld}!|rtl " )
< < standard [ 2 ]
< < 4 < < 2 < < 8
< < 0 < < 5
< < 0 < < 12 ;
QTest : : newRow ( " !{dlro^w ,<o(ll)eH>}|ltr " )
< < standard [ 3 ]
< < 9 < < 11 < < 5
< < 8 < < 13
< < 1 < < 13 ;
QTest : : newRow ( " !{dlro^w ,<o(ll)eH>}|rtl " )
< < standard [ 3 ]
< < 11 < < 9 < < 5
< < 8 < < 13
< < 1 < < 13 ;
QTest : : newRow ( " {<(^} sp)acey> text |ltr " )
< < standard [ 4 ]
< < 0 < < 3 < < 0
< < 0 < < 7
< < 0 < < 0 ;
QTest : : newRow ( " {<( ^}sp)acey> text |ltr " )
< < standard [ 4 ]
< < 0 < < 3 < < 1
< < 0 < < 7
< < 0 < < 1 ;
QTest : : newRow ( " <( {s^p)acey>} text |rtl " )
< < standard [ 4 ]
< < 3 < < 0 < < 2
< < 0 < < 7
< < 1 < < 7 ;
QTest : : newRow ( " <( {^sp)acey>} text |rtl " )
< < standard [ 4 ]
< < 3 < < 0 < < 1
< < 0 < < 7
< < 1 < < 7 ;
QTest : : newRow ( " spacey <te(xt {^)>}|rtl " )
< < standard [ 4 ]
< < 15 < < 12 < < 15
< < 10 < < 15
< < 15 < < 15 ;
// QTBUG-11365
// QTest::newRow(" spacey <te(xt{^ )>}|rtl")
// << standard[4]
// << 15 << 12 << 14
// << 10 << 15
// << 14 << 15;
QTest : : newRow ( " spacey {<te(x^t} )>|ltr " )
< < standard [ 4 ]
< < 12 < < 15 < < 13
< < 10 < < 15
< < 10 < < 14 ;
// QTBUG-11365
// QTest::newRow(" spacey {<te(xt^} )>|ltr")
// << standard[4]
// << 12 << 15 << 14
// << 10 << 15
// << 10 << 14;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : moveCursorSelectionSequence ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , testStr ) ;
QFETCH ( int , cursorPosition ) ;
QFETCH ( int , movePosition1 ) ;
QFETCH ( int , movePosition2 ) ;
QFETCH ( int , selection1Start ) ;
QFETCH ( int , selection1End ) ;
QFETCH ( int , selection2Start ) ;
QFETCH ( int , selection2End ) ;
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" " + testStr + " \" ; } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
textinputObject - > setCursorPosition ( cursorPosition ) ;
2011-10-14 08:51:42 +00:00
textinputObject - > moveCursorSelection ( movePosition1 , QQuickTextInput : : SelectWords ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textinputObject - > selectedText ( ) , testStr . mid ( selection1Start , selection1End - selection1Start ) ) ;
QCOMPARE ( textinputObject - > selectionStart ( ) , selection1Start ) ;
QCOMPARE ( textinputObject - > selectionEnd ( ) , selection1End ) ;
2011-10-14 08:51:42 +00:00
textinputObject - > moveCursorSelection ( movePosition2 , QQuickTextInput : : SelectWords ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textinputObject - > selectedText ( ) , testStr . mid ( selection2Start , selection2End - selection2Start ) ) ;
QCOMPARE ( textinputObject - > selectionStart ( ) , selection2Start ) ;
QCOMPARE ( textinputObject - > selectionEnd ( ) , selection2End ) ;
delete textinputObject ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : dragMouseSelection ( )
2011-04-27 12:13:26 +00:00
{
2011-10-12 03:46:02 +00:00
QString qmlfile = TESTDATA ( " mouseselection_true.qml " ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-09-09 12:50:48 +00:00
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textInputObject = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInputObject ! = 0 ) ;
// press-and-drag-and-release from x1 to x2
int x1 = 10 ;
int x2 = 70 ;
int y = textInputObject - > height ( ) / 2 ;
QTest : : mousePress ( & canvas , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : mouseMove ( & canvas , QPoint ( x2 , y ) ) ;
2011-04-27 12:13:26 +00:00
QTest : : mouseRelease ( & canvas , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : qWait ( 100 ) ;
QString str1 ;
QVERIFY ( ( str1 = textInputObject - > selectedText ( ) ) . length ( ) > 3 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( str1 . length ( ) > 3 ) ;
// press and drag the current selection.
x1 = 40 ;
x2 = 100 ;
QTest : : mousePress ( & canvas , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : mouseMove ( & canvas , QPoint ( x2 , y ) ) ;
QTest : : mouseRelease ( & canvas , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
QTest : : qWait ( 300 ) ;
2011-04-27 12:13:26 +00:00
QString str2 = textInputObject - > selectedText ( ) ;
QVERIFY ( str2 . length ( ) > 3 ) ;
2011-09-27 05:53:46 +00:00
QVERIFY ( str1 ! = str2 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : mouseSelectionMode_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " qmlfile " ) ;
QTest : : addColumn < bool > ( " selectWords " ) ;
// import installed
2011-10-12 03:46:02 +00:00
QTest : : newRow ( " SelectWords " ) < < TESTDATA ( " mouseselectionmode_words.qml " ) < < true ;
QTest : : newRow ( " SelectCharacters " ) < < TESTDATA ( " mouseselectionmode_characters.qml " ) < < false ;
QTest : : newRow ( " default " ) < < TESTDATA ( " mouseselectionmode_default.qml " ) < < false ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : mouseSelectionMode ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , qmlfile ) ;
QFETCH ( bool , selectWords ) ;
QString text = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textInputObject = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInputObject ! = 0 ) ;
// press-and-drag-and-release from x1 to x2
int x1 = 10 ;
int x2 = 70 ;
int y = textInputObject - > height ( ) / 2 ;
QTest : : mousePress ( & canvas , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : mouseMove ( & canvas , QPoint ( x2 , y ) ) ; // doesn't work
2011-04-27 12:13:26 +00:00
QTest : : mouseRelease ( & canvas , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : qWait ( 300 ) ;
2011-04-27 12:13:26 +00:00
if ( selectWords ) {
2011-09-27 05:53:46 +00:00
QTRY_COMPARE ( textInputObject - > selectedText ( ) , text ) ;
2011-04-27 12:13:26 +00:00
} else {
2011-09-27 05:53:46 +00:00
QTRY_VERIFY ( textInputObject - > selectedText ( ) . length ( ) > 3 ) ;
QVERIFY ( textInputObject - > selectedText ( ) ! = text ) ;
2011-04-27 12:13:26 +00:00
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : horizontalAlignment_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < int > ( " hAlign " ) ;
QTest : : addColumn < QString > ( " expectfile " ) ;
QTest : : newRow ( " L " ) < < int ( Qt : : AlignLeft ) < < " halign_left " ;
QTest : : newRow ( " R " ) < < int ( Qt : : AlignRight ) < < " halign_right " ;
QTest : : newRow ( " C " ) < < int ( Qt : : AlignHCenter ) < < " halign_center " ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : horizontalAlignment ( )
2011-04-27 12:13:26 +00:00
{
2011-10-19 03:24:34 +00:00
QSKIP ( " Image comparison of text is almost guaranteed to fail during development " ) ;
2011-10-06 00:10:24 +00:00
2011-04-27 12:13:26 +00:00
QFETCH ( int , hAlign ) ;
QFETCH ( QString , expectfile ) ;
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " horizontalAlignment.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QObject * ob = canvas . rootObject ( ) ;
QVERIFY ( ob ! = 0 ) ;
ob - > setProperty ( " horizontalAlignment " , hAlign ) ;
2011-06-22 03:04:30 +00:00
QImage actual = canvas . grabFrameBuffer ( ) ;
2011-04-27 12:13:26 +00:00
expectfile = createExpectedFileIfNotFound ( expectfile , actual ) ;
QImage expect ( expectfile ) ;
QCOMPARE ( actual , expect ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : horizontalAlignment_RightToLeft ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " horizontalAlignment_RightToLeft.qml " ) ) ) ;
QQuickTextInput * textInput = canvas . rootObject ( ) - > findChild < QQuickTextInput * > ( " text " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInput ! = 0 ) ;
canvas . show ( ) ;
2011-05-20 04:22:39 +00:00
const QString rtlText = textInput - > text ( ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInputPrivate * textInputPrivate = QQuickTextInputPrivate : : get ( textInput ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInputPrivate ! = 0 ) ;
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
// implicit alignment should follow the reading direction of RTL text
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > effectiveHAlign ( ) , textInput - > hAlign ( ) ) ;
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
// explicitly left aligned
2011-10-14 08:51:42 +00:00
textInput - > setHAlign ( QQuickTextInput : : AlignLeft ) ;
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignLeft ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > effectiveHAlign ( ) , textInput - > hAlign ( ) ) ;
QVERIFY ( - textInputPrivate - > hscroll < canvas . width ( ) / 2 ) ;
// explicitly right aligned
2011-10-14 08:51:42 +00:00
textInput - > setHAlign ( QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > effectiveHAlign ( ) , textInput - > hAlign ( ) ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
// explicitly center aligned
2011-10-14 08:51:42 +00:00
textInput - > setHAlign ( QQuickTextInput : : AlignHCenter ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > effectiveHAlign ( ) , textInput - > hAlign ( ) ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignHCenter ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( - textInputPrivate - > hscroll < canvas . width ( ) / 2 ) ;
QVERIFY ( - textInputPrivate - > hscroll + textInputPrivate - > width > canvas . width ( ) / 2 ) ;
// reseted alignment should go back to following the text reading direction
textInput - > resetHAlign ( ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > effectiveHAlign ( ) , textInput - > hAlign ( ) ) ;
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
// mirror the text item
2011-10-14 08:51:42 +00:00
QQuickItemPrivate : : get ( textInput ) - > setLayoutMirror ( true ) ;
2011-04-27 12:13:26 +00:00
// mirrored implicit alignment should continue to follow the reading direction of the text
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > effectiveHAlign ( ) , textInput - > hAlign ( ) ) ;
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
// explicitly right aligned behaves as left aligned
2011-10-14 08:51:42 +00:00
textInput - > setHAlign ( QQuickTextInput : : AlignRight ) ;
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignRight ) ;
QCOMPARE ( textInput - > effectiveHAlign ( ) , QQuickTextInput : : AlignLeft ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( - textInputPrivate - > hscroll < canvas . width ( ) / 2 ) ;
// mirrored explicitly left aligned behaves as right aligned
2011-10-14 08:51:42 +00:00
textInput - > setHAlign ( QQuickTextInput : : AlignLeft ) ;
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignLeft ) ;
QCOMPARE ( textInput - > effectiveHAlign ( ) , QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
// disable mirroring
2011-10-14 08:51:42 +00:00
QQuickItemPrivate : : get ( textInput ) - > setLayoutMirror ( false ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > effectiveHAlign ( ) , textInput - > hAlign ( ) ) ;
textInput - > resetHAlign ( ) ;
// English text should be implicitly left aligned
textInput - > setText ( " Hello world! " ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignLeft ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( - textInputPrivate - > hscroll < canvas . width ( ) / 2 ) ;
2011-09-27 05:53:46 +00:00
canvas . requestActivateWindow ( ) ;
2011-05-20 04:22:39 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-05-20 04:22:39 +00:00
// If there is no commited text, the preedit text should determine the alignment.
textInput - > setText ( QString ( ) ) ;
2011-11-09 04:57:23 +00:00
{ QInputMethodEvent ev ( rtlText , QList < QInputMethodEvent : : Attribute > ( ) ) ; QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & ev ) ; }
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignRight ) ;
2011-11-09 04:57:23 +00:00
{ QInputMethodEvent ev ( " Hello world! " , QList < QInputMethodEvent : : Attribute > ( ) ) ; QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & ev ) ; }
2011-10-14 08:51:42 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignLeft ) ;
2011-05-20 04:22:39 +00:00
2011-11-09 04:57:23 +00:00
// Clear pre-edit text. TextInput should maybe do this itself on setText, but that may be
// redundant as an actual input method may take care of it.
{ QInputMethodEvent ev ; QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & ev ) ; }
2011-10-19 05:04:15 +00:00
# ifdef Q_OS_MAC
2011-04-27 12:13:26 +00:00
// empty text with implicit alignment follows the system locale-based
2011-09-27 05:53:46 +00:00
// keyboard input direction from QGuiApplication::keyboardInputDirection
2011-10-19 05:04:15 +00:00
QEXPECT_FAIL ( " " , " QTBUG-18040 " , Abort ) ;
# endif
2011-04-27 12:13:26 +00:00
textInput - > setText ( " " ) ;
2011-09-27 05:53:46 +00:00
QCOMPARE ( textInput - > hAlign ( ) , QGuiApplication : : keyboardInputDirection ( ) = = Qt : : LeftToRight ?
2011-10-14 08:51:42 +00:00
QQuickTextInput : : AlignLeft : QQuickTextInput : : AlignRight ) ;
2011-09-27 05:53:46 +00:00
if ( QGuiApplication : : keyboardInputDirection ( ) = = Qt : : LeftToRight )
2011-04-27 12:13:26 +00:00
QVERIFY ( - textInputPrivate - > hscroll < canvas . width ( ) / 2 ) ;
else
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
2011-10-14 08:51:42 +00:00
textInput - > setHAlign ( QQuickTextInput : : AlignRight ) ;
QCOMPARE ( textInput - > hAlign ( ) , QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( - textInputPrivate - > hscroll > canvas . width ( ) / 2 ) ;
2011-10-19 05:04:15 +00:00
# ifdef Q_OS_MAC
QEXPECT_FAIL ( " " , " QTBUG-18040 " , Abort ) ; // alignment of TextInput with no text set to it
# endif
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput {} " ;
QDeclarativeComponent textComponent ( & engine ) ;
textComponent . setData ( componentStr . toLatin1 ( ) , QUrl : : fromLocalFile ( " " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textObject = qobject_cast < QQuickTextInput * > ( textComponent . create ( ) ) ;
2011-09-27 05:53:46 +00:00
QCOMPARE ( textObject - > hAlign ( ) , QGuiApplication : : keyboardInputDirection ( ) = = Qt : : LeftToRight ?
2011-10-14 08:51:42 +00:00
QQuickTextInput : : AlignLeft : QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
delete textObject ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : positionAt ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " positionAt.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
// Check autoscrolled...
QFontMetrics fm ( textinputObject - > font ( ) ) ;
int pos = textinputObject - > positionAt ( textinputObject - > width ( ) / 2 ) ;
2011-06-01 07:45:55 +00:00
int textWidth = 0 ;
2011-11-09 03:26:36 +00:00
int textLeftWidthBegin = 0 ;
int textLeftWidthEnd = 0 ;
2011-06-01 07:45:55 +00:00
if ( ! qmlDisableDistanceField ( ) ) {
2011-11-09 03:26:36 +00:00
QTextLayout layout ( textinputObject - > text ( ) ) ;
2011-06-01 07:45:55 +00:00
2011-11-09 03:26:36 +00:00
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
2011-06-01 07:45:55 +00:00
2011-11-09 03:26:36 +00:00
layout . beginLayout ( ) ;
QTextLine line = layout . createLine ( ) ;
layout . endLayout ( ) ;
2011-06-01 07:45:55 +00:00
2011-11-09 03:26:36 +00:00
textLeftWidthBegin = floor ( line . cursorToX ( pos - 1 ) ) ;
textLeftWidthEnd = ceil ( line . cursorToX ( pos + 1 ) ) ;
textWidth = floor ( line . horizontalAdvance ( ) ) ;
2011-06-01 07:45:55 +00:00
} else {
textWidth = fm . width ( textinputObject - > text ( ) ) ;
2011-11-09 03:26:36 +00:00
textLeftWidthBegin = fm . width ( textinputObject - > text ( ) . left ( pos - 1 ) ) ;
textLeftWidthEnd = fm . width ( textinputObject - > text ( ) . left ( pos + 1 ) ) ;
2011-06-01 07:45:55 +00:00
}
2011-11-09 03:26:36 +00:00
QVERIFY ( textLeftWidthBegin < = textWidth - textinputObject - > width ( ) / 2 ) ;
QVERIFY ( textLeftWidthEnd > = textWidth - textinputObject - > width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
int x = textinputObject - > positionToRectangle ( pos + 1 ) . x ( ) - 1 ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textinputObject - > positionAt ( x , QQuickTextInput : : CursorBetweenCharacters ) , pos + 1 ) ;
QCOMPARE ( textinputObject - > positionAt ( x , QQuickTextInput : : CursorOnCharacter ) , pos ) ;
2011-04-27 12:13:26 +00:00
// Check without autoscroll...
textinputObject - > setAutoScroll ( false ) ;
pos = textinputObject - > positionAt ( textinputObject - > width ( ) / 2 ) ;
2011-06-01 07:45:55 +00:00
if ( ! qmlDisableDistanceField ( ) ) {
2011-11-09 03:26:36 +00:00
QTextLayout layout ( textinputObject - > text ( ) ) ;
2011-06-01 07:45:55 +00:00
2011-11-09 03:26:36 +00:00
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
2011-06-01 07:45:55 +00:00
2011-11-09 03:26:36 +00:00
layout . beginLayout ( ) ;
QTextLine line = layout . createLine ( ) ;
layout . endLayout ( ) ;
2011-06-01 07:45:55 +00:00
2011-11-09 03:26:36 +00:00
textLeftWidthBegin = floor ( line . cursorToX ( pos - 1 ) ) ;
textLeftWidthEnd = ceil ( line . cursorToX ( pos + 1 ) ) ;
2011-06-01 07:45:55 +00:00
} else {
2011-11-09 03:26:36 +00:00
textLeftWidthBegin = fm . width ( textinputObject - > text ( ) . left ( pos - 1 ) ) ;
textLeftWidthEnd = fm . width ( textinputObject - > text ( ) . left ( pos + 1 ) ) ;
2011-06-01 07:45:55 +00:00
}
2011-11-09 03:26:36 +00:00
QVERIFY ( textLeftWidthBegin < = textinputObject - > width ( ) / 2 ) ;
QVERIFY ( textLeftWidthEnd > = textinputObject - > width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
x = textinputObject - > positionToRectangle ( pos + 1 ) . x ( ) - 1 ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textinputObject - > positionAt ( x , QQuickTextInput : : CursorBetweenCharacters ) , pos + 1 ) ;
QCOMPARE ( textinputObject - > positionAt ( x , QQuickTextInput : : CursorOnCharacter ) , pos ) ;
2011-04-27 12:13:26 +00:00
const qreal x0 = textinputObject - > positionToRectangle ( pos ) . x ( ) ;
const qreal x1 = textinputObject - > positionToRectangle ( pos + 1 ) . x ( ) ;
QString preeditText = textinputObject - > text ( ) . mid ( 0 , pos ) ;
textinputObject - > setText ( textinputObject - > text ( ) . mid ( pos ) ) ;
textinputObject - > setCursorPosition ( 0 ) ;
QInputMethodEvent inputEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( ) ) ;
2011-11-09 03:26:36 +00:00
QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & inputEvent ) ;
2011-04-27 12:13:26 +00:00
// Check all points within the preedit text return the same position.
QCOMPARE ( textinputObject - > positionAt ( 0 ) , 0 ) ;
QCOMPARE ( textinputObject - > positionAt ( x0 / 2 ) , 0 ) ;
QCOMPARE ( textinputObject - > positionAt ( x0 ) , 0 ) ;
// Verify positioning returns to normal after the preedit text.
QCOMPARE ( textinputObject - > positionAt ( x1 ) , 1 ) ;
QCOMPARE ( textinputObject - > positionToRectangle ( 1 ) . x ( ) , x1 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : maxLength ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " maxLength.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QVERIFY ( textinputObject - > text ( ) . isEmpty ( ) ) ;
QVERIFY ( textinputObject - > maxLength ( ) = = 10 ) ;
2011-10-17 11:03:58 +00:00
foreach ( const QString & str , standard ) {
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject - > text ( ) . length ( ) < = 10 ) ;
textinputObject - > setText ( str ) ;
QVERIFY ( textinputObject - > text ( ) . length ( ) < = 10 ) ;
}
textinputObject - > setText ( " " ) ;
QTRY_VERIFY ( textinputObject - > hasActiveFocus ( ) = = true ) ;
2011-10-17 11:03:58 +00:00
for ( int i = 0 ; i < 20 ; i + + ) {
2011-09-29 02:31:30 +00:00
QTRY_COMPARE ( textinputObject - > text ( ) . length ( ) , qMin ( i , 10 ) ) ;
2011-04-27 12:13:26 +00:00
//simulateKey(&canvas, Qt::Key_A);
QTest : : keyPress ( & canvas , Qt : : Key_A ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
2011-04-27 12:13:26 +00:00
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : masks ( )
2011-04-27 12:13:26 +00:00
{
//Not a comprehensive test of the possible masks, that's done elsewhere (QLineEdit)
//QString componentStr = "import QtQuick 2.0\nTextInput { inputMask: 'HHHHhhhh'; }";
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " masks.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textinputObject = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textinputObject ! = 0 ) ;
QTRY_VERIFY ( textinputObject - > hasActiveFocus ( ) = = true ) ;
QVERIFY ( textinputObject - > text ( ) . length ( ) = = 0 ) ;
QCOMPARE ( textinputObject - > inputMask ( ) , QString ( " HHHHhhhh; " ) ) ;
2011-10-17 11:03:58 +00:00
for ( int i = 0 ; i < 10 ; i + + ) {
2011-09-29 02:31:30 +00:00
QTRY_COMPARE ( qMin ( i , 8 ) , textinputObject - > text ( ) . length ( ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( i > = 4 , textinputObject - > hasAcceptableInput ( ) ) ;
//simulateKey(&canvas, Qt::Key_A);
QTest : : keyPress ( & canvas , Qt : : Key_A ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
2011-04-27 12:13:26 +00:00
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : validators ( )
2011-04-27 12:13:26 +00:00
{
// Note that this test assumes that the validators are working properly
// so you may need to run their tests first. All validators are checked
// here to ensure that their exposure to QML is working.
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " validators.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * intInput = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " intInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( intInput ) ;
intInput - > setFocus ( true ) ;
QTRY_VERIFY ( intInput - > hasActiveFocus ( ) ) ;
QTest : : keyPress ( & canvas , Qt : : Key_1 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_1 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( intInput - > text ( ) , QLatin1String ( " 1 " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( intInput - > hasAcceptableInput ( ) , false ) ;
QTest : : keyPress ( & canvas , Qt : : Key_2 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_2 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( intInput - > text ( ) , QLatin1String ( " 1 " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( intInput - > hasAcceptableInput ( ) , false ) ;
QTest : : keyPress ( & canvas , Qt : : Key_1 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_1 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( intInput - > text ( ) , QLatin1String ( " 11 " ) ) ;
QCOMPARE ( intInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_0 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_0 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( intInput - > text ( ) , QLatin1String ( " 11 " ) ) ;
QCOMPARE ( intInput - > hasAcceptableInput ( ) , true ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * dblInput = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " dblInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QTRY_VERIFY ( dblInput ) ;
dblInput - > setFocus ( true ) ;
QVERIFY ( dblInput - > hasActiveFocus ( ) = = true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_1 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_1 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( dblInput - > text ( ) , QLatin1String ( " 1 " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( dblInput - > hasAcceptableInput ( ) , false ) ;
QTest : : keyPress ( & canvas , Qt : : Key_2 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_2 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( dblInput - > text ( ) , QLatin1String ( " 12 " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( dblInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_Period ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_Period , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( dblInput - > text ( ) , QLatin1String ( " 12. " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( dblInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_1 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_1 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( dblInput - > text ( ) , QLatin1String ( " 12.1 " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( dblInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_1 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_1 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( dblInput - > text ( ) , QLatin1String ( " 12.11 " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( dblInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_1 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_1 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( dblInput - > text ( ) , QLatin1String ( " 12.11 " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( dblInput - > hasAcceptableInput ( ) , true ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * strInput = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " strInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QTRY_VERIFY ( strInput ) ;
strInput - > setFocus ( true ) ;
QVERIFY ( strInput - > hasActiveFocus ( ) = = true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_1 ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_1 , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( strInput - > text ( ) , QLatin1String ( " " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( strInput - > hasAcceptableInput ( ) , false ) ;
QTest : : keyPress ( & canvas , Qt : : Key_A ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( strInput - > text ( ) , QLatin1String ( " a " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( strInput - > hasAcceptableInput ( ) , false ) ;
QTest : : keyPress ( & canvas , Qt : : Key_A ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( strInput - > text ( ) , QLatin1String ( " aa " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( strInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_A ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( strInput - > text ( ) , QLatin1String ( " aaa " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( strInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_A ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( strInput - > text ( ) , QLatin1String ( " aaaa " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( strInput - > hasAcceptableInput ( ) , true ) ;
QTest : : keyPress ( & canvas , Qt : : Key_A ) ;
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( strInput - > text ( ) , QLatin1String ( " aaaa " ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( strInput - > hasAcceptableInput ( ) , true ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : inputMethods ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " inputmethods.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
// test input method hints
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
QVERIFY ( input - > inputMethodHints ( ) & Qt : : ImhNoPredictiveText ) ;
input - > setInputMethodHints ( Qt : : ImhUppercaseOnly ) ;
QVERIFY ( input - > inputMethodHints ( ) & Qt : : ImhUppercaseOnly ) ;
input - > setFocus ( true ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
// test that input method event is committed
QInputMethodEvent event ;
event . setCommitString ( " My " , - 12 , 0 ) ;
2011-11-09 01:33:12 +00:00
QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > text ( ) , QString ( " My Hello world! " ) ) ;
input - > setCursorPosition ( 2 ) ;
event . setCommitString ( " Your " , - 2 , 2 ) ;
2011-11-09 01:33:12 +00:00
QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > text ( ) , QString ( " Your Hello world! " ) ) ;
QCOMPARE ( input - > cursorPosition ( ) , 4 ) ;
input - > setCursorPosition ( 7 ) ;
event . setCommitString ( " Goodbye " , - 2 , 5 ) ;
2011-11-09 01:33:12 +00:00
QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > text ( ) , QString ( " Your Goodbye world! " ) ) ;
QCOMPARE ( input - > cursorPosition ( ) , 12 ) ;
input - > setCursorPosition ( 8 ) ;
event . setCommitString ( " Our " , - 8 , 4 ) ;
2011-11-09 01:33:12 +00:00
QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > text ( ) , QString ( " Our Goodbye world! " ) ) ;
QCOMPARE ( input - > cursorPosition ( ) , 7 ) ;
2011-11-15 16:17:29 +00:00
// test that basic tentative commit gets to text property on preedit state
input - > setText ( " " ) ;
QList < QInputMethodEvent : : Attribute > attributes ;
QInputMethodEvent preeditEvent ( " test " , attributes ) ;
preeditEvent . setTentativeCommitString ( " test " ) ;
QApplication : : sendEvent ( input , & preeditEvent ) ;
QCOMPARE ( input - > text ( ) , QString ( " test " ) ) ;
// tentative commit not allowed present in surrounding text
QInputMethodQueryEvent queryEvent ( Qt : : ImSurroundingText ) ;
QApplication : : sendEvent ( input , & queryEvent ) ;
QCOMPARE ( queryEvent . value ( Qt : : ImSurroundingText ) . toString ( ) , QString ( " " ) ) ;
// if text with tentative commit does not validate, not allowed to be part of text property
input - > setText ( " " ) ; // ensure input state is reset
QValidator * validator = new QIntValidator ( 0 , 100 ) ;
input - > setValidator ( validator ) ;
QApplication : : sendEvent ( input , & preeditEvent ) ;
QCOMPARE ( input - > text ( ) , QString ( " " ) ) ;
input - > setValidator ( 0 ) ;
delete validator ;
2011-04-27 12:13:26 +00:00
}
/*
TextInput element should only handle left / right keys until the cursor reaches
the extent of the text , then they should ignore the keys .
*/
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : navigation ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " navigation.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
input - > setCursorPosition ( 0 ) ;
QTRY_VERIFY ( input - > hasActiveFocus ( ) = = true ) ;
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
//QT-2944: If text is selected, ensure we deselect upon cursor motion
input - > setCursorPosition ( input - > text ( ) . length ( ) ) ;
input - > select ( 0 , input - > text ( ) . length ( ) ) ;
QVERIFY ( input - > selectionStart ( ) ! = input - > selectionEnd ( ) ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > selectionStart ( ) = = input - > selectionEnd ( ) ) ;
QVERIFY ( input - > selectionStart ( ) = = input - > text ( ) . length ( ) ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
// Up and Down should NOT do Home/End, even on Mac OS X (QTBUG-10438).
input - > setCursorPosition ( 2 ) ;
QCOMPARE ( input - > cursorPosition ( ) , 2 ) ;
simulateKey ( & canvas , Qt : : Key_Up ) ;
QCOMPARE ( input - > cursorPosition ( ) , 2 ) ;
simulateKey ( & canvas , Qt : : Key_Down ) ;
QCOMPARE ( input - > cursorPosition ( ) , 2 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : navigation_RTL ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " navigation.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
const quint16 arabic_str [ ] = { 0x0638 , 0x0643 , 0x00646 , 0x0647 , 0x0633 , 0x0638 , 0x0643 , 0x00646 , 0x0647 , 0x0633 , 0x0647 } ;
input - > setText ( QString : : fromUtf16 ( arabic_str , 11 ) ) ;
input - > setCursorPosition ( 0 ) ;
QTRY_VERIFY ( input - > hasActiveFocus ( ) = = true ) ;
// move off
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
// move back
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
input - > setCursorPosition ( input - > text ( ) . length ( ) ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
// move off
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
// move back
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : copyAndPaste ( ) {
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2011-10-19 05:04:15 +00:00
# ifdef Q_OS_MAC
2011-04-27 12:13:26 +00:00
{
PasteboardRef pasteboard ;
OSStatus status = PasteboardCreate ( 0 , & pasteboard ) ;
if ( status = = noErr )
CFRelease ( pasteboard ) ;
else
2011-10-19 03:24:34 +00:00
QSKIP ( " This machine doesn't support the clipboard " ) ;
2011-04-27 12:13:26 +00:00
}
# endif
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" Hello world! \" } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInput ! = 0 ) ;
// copy and paste
QCOMPARE ( textInput - > text ( ) . length ( ) , 12 ) ;
textInput - > select ( 0 , textInput - > text ( ) . length ( ) ) ; ;
textInput - > copy ( ) ;
QCOMPARE ( textInput - > selectedText ( ) , QString ( " Hello world! " ) ) ;
QCOMPARE ( textInput - > selectedText ( ) . length ( ) , 12 ) ;
textInput - > setCursorPosition ( 0 ) ;
QVERIFY ( textInput - > canPaste ( ) ) ;
textInput - > paste ( ) ;
QCOMPARE ( textInput - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
QCOMPARE ( textInput - > text ( ) . length ( ) , 24 ) ;
// can paste
QVERIFY ( textInput - > canPaste ( ) ) ;
textInput - > setReadOnly ( true ) ;
QVERIFY ( ! textInput - > canPaste ( ) ) ;
textInput - > setReadOnly ( false ) ;
QVERIFY ( textInput - > canPaste ( ) ) ;
// select word
textInput - > setCursorPosition ( 0 ) ;
textInput - > selectWord ( ) ;
QCOMPARE ( textInput - > selectedText ( ) , QString ( " Hello " ) ) ;
// select all and cut
textInput - > selectAll ( ) ;
textInput - > cut ( ) ;
QCOMPARE ( textInput - > text ( ) . length ( ) , 0 ) ;
textInput - > paste ( ) ;
QCOMPARE ( textInput - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
QCOMPARE ( textInput - > text ( ) . length ( ) , 24 ) ;
// clear copy buffer
2011-09-27 05:53:46 +00:00
QClipboard * clipboard = QGuiApplication : : clipboard ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( clipboard ) ;
clipboard - > clear ( ) ;
QVERIFY ( ! textInput - > canPaste ( ) ) ;
// test that copy functionality is disabled
// when echo mode is set to hide text/password mode
int index = 0 ;
while ( index < 4 ) {
2011-10-14 08:51:42 +00:00
QQuickTextInput : : EchoMode echoMode = QQuickTextInput : : EchoMode ( index ) ;
2011-04-27 12:13:26 +00:00
textInput - > setEchoMode ( echoMode ) ;
textInput - > setText ( " My password " ) ;
textInput - > select ( 0 , textInput - > text ( ) . length ( ) ) ; ;
textInput - > copy ( ) ;
2011-10-14 08:51:42 +00:00
if ( echoMode = = QQuickTextInput : : Normal ) {
2011-04-27 12:13:26 +00:00
QVERIFY ( ! clipboard - > text ( ) . isEmpty ( ) ) ;
QCOMPARE ( clipboard - > text ( ) , QString ( " My password " ) ) ;
clipboard - > clear ( ) ;
} else {
QVERIFY ( clipboard - > text ( ) . isEmpty ( ) ) ;
}
index + + ;
}
delete textInput ;
# endif
}
2011-11-14 01:03:05 +00:00
void tst_qquicktextinput : : copyAndPasteKeySequence ( ) {
# ifndef QT_NO_CLIPBOARD
# ifdef Q_OS_MAC
{
PasteboardRef pasteboard ;
OSStatus status = PasteboardCreate ( 0 , & pasteboard ) ;
if ( status = = noErr )
CFRelease ( pasteboard ) ;
else
QSKIP ( " This machine doesn't support the clipboard " ) ;
}
# endif
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" Hello world! \" ; focus: true } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
QVERIFY ( textInput ! = 0 ) ;
QQuickCanvas canvas ;
textInput - > setParentItem ( canvas . rootItem ( ) ) ;
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
QTRY_COMPARE ( QGuiApplication : : activeWindow ( ) , & canvas ) ;
// copy and paste
QVERIFY ( textInput - > hasActiveFocus ( ) ) ;
QCOMPARE ( textInput - > text ( ) . length ( ) , 12 ) ;
textInput - > select ( 0 , textInput - > text ( ) . length ( ) ) ;
simulateKeys ( & canvas , QKeySequence : : Copy ) ;
QCOMPARE ( textInput - > selectedText ( ) , QString ( " Hello world! " ) ) ;
QCOMPARE ( textInput - > selectedText ( ) . length ( ) , 12 ) ;
textInput - > setCursorPosition ( 0 ) ;
QVERIFY ( textInput - > canPaste ( ) ) ;
simulateKeys ( & canvas , QKeySequence : : Paste ) ;
QCOMPARE ( textInput - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
QCOMPARE ( textInput - > text ( ) . length ( ) , 24 ) ;
// select all and cut
simulateKeys ( & canvas , QKeySequence : : SelectAll ) ;
simulateKeys ( & canvas , QKeySequence : : Cut ) ;
QCOMPARE ( textInput - > text ( ) . length ( ) , 0 ) ;
simulateKeys ( & canvas , QKeySequence : : Paste ) ;
QCOMPARE ( textInput - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
QCOMPARE ( textInput - > text ( ) . length ( ) , 24 ) ;
// clear copy buffer
QClipboard * clipboard = QGuiApplication : : clipboard ( ) ;
QVERIFY ( clipboard ) ;
clipboard - > clear ( ) ;
QVERIFY ( ! textInput - > canPaste ( ) ) ;
// test that copy functionality is disabled
// when echo mode is set to hide text/password mode
int index = 0 ;
while ( index < 4 ) {
QQuickTextInput : : EchoMode echoMode = QQuickTextInput : : EchoMode ( index ) ;
textInput - > setEchoMode ( echoMode ) ;
textInput - > setText ( " My password " ) ;
textInput - > select ( 0 , textInput - > text ( ) . length ( ) ) ; ;
simulateKeys ( & canvas , QKeySequence : : Copy ) ;
if ( echoMode = = QQuickTextInput : : Normal ) {
QVERIFY ( ! clipboard - > text ( ) . isEmpty ( ) ) ;
QCOMPARE ( clipboard - > text ( ) , QString ( " My password " ) ) ;
clipboard - > clear ( ) ;
} else {
QVERIFY ( clipboard - > text ( ) . isEmpty ( ) ) ;
}
index + + ;
}
delete textInput ;
# endif
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : canPasteEmpty ( ) {
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2011-09-27 05:53:46 +00:00
QGuiApplication : : clipboard ( ) - > clear ( ) ;
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" Hello world! \" } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInput ! = 0 ) ;
QLineControl lc ;
2011-09-27 05:53:46 +00:00
bool cp = ! lc . isReadOnly ( ) & & QGuiApplication : : clipboard ( ) - > text ( ) . length ( ) ! = 0 ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > canPaste ( ) , cp ) ;
# endif
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : canPaste ( ) {
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2011-09-27 05:53:46 +00:00
QGuiApplication : : clipboard ( ) - > setText ( " Some text " ) ;
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" Hello world! \" } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInput ! = 0 ) ;
QLineControl lc ;
2011-09-27 05:53:46 +00:00
bool cp = ! lc . isReadOnly ( ) & & QGuiApplication : : clipboard ( ) - > text ( ) . length ( ) ! = 0 ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textInput - > canPaste ( ) , cp ) ;
# endif
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : passwordCharacter ( )
2011-04-27 12:13:26 +00:00
{
QString componentStr = " import QtQuick 2.0 \n TextInput { text: \" Hello world! \" ; font.family: \" Helvetica \" ; echoMode: TextInput.Password } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInput ! = 0 ) ;
textInput - > setPasswordCharacter ( " X " ) ;
qreal implicitWidth = textInput - > implicitWidth ( ) ;
textInput - > setPasswordCharacter ( " . " ) ;
// QTBUG-12383 content is updated and redrawn
QVERIFY ( textInput - > implicitWidth ( ) < implicitWidth ) ;
delete textInput ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : cursorDelegate ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " cursorTest.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * textInputObject = view . rootObject ( ) - > findChild < QQuickTextInput * > ( " textInputObject " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textInputObject ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QVERIFY ( textInputObject - > findChild < QQuickItem * > ( " cursorInstance " ) ) ;
2011-04-27 12:13:26 +00:00
//Test Delegate gets created
textInputObject - > setFocus ( true ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * delegateObject = textInputObject - > findChild < QQuickItem * > ( " cursorInstance " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( delegateObject ) ;
2011-09-30 07:17:49 +00:00
QCOMPARE ( delegateObject - > property ( " localProperty " ) . toString ( ) , QString ( " Hello " ) ) ;
2011-04-27 12:13:26 +00:00
//Test Delegate gets moved
2011-10-17 11:03:58 +00:00
for ( int i = 0 ; i < = textInputObject - > text ( ) . length ( ) ; i + + ) {
2011-04-27 12:13:26 +00:00
textInputObject - > setCursorPosition ( i ) ;
QCOMPARE ( textInputObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
QCOMPARE ( textInputObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
}
textInputObject - > setCursorPosition ( 0 ) ;
QCOMPARE ( textInputObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
QCOMPARE ( textInputObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
//Test Delegate gets deleted
textInputObject - > setCursorDelegate ( 0 ) ;
2011-10-14 08:51:42 +00:00
QVERIFY ( ! textInputObject - > findChild < QQuickItem * > ( " cursorInstance " ) ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : cursorVisible ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " cursorVisible.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickTextInput input ;
2011-04-27 12:13:26 +00:00
QSignalSpy spy ( & input , SIGNAL ( cursorVisibleChanged ( bool ) ) ) ;
QCOMPARE ( input . isCursorVisible ( ) , false ) ;
input . setCursorVisible ( true ) ;
QCOMPARE ( input . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
input . setCursorVisible ( false ) ;
QCOMPARE ( input . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
input . setFocus ( true ) ;
QCOMPARE ( input . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
input . setParentItem ( view . rootObject ( ) ) ;
QCOMPARE ( input . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 3 ) ;
input . setFocus ( false ) ;
QCOMPARE ( input . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 4 ) ;
input . setFocus ( true ) ;
QCOMPARE ( input . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 5 ) ;
2011-10-24 03:57:12 +00:00
QQuickView alternateView ;
alternateView . show ( ) ;
alternateView . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & alternateView ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 6 ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-10-24 03:57:12 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 7 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : cursorRectangle ( )
2011-04-27 12:13:26 +00:00
{
2011-10-19 03:24:34 +00:00
QSKIP ( " QTBUG-21689 " ) ;
2011-09-27 05:53:46 +00:00
2011-04-27 12:13:26 +00:00
QString text = " Hello World! " ;
2011-10-14 08:51:42 +00:00
QQuickTextInput input ;
2011-04-27 12:13:26 +00:00
input . setText ( text ) ;
QFontMetricsF fm ( input . font ( ) ) ;
input . setWidth ( fm . width ( text . mid ( 0 , 5 ) ) ) ;
QRect r ;
// some tolerance for different fonts.
# ifdef Q_OS_LINUX
const int error = 2 ;
# else
const int error = 5 ;
# endif
for ( int i = 0 ; i < = 5 ; + + i ) {
input . setCursorPosition ( i ) ;
r = input . cursorRectangle ( ) ;
int textWidth = fm . width ( text . mid ( 0 , i ) ) ;
QVERIFY ( r . left ( ) < textWidth + error ) ;
QVERIFY ( r . right ( ) > textWidth - error ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( input . inputMethodQuery ( Qt : : ImCursorRectangle ) . toRect ( ) , r ) ;
2011-04-27 12:13:26 +00:00
}
// Check the cursor rectangle remains within the input bounding rect when auto scrolling.
QVERIFY ( r . left ( ) < input . boundingRect ( ) . width ( ) ) ;
2011-06-22 03:04:30 +00:00
QVERIFY ( r . right ( ) > = input . width ( ) - error ) ;
2011-04-27 12:13:26 +00:00
for ( int i = 6 ; i < text . length ( ) ; + + i ) {
input . setCursorPosition ( i ) ;
QCOMPARE ( r , input . cursorRectangle ( ) ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( input . inputMethodQuery ( Qt : : ImCursorRectangle ) . toRect ( ) , r ) ;
2011-04-27 12:13:26 +00:00
}
for ( int i = text . length ( ) - 2 ; i > = 0 ; - - i ) {
input . setCursorPosition ( i ) ;
r = input . cursorRectangle ( ) ;
QVERIFY ( r . right ( ) > = 0 ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( input . inputMethodQuery ( Qt : : ImCursorRectangle ) . toRect ( ) , r ) ;
2011-04-27 12:13:26 +00:00
}
2011-07-27 04:23:14 +00:00
input . setText ( " Hi! " ) ;
2011-10-14 08:51:42 +00:00
input . setHAlign ( QQuickTextInput : : AlignRight ) ;
2011-07-27 04:23:14 +00:00
r = input . cursorRectangle ( ) ;
QVERIFY ( r . left ( ) < input . boundingRect ( ) . width ( ) ) ;
QVERIFY ( r . right ( ) > = input . width ( ) - error ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : readOnly ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " readOnly.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
QTRY_VERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QVERIFY ( input - > isReadOnly ( ) = = true ) ;
QString initial = input - > text ( ) ;
2011-10-17 11:03:58 +00:00
for ( int k = Qt : : Key_0 ; k < = Qt : : Key_Z ; k + + )
2011-04-27 12:13:26 +00:00
simulateKey ( & canvas , k ) ;
simulateKey ( & canvas , Qt : : Key_Return ) ;
simulateKey ( & canvas , Qt : : Key_Space ) ;
simulateKey ( & canvas , Qt : : Key_Escape ) ;
QCOMPARE ( input - > text ( ) , initial ) ;
2011-07-26 00:10:50 +00:00
input - > setCursorPosition ( 3 ) ;
input - > setReadOnly ( false ) ;
QCOMPARE ( input - > isReadOnly ( ) , false ) ;
QCOMPARE ( input - > cursorPosition ( ) , input - > text ( ) . length ( ) ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : echoMode ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " echoMode.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
QTRY_VERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QString initial = input - > text ( ) ;
Qt : : InputMethodHints ref ;
QCOMPARE ( initial , QLatin1String ( " ABCDefgh " ) ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( input - > echoMode ( ) , QQuickTextInput : : Normal ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > displayText ( ) , input - > text ( ) ) ;
//Normal
ref & = ~ Qt : : ImhHiddenText ;
ref & = ~ ( Qt : : ImhNoAutoUppercase | Qt : : ImhNoPredictiveText ) ;
QCOMPARE ( input - > inputMethodHints ( ) , ref ) ;
2011-10-14 08:51:42 +00:00
input - > setEchoMode ( QQuickTextInput : : NoEcho ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > text ( ) , initial ) ;
QCOMPARE ( input - > displayText ( ) , QLatin1String ( " " ) ) ;
QCOMPARE ( input - > passwordCharacter ( ) , QLatin1String ( " * " ) ) ;
//NoEcho
ref | = Qt : : ImhHiddenText ;
ref | = ( Qt : : ImhNoAutoUppercase | Qt : : ImhNoPredictiveText ) ;
QCOMPARE ( input - > inputMethodHints ( ) , ref ) ;
2011-10-14 08:51:42 +00:00
input - > setEchoMode ( QQuickTextInput : : Password ) ;
2011-04-27 12:13:26 +00:00
//Password
ref | = Qt : : ImhHiddenText ;
ref | = ( Qt : : ImhNoAutoUppercase | Qt : : ImhNoPredictiveText ) ;
QCOMPARE ( input - > text ( ) , initial ) ;
QCOMPARE ( input - > displayText ( ) , QLatin1String ( " ******** " ) ) ;
QCOMPARE ( input - > inputMethodHints ( ) , ref ) ;
input - > setPasswordCharacter ( QChar ( ' Q ' ) ) ;
QCOMPARE ( input - > passwordCharacter ( ) , QLatin1String ( " Q " ) ) ;
QCOMPARE ( input - > text ( ) , initial ) ;
QCOMPARE ( input - > displayText ( ) , QLatin1String ( " QQQQQQQQ " ) ) ;
2011-10-14 08:51:42 +00:00
input - > setEchoMode ( QQuickTextInput : : PasswordEchoOnEdit ) ;
2011-04-27 12:13:26 +00:00
//PasswordEchoOnEdit
ref & = ~ Qt : : ImhHiddenText ;
ref | = ( Qt : : ImhNoAutoUppercase | Qt : : ImhNoPredictiveText ) ;
QCOMPARE ( input - > inputMethodHints ( ) , ref ) ;
QCOMPARE ( input - > text ( ) , initial ) ;
QCOMPARE ( input - > displayText ( ) , QLatin1String ( " QQQQQQQQ " ) ) ;
QCOMPARE ( input - > inputMethodQuery ( Qt : : ImSurroundingText ) . toString ( ) , QLatin1String ( " QQQQQQQQ " ) ) ;
QTest : : keyPress ( & canvas , Qt : : Key_A ) ; //Clearing previous entry is part of PasswordEchoOnEdit
QTest : : keyRelease ( & canvas , Qt : : Key_A , Qt : : NoModifier , 10 ) ;
QCOMPARE ( input - > text ( ) , QLatin1String ( " a " ) ) ;
QCOMPARE ( input - > displayText ( ) , QLatin1String ( " a " ) ) ;
QCOMPARE ( input - > inputMethodQuery ( Qt : : ImSurroundingText ) . toString ( ) , QLatin1String ( " a " ) ) ;
input - > setFocus ( false ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
QCOMPARE ( input - > displayText ( ) , QLatin1String ( " Q " ) ) ;
QCOMPARE ( input - > inputMethodQuery ( Qt : : ImSurroundingText ) . toString ( ) , QLatin1String ( " Q " ) ) ;
input - > setFocus ( true ) ;
2011-10-12 03:02:39 +00:00
QVERIFY ( input - > hasActiveFocus ( ) ) ;
2011-04-27 12:13:26 +00:00
QInputMethodEvent inputEvent ;
inputEvent . setCommitString ( initial ) ;
2011-10-12 03:02:39 +00:00
QGuiApplication : : sendEvent ( input , & inputEvent ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > text ( ) , initial ) ;
QCOMPARE ( input - > displayText ( ) , initial ) ;
QCOMPARE ( input - > inputMethodQuery ( Qt : : ImSurroundingText ) . toString ( ) , initial ) ;
}
2011-07-19 05:15:58 +00:00
# ifdef QT_GUI_PASSWORD_ECHO_DELAY
void tst_qdeclarativetextinput : : passwordEchoDelay ( )
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " echoMode.qml " ) ) ) ;
2011-07-19 05:15:58 +00:00
canvas . show ( ) ;
canvas . setFocus ( ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : setActiveWindow ( & canvas ) ;
2011-07-19 05:15:58 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-07-19 05:15:58 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-07-19 05:15:58 +00:00
QChar fillChar = QLatin1Char ( ' * ' ) ;
input - > setEchoMode ( QDeclarativeTextInput : : Password ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 8 , fillChar ) ) ;
input - > setText ( QString ( ) ) ;
QCOMPARE ( input - > displayText ( ) , QString ( ) ) ;
QTest : : keyPress ( & canvas , ' 0 ' ) ;
QTest : : keyPress ( & canvas , ' 1 ' ) ;
QTest : : keyPress ( & canvas , ' 2 ' ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 2 , fillChar ) + QLatin1Char ( ' 2 ' ) ) ;
QTest : : keyPress ( & canvas , ' 3 ' ) ;
QTest : : keyPress ( & canvas , ' 4 ' ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 4 , fillChar ) + QLatin1Char ( ' 4 ' ) ) ;
QTest : : keyPress ( & canvas , Qt : : Key_Backspace ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 4 , fillChar ) ) ;
QTest : : keyPress ( & canvas , ' 4 ' ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 4 , fillChar ) + QLatin1Char ( ' 4 ' ) ) ;
QTest : : qWait ( QT_GUI_PASSWORD_ECHO_DELAY ) ;
QTRY_COMPARE ( input - > displayText ( ) , QString ( 5 , fillChar ) ) ;
QTest : : keyPress ( & canvas , ' 5 ' ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 5 , fillChar ) + QLatin1Char ( ' 5 ' ) ) ;
input - > setFocus ( false ) ;
QVERIFY ( ! input - > hasFocus ( ) ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 6 , fillChar ) ) ;
input - > setFocus ( true ) ;
QTRY_VERIFY ( input - > hasFocus ( ) ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 6 , fillChar ) ) ;
QTest : : keyPress ( & canvas , ' 6 ' ) ;
QCOMPARE ( input - > displayText ( ) , QString ( 6 , fillChar ) + QLatin1Char ( ' 6 ' ) ) ;
QInputMethodEvent ev ;
ev . setCommitString ( QLatin1String ( " 7 " ) ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : sendEvent ( & canvas , & ev ) ;
2011-07-19 05:15:58 +00:00
QCOMPARE ( input - > displayText ( ) , QString ( 7 , fillChar ) + QLatin1Char ( ' 7 ' ) ) ;
}
# endif
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : simulateKey ( QQuickView * view , int key )
2011-04-27 12:13:26 +00:00
{
QKeyEvent press ( QKeyEvent : : KeyPress , key , 0 ) ;
QKeyEvent release ( QKeyEvent : : KeyRelease , key , 0 ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : sendEvent ( view , & press ) ;
QGuiApplication : : sendEvent ( view , & release ) ;
2011-04-27 12:13:26 +00:00
}
2011-11-21 14:50:06 +00:00
class PlatformInputContext : public QPlatformInputContext
{
public :
PlatformInputContext ( ) : m_visible ( false ) { }
virtual void showInputPanel ( )
{
m_visible = true ;
}
virtual void hideInputPanel ( )
{
m_visible = false ;
}
virtual bool isInputPanelVisible ( ) const
{
return m_visible ;
}
bool m_visible ;
} ;
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : openInputPanel ( )
2011-04-27 12:13:26 +00:00
{
2011-11-21 14:50:06 +00:00
PlatformInputContext platformInputContext ;
QInputPanelPrivate * inputPanelPrivate = QInputPanelPrivate : : get ( qApp - > inputPanel ( ) ) ;
inputPanelPrivate - > testContext = & platformInputContext ;
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " openInputPanel.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-28 13:56:36 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ) ;
2011-09-28 13:56:36 +00:00
// check default values
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > focusOnPress ( ) ) ;
2011-09-28 13:56:36 +00:00
QVERIFY ( ! input - > hasActiveFocus ( ) ) ;
qDebug ( ) < < & input < < qApp - > inputPanel ( ) - > inputItem ( ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , static_cast < QObject * > ( 0 ) ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
// input panel should open on focus
QPoint centerPoint ( view . width ( ) / 2 , view . height ( ) / 2 ) ;
Qt : : KeyboardModifiers noModifiers = 0 ;
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : processEvents ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , input ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should be re-opened when pressing already focused TextInput
qApp - > inputPanel ( ) - > hide ( ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) ) ;
2011-09-28 13:56:36 +00:00
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : processEvents ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should stay visible if focus is lost to another text inputor
QSignalSpy inputPanelVisibilitySpy ( qApp - > inputPanel ( ) , SIGNAL ( visibleChanged ( ) ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput anotherInput ;
2011-09-28 13:56:36 +00:00
anotherInput . setParentItem ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
anotherInput . setFocus ( true ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , qobject_cast < QObject * > ( & anotherInput ) ) ;
QCOMPARE ( inputPanelVisibilitySpy . count ( ) , 0 ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
anotherInput . setFocus ( false ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , static_cast < QObject * > ( 0 ) ) ;
QCOMPARE ( view . activeFocusItem ( ) , view . rootItem ( ) ) ;
anotherInput . setFocus ( true ) ;
// input item should be null if focus is lost to an item that doesn't accept inputs
2011-10-14 08:51:42 +00:00
QQuickItem item ;
2011-09-28 13:56:36 +00:00
item . setParentItem ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
item . setFocus ( true ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , static_cast < QObject * > ( 0 ) ) ;
QCOMPARE ( view . activeFocusItem ( ) , & item ) ;
qApp - > inputPanel ( ) - > hide ( ) ;
// input panel should not be opened if TextInput is read only
input - > setReadOnly ( true ) ;
input - > setFocus ( true ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : processEvents ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should not be opened if focusOnPress is set to false
2011-04-27 12:13:26 +00:00
input - > setFocusOnPress ( false ) ;
input - > setFocus ( false ) ;
input - > setFocus ( true ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should open when openSoftwareInputPanel is called
2011-04-27 12:13:26 +00:00
input - > openSoftwareInputPanel ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should close when closeSoftwareInputPanel is called
2011-04-27 12:13:26 +00:00
input - > closeSoftwareInputPanel ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
2011-11-21 14:50:06 +00:00
inputPanelPrivate - > testContext = 0 ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
class MyTextInput : public QQuickTextInput
2011-04-27 12:13:26 +00:00
{
public :
2011-10-14 08:51:42 +00:00
MyTextInput ( QQuickItem * parent = 0 ) : QQuickTextInput ( parent )
2011-04-27 12:13:26 +00:00
{
nbPaint = 0 ;
}
2011-05-27 01:30:17 +00:00
virtual QSGNode * updatePaintNode ( QSGNode * node , UpdatePaintNodeData * data )
2011-04-27 12:13:26 +00:00
{
nbPaint + + ;
2011-10-14 08:51:42 +00:00
return QQuickTextInput : : updatePaintNode ( node , data ) ;
2011-04-27 12:13:26 +00:00
}
int nbPaint ;
} ;
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : setHAlignClearCache ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView view ;
2011-04-27 12:13:26 +00:00
MyTextInput input ;
input . setText ( " Hello world " ) ;
input . setParentItem ( view . rootItem ( ) ) ;
view . show ( ) ;
2011-09-27 05:53:46 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
QTRY_COMPARE ( input . nbPaint , 1 ) ;
2011-10-14 08:51:42 +00:00
input . setHAlign ( QQuickTextInput : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
//Changing the alignment should trigger a repaint
2011-05-19 07:24:07 +00:00
QTRY_COMPARE ( input . nbPaint , 2 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : focusOutClearSelection ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView view ;
QQuickTextInput input ;
QQuickTextInput input2 ;
2011-04-27 12:13:26 +00:00
input . setText ( QLatin1String ( " Hello world " ) ) ;
input . setFocus ( true ) ;
input2 . setParentItem ( view . rootItem ( ) ) ;
input . setParentItem ( view . rootItem ( ) ) ;
view . show ( ) ;
2011-09-27 05:53:46 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
input . select ( 2 , 5 ) ;
//The selection should work
QTRY_COMPARE ( input . selectedText ( ) , QLatin1String ( " llo " ) ) ;
input2 . setFocus ( true ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : processEvents ( ) ;
2011-04-27 12:13:26 +00:00
//The input lost the focus selection should be cleared
QTRY_COMPARE ( input . selectedText ( ) , QLatin1String ( " " ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : geometrySignals ( )
2011-04-27 12:13:26 +00:00
{
2011-10-12 03:46:02 +00:00
QDeclarativeComponent component ( & engine , TESTDATA ( " geometrySignals.qml " ) ) ;
2011-04-27 12:13:26 +00:00
QObject * o = component . create ( ) ;
QVERIFY ( o ) ;
QCOMPARE ( o - > property ( " bindingWidth " ) . toInt ( ) , 400 ) ;
QCOMPARE ( o - > property ( " bindingHeight " ) . toInt ( ) , 500 ) ;
delete o ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : testQtQuick11Attributes ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , code ) ;
QFETCH ( QString , warning ) ;
QFETCH ( QString , error ) ;
QDeclarativeEngine engine ;
QObject * obj ;
QDeclarativeComponent valid ( & engine ) ;
valid . setData ( " import QtQuick 2.0; TextInput { " + code . toUtf8 ( ) + " } " , QUrl ( " " ) ) ;
obj = valid . create ( ) ;
QVERIFY ( obj ) ;
QVERIFY ( valid . errorString ( ) . isEmpty ( ) ) ;
delete obj ;
QDeclarativeComponent invalid ( & engine ) ;
invalid . setData ( " import QtQuick 1.0; TextInput { " + code . toUtf8 ( ) + " } " , QUrl ( " " ) ) ;
QTest : : ignoreMessage ( QtWarningMsg , warning . toUtf8 ( ) ) ;
obj = invalid . create ( ) ;
QCOMPARE ( invalid . errorString ( ) , error ) ;
delete obj ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : testQtQuick11Attributes_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " code " ) ;
QTest : : addColumn < QString > ( " warning " ) ;
QTest : : addColumn < QString > ( " error " ) ;
QTest : : newRow ( " canPaste " ) < < " property bool foo: canPaste "
< < " <Unknown File>:1: ReferenceError: Can't find variable: canPaste "
< < " " ;
QTest : : newRow ( " moveCursorSelection " ) < < " Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters) "
< < " <Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection "
< < " " ;
QTest : : newRow ( " deselect " ) < < " Component.onCompleted: deselect() "
< < " <Unknown File>:1: ReferenceError: Can't find variable: deselect "
< < " " ;
}
2011-11-10 01:29:07 +00:00
static void sendPreeditText ( const QString & text , int cursor )
{
QInputMethodEvent event ( text , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , cursor , text . length ( ) , QVariant ( ) ) ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : preeditAutoScroll ( )
2011-04-27 12:13:26 +00:00
{
QString preeditText = " califragisiticexpialidocious! " ;
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " preeditAutoScroll.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-27 05:53:46 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ) ;
2011-11-10 01:29:07 +00:00
QVERIFY ( input - > hasActiveFocus ( ) ) ;
input - > setWidth ( input - > implicitWidth ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-07-25 02:55:57 +00:00
QSignalSpy cursorRectangleSpy ( input , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
int cursorRectangleChanges = 0 ;
2011-04-27 12:13:26 +00:00
// test the text is scrolled so the preedit is visible.
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText . mid ( 0 , 3 ) , 1 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > positionAt ( 0 ) ! = 0 ) ;
QVERIFY ( input - > cursorRectangle ( ) . left ( ) < input - > boundingRect ( ) . width ( ) ) ;
2011-07-25 02:55:57 +00:00
QCOMPARE ( cursorRectangleSpy . count ( ) , + + cursorRectangleChanges ) ;
2011-04-27 12:13:26 +00:00
// test the text is scrolled back when the preedit is removed.
2011-11-10 01:29:07 +00:00
QInputMethodEvent imEvent ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & imEvent ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > positionAt ( 0 ) , 0 ) ;
QCOMPARE ( input - > positionAt ( input - > width ( ) ) , 5 ) ;
2011-07-25 02:55:57 +00:00
QCOMPARE ( cursorRectangleSpy . count ( ) , + + cursorRectangleChanges ) ;
2011-04-27 12:13:26 +00:00
2011-11-10 01:29:07 +00:00
QTextLayout layout ( preeditText ) ;
if ( ! qmlDisableDistanceField ( ) ) {
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
}
layout . beginLayout ( ) ;
QTextLine line = layout . createLine ( ) ;
layout . endLayout ( ) ;
2011-06-22 03:04:30 +00:00
2011-04-27 12:13:26 +00:00
// test if the preedit is larger than the text input that the
// character preceding the cursor is still visible.
qreal x = input - > positionToRectangle ( 0 ) . x ( ) ;
for ( int i = 0 ; i < 3 ; + + i ) {
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , i + 1 ) ;
int width = ceil ( line . cursorToX ( i , QTextLine : : Trailing ) ) - floor ( line . cursorToX ( i ) ) ;
QVERIFY ( input - > cursorRectangle ( ) . right ( ) > = width - 3 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > positionToRectangle ( 0 ) . x ( ) < x ) ;
2011-07-25 02:55:57 +00:00
QCOMPARE ( cursorRectangleSpy . count ( ) , + + cursorRectangleChanges ) ;
2011-04-27 12:13:26 +00:00
x = input - > positionToRectangle ( 0 ) . x ( ) ;
}
for ( int i = 1 ; i > = 0 ; - - i ) {
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , i + 1 ) ;
int width = ceil ( line . cursorToX ( i , QTextLine : : Trailing ) ) - floor ( line . cursorToX ( i ) ) ;
QVERIFY ( input - > cursorRectangle ( ) . right ( ) > = width - 3 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > positionToRectangle ( 0 ) . x ( ) > x ) ;
2011-07-25 02:55:57 +00:00
QCOMPARE ( cursorRectangleSpy . count ( ) , + + cursorRectangleChanges ) ;
2011-04-27 12:13:26 +00:00
x = input - > positionToRectangle ( 0 ) . x ( ) ;
}
// Test incrementing the preedit cursor doesn't cause further
// scrolling when right most text is visible.
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , preeditText . length ( ) - 3 ) ;
2011-07-25 02:55:57 +00:00
QCOMPARE ( cursorRectangleSpy . count ( ) , + + cursorRectangleChanges ) ;
2011-04-27 12:13:26 +00:00
x = input - > positionToRectangle ( 0 ) . x ( ) ;
for ( int i = 2 ; i > = 0 ; - - i ) {
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , preeditText . length ( ) - i ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > positionToRectangle ( 0 ) . x ( ) , x ) ;
2011-07-25 02:55:57 +00:00
QCOMPARE ( cursorRectangleSpy . count ( ) , + + cursorRectangleChanges ) ;
2011-04-27 12:13:26 +00:00
}
for ( int i = 1 ; i < 3 ; + + i ) {
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , preeditText . length ( ) - i ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > positionToRectangle ( 0 ) . x ( ) , x ) ;
2011-07-25 02:55:57 +00:00
QCOMPARE ( cursorRectangleSpy . count ( ) , + + cursorRectangleChanges ) ;
2011-04-27 12:13:26 +00:00
}
// Test disabling auto scroll.
2011-11-10 01:29:07 +00:00
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & imEvent ) ;
2011-04-27 12:13:26 +00:00
input - > setAutoScroll ( false ) ;
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText . mid ( 0 , 3 ) , 1 ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( input - > positionAt ( 0 ) , 0 ) ;
QCOMPARE ( input - > positionAt ( input - > width ( ) ) , 5 ) ;
}
2011-11-10 01:29:07 +00:00
void tst_qquicktextinput : : preeditCursorRectangle ( )
2011-04-27 12:13:26 +00:00
{
QString preeditText = " super " ;
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " inputMethodEvent.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-27 05:53:46 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ) ;
QRect currentRect ;
2011-11-10 01:29:07 +00:00
QInputMethodQueryEvent query ( Qt : : ImCursorRectangle ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
QRect previousRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
// Verify that the micro focus rect is positioned the same for position 0 as
// it would be if there was no preedit text.
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , 0 ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( currentRect , previousRect ) ;
2011-11-10 01:29:07 +00:00
QSignalSpy inputSpy ( input , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
QSignalSpy panelSpy ( qGuiApp - > inputPanel ( ) , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
2011-04-27 12:13:26 +00:00
// Verify that the micro focus rect moves to the left as the cursor position
// is incremented.
for ( int i = 1 ; i < = 5 ; + + i ) {
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , i ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( previousRect . left ( ) < currentRect . left ( ) ) ;
2011-11-10 01:29:07 +00:00
QVERIFY ( inputSpy . count ( ) > 0 ) ; inputSpy . clear ( ) ;
QVERIFY ( panelSpy . count ( ) > 0 ) ; panelSpy . clear ( ) ;
2011-04-27 12:13:26 +00:00
previousRect = currentRect ;
}
// Verify that if there is no preedit cursor then the micro focus rect is the
// same as it would be if it were positioned at the end of the preedit text.
2011-11-10 01:29:07 +00:00
sendPreeditText ( preeditText , 0 ) ;
QInputMethodEvent imEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( ) ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & imEvent ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( currentRect , previousRect ) ;
2011-11-10 01:29:07 +00:00
QVERIFY ( inputSpy . count ( ) > 0 ) ;
QVERIFY ( panelSpy . count ( ) > 0 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : inputMethodComposing ( )
2011-04-27 12:13:26 +00:00
{
QString text = " supercalifragisiticexpialidocious! " ;
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " inputContext.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-27 05:53:46 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ) ;
QSignalSpy spy ( input , SIGNAL ( inputMethodComposingChanged ( ) ) ) ;
QCOMPARE ( input - > isInputMethodComposing ( ) , false ) ;
{
QInputMethodEvent event ( text . mid ( 3 ) , QList < QInputMethodEvent : : Attribute > ( ) ) ;
2011-09-28 14:47:19 +00:00
QGuiApplication : : sendEvent ( input , & event ) ;
2011-04-27 12:13:26 +00:00
}
QCOMPARE ( input - > isInputMethodComposing ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
{
QInputMethodEvent event ( text . mid ( 12 ) , QList < QInputMethodEvent : : Attribute > ( ) ) ;
2011-09-28 14:47:19 +00:00
QGuiApplication : : sendEvent ( input , & event ) ;
2011-04-27 12:13:26 +00:00
}
QCOMPARE ( spy . count ( ) , 1 ) ;
{
QInputMethodEvent event ;
2011-09-28 14:47:19 +00:00
QGuiApplication : : sendEvent ( input , & event ) ;
2011-04-27 12:13:26 +00:00
}
QCOMPARE ( input - > isInputMethodComposing ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : cursorRectangleSize ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView * canvas = new QQuickView ( QUrl : : fromLocalFile ( TESTDATA ( " positionAt.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas - > rootObject ( ) ! = 0 ) ;
2011-11-18 11:19:09 +00:00
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( canvas - > rootObject ( ) ) ;
// make sure cursor rectangle is not at (0,0)
textInput - > setX ( 10 ) ;
textInput - > setY ( 10 ) ;
textInput - > setCursorPosition ( 3 ) ;
QVERIFY ( textInput ! = 0 ) ;
textInput - > setFocus ( true ) ;
2011-04-27 12:13:26 +00:00
canvas - > show ( ) ;
2011-09-30 10:37:51 +00:00
canvas - > requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( canvas ) ;
2011-09-30 10:37:51 +00:00
QInputMethodQueryEvent event ( Qt : : ImCursorRectangle ) ;
qApp - > sendEvent ( qApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
2011-11-18 11:19:09 +00:00
QRectF cursorRectFromQuery = event . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
QRect cursorRectFromItem = textInput - > cursorRectangle ( ) ;
QRectF cursorRectFromPositionToRectangle = textInput - > positionToRectangle ( textInput - > cursorPosition ( ) ) ;
// item and input query cursor rectangles match
QCOMPARE ( cursorRectFromItem , cursorRectFromQuery . toRect ( ) ) ;
// item cursor rectangle and positionToRectangle calculations match
QCOMPARE ( cursorRectFromItem , cursorRectFromPositionToRectangle . toRect ( ) ) ;
2011-09-30 10:37:51 +00:00
2011-11-18 11:19:09 +00:00
// item-canvas transform and input item transform match
QCOMPARE ( QQuickItemPrivate : : get ( textInput ) - > itemToCanvasTransform ( ) , qApp - > inputPanel ( ) - > inputItemTransform ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-11-18 11:19:09 +00:00
// input panel cursorRectangle property and tranformed item cursor rectangle match
QRectF sceneCursorRect = QQuickItemPrivate : : get ( textInput ) - > itemToCanvasTransform ( ) . mapRect ( cursorRectFromItem ) ;
QCOMPARE ( sceneCursorRect , qApp - > inputPanel ( ) - > cursorRectangle ( ) ) ;
2011-04-27 12:13:26 +00:00
delete canvas ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : tripleClickSelectsAll ( )
2011-09-29 00:53:15 +00:00
{
2011-10-12 03:46:02 +00:00
QString qmlfile = TESTDATA ( " positionAt.qml " ) ;
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-09-29 00:53:15 +00:00
view . show ( ) ;
2011-10-06 00:10:24 +00:00
view . requestActivateWindow ( ) ;
2011-09-29 00:53:15 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-09-29 00:53:15 +00:00
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( view . rootObject ( ) ) ;
2011-09-29 00:53:15 +00:00
QVERIFY ( input ) ;
QLatin1String hello ( " Hello world! " ) ;
input - > setSelectByMouse ( true ) ;
input - > setText ( hello ) ;
// Clicking on the same point inside TextInput three times in a row
// should trigger a triple click, thus selecting all the text.
QPoint pointInside = input - > pos ( ) . toPoint ( ) + QPoint ( 2 , 2 ) ;
QTest : : mouseDClick ( & view , Qt : : LeftButton , 0 , pointInside ) ;
QTest : : mouseClick ( & view , Qt : : LeftButton , 0 , pointInside ) ;
QGuiApplication : : processEvents ( ) ;
QCOMPARE ( input - > selectedText ( ) , hello ) ;
// Now it simulates user moving the mouse between the second and the third click.
// In this situation, we don't expect a triple click.
QPoint pointInsideButFar = QPoint ( input - > width ( ) , input - > height ( ) ) - QPoint ( 2 , 2 ) ;
QTest : : mouseDClick ( & view , Qt : : LeftButton , 0 , pointInside ) ;
QTest : : mouseClick ( & view , Qt : : LeftButton , 0 , pointInsideButFar ) ;
QGuiApplication : : processEvents ( ) ;
QVERIFY ( input - > selectedText ( ) . isEmpty ( ) ) ;
// And now we press the third click too late, so no triple click event is triggered.
QTest : : mouseDClick ( & view , Qt : : LeftButton , 0 , pointInside ) ;
QGuiApplication : : processEvents ( ) ;
2011-11-25 07:27:09 +00:00
QTest : : qWait ( qApp - > styleHints ( ) - > mouseDoubleClickInterval ( ) + 1 ) ;
2011-09-29 00:53:15 +00:00
QTest : : mouseClick ( & view , Qt : : LeftButton , 0 , pointInside ) ;
QGuiApplication : : processEvents ( ) ;
QVERIFY ( input - > selectedText ( ) . isEmpty ( ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : QTBUG_19956_data ( )
2011-10-21 01:01:39 +00:00
{
QTest : : addColumn < QString > ( " url " ) ;
QTest : : newRow ( " intvalidator " ) < < " qtbug-19956int.qml " ;
QTest : : newRow ( " doublevalidator " ) < < " qtbug-19956double.qml " ;
}
2011-11-14 01:03:05 +00:00
void tst_qquicktextinput : : keySequence_data ( )
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < QKeySequence > ( " sequence " ) ;
QTest : : addColumn < int > ( " selectionStart " ) ;
QTest : : addColumn < int > ( " selectionEnd " ) ;
QTest : : addColumn < int > ( " cursorPosition " ) ;
QTest : : addColumn < QString > ( " expectedText " ) ;
QTest : : addColumn < QString > ( " selectedText " ) ;
// standard[0] == "the [4]quick [10]brown [16]fox [20]jumped [27]over [32]the [36]lazy [41]dog"
QTest : : newRow ( " select all " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectAll ) < < 0 < < 0
< < 44 < < standard . at ( 0 ) < < standard . at ( 0 ) ;
QTest : : newRow ( " select end of line " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectEndOfLine ) < < 5 < < 5
< < 44 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 5 ) ;
QTest : : newRow ( " select end of document " ) // ### Not handled.
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectEndOfDocument ) < < 3 < < 3
< < 3 < < standard . at ( 0 ) < < QString ( ) ;
QTest : : newRow ( " select end of block " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectEndOfBlock ) < < 18 < < 18
< < 44 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 18 ) ;
QTest : : newRow ( " delete end of line " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : DeleteEndOfLine ) < < 24 < < 24
< < 24 < < standard . at ( 0 ) . mid ( 0 , 24 ) < < QString ( ) ;
QTest : : newRow ( " move to start of line " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToStartOfLine ) < < 31 < < 31
< < 0 < < standard . at ( 0 ) < < QString ( ) ;
QTest : : newRow ( " move to start of block " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToStartOfBlock ) < < 25 < < 25
< < 0 < < standard . at ( 0 ) < < QString ( ) ;
QTest : : newRow ( " move to next char " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToNextChar ) < < 12 < < 12
< < 13 < < standard . at ( 0 ) < < QString ( ) ;
QTest : : newRow ( " move to previous char " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToPreviousChar ) < < 3 < < 3
< < 2 < < standard . at ( 0 ) < < QString ( ) ;
QTest : : newRow ( " select next char " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectNextChar ) < < 23 < < 23
< < 24 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 23 , 1 ) ;
QTest : : newRow ( " select previous char " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectPreviousChar ) < < 19 < < 19
< < 18 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 18 , 1 ) ;
QTest : : newRow ( " move to next word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToNextWord ) < < 7 < < 7
< < 10 < < standard . at ( 0 ) < < QString ( ) ;
QTest : : newRow ( " move to previous word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToPreviousWord ) < < 7 < < 7
< < 4 < < standard . at ( 0 ) < < QString ( ) ;
QTest : : newRow ( " select previous word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectPreviousWord ) < < 11 < < 11
< < 10 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 10 , 1 ) ;
QTest : : newRow ( " delete (selection) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : Delete ) < < 12 < < 15
< < 12 < < ( standard . at ( 0 ) . mid ( 0 , 12 ) + standard . at ( 0 ) . mid ( 15 ) ) < < QString ( ) ;
QTest : : newRow ( " delete (no selection) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : Delete ) < < 15 < < 15
< < 15 < < ( standard . at ( 0 ) . mid ( 0 , 15 ) + standard . at ( 0 ) . mid ( 16 ) ) < < QString ( ) ;
QTest : : newRow ( " delete end of word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : DeleteEndOfWord ) < < 24 < < 24
< < 24 < < ( standard . at ( 0 ) . mid ( 0 , 24 ) + standard . at ( 0 ) . mid ( 27 ) ) < < QString ( ) ;
QTest : : newRow ( " delete start of word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : DeleteStartOfWord ) < < 7 < < 7
< < 4 < < ( standard . at ( 0 ) . mid ( 0 , 4 ) + standard . at ( 0 ) . mid ( 7 ) ) < < QString ( ) ;
}
void tst_qquicktextinput : : keySequence ( )
{
QFETCH ( QString , text ) ;
QFETCH ( QKeySequence , sequence ) ;
QFETCH ( int , selectionStart ) ;
QFETCH ( int , selectionEnd ) ;
QFETCH ( int , cursorPosition ) ;
QFETCH ( QString , expectedText ) ;
QFETCH ( QString , selectedText ) ;
if ( sequence . isEmpty ( ) ) {
QSKIP ( " Key sequence is undefined " ) ;
}
QString componentStr = " import QtQuick 2.0 \n TextInput { focus: true; text: \" " + text + " \" } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
QVERIFY ( textInput ! = 0 ) ;
QQuickCanvas canvas ;
textInput - > setParentItem ( canvas . rootItem ( ) ) ;
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
QTRY_COMPARE ( QGuiApplication : : activeWindow ( ) , & canvas ) ;
textInput - > select ( selectionStart , selectionEnd ) ;
simulateKeys ( & canvas , sequence ) ;
QCOMPARE ( textInput - > cursorPosition ( ) , cursorPosition ) ;
QCOMPARE ( textInput - > text ( ) , expectedText ) ;
QCOMPARE ( textInput - > selectedText ( ) , selectedText ) ;
}
# define NORMAL 0
# define REPLACE_UNTIL_END 1
void tst_qquicktextinput : : undo_data ( )
{
QTest : : addColumn < QStringList > ( " insertString " ) ;
QTest : : addColumn < IntList > ( " insertIndex " ) ;
QTest : : addColumn < IntList > ( " insertMode " ) ;
QTest : : addColumn < QStringList > ( " expectedString " ) ;
QTest : : addColumn < bool > ( " use_keys " ) ;
for ( int i = 0 ; i < 2 ; i + + ) {
QString keys_str = " keyboard " ;
bool use_keys = true ;
if ( i = = 0 ) {
keys_str = " insert " ;
use_keys = false ;
}
{
IntList insertIndex ;
IntList insertMode ;
QStringList insertString ;
QStringList expectedString ;
insertIndex < < - 1 ;
insertMode < < NORMAL ;
insertString < < " 1 " ;
insertIndex < < - 1 ;
insertMode < < NORMAL ;
insertString < < " 5 " ;
insertIndex < < 1 ;
insertMode < < NORMAL ;
insertString < < " 3 " ;
insertIndex < < 1 ;
insertMode < < NORMAL ;
insertString < < " 2 " ;
insertIndex < < 3 ;
insertMode < < NORMAL ;
insertString < < " 4 " ;
expectedString < < " 12345 " ;
expectedString < < " 1235 " ;
expectedString < < " 135 " ;
expectedString < < " 15 " ;
expectedString < < " " ;
QTest : : newRow ( QString ( keys_str + " _numbers " ) . toLatin1 ( ) ) < <
insertString < <
insertIndex < <
insertMode < <
expectedString < <
bool ( use_keys ) ;
}
{
IntList insertIndex ;
IntList insertMode ;
QStringList insertString ;
QStringList expectedString ;
insertIndex < < - 1 ;
insertMode < < NORMAL ;
insertString < < " World " ; // World
insertIndex < < 0 ;
insertMode < < NORMAL ;
insertString < < " Hello " ; // HelloWorld
insertIndex < < 0 ;
insertMode < < NORMAL ;
insertString < < " Well " ; // WellHelloWorld
insertIndex < < 9 ;
insertMode < < NORMAL ;
insertString < < " There " ; // WellHelloThereWorld;
expectedString < < " WellHelloThereWorld " ;
expectedString < < " WellHelloWorld " ;
expectedString < < " HelloWorld " ;
expectedString < < " World " ;
expectedString < < " " ;
QTest : : newRow ( QString ( keys_str + " _helloworld " ) . toLatin1 ( ) ) < <
insertString < <
insertIndex < <
insertMode < <
expectedString < <
bool ( use_keys ) ;
}
{
IntList insertIndex ;
IntList insertMode ;
QStringList insertString ;
QStringList expectedString ;
insertIndex < < - 1 ;
insertMode < < NORMAL ;
insertString < < " Ensuring " ;
insertIndex < < - 1 ;
insertMode < < NORMAL ;
insertString < < " instan " ;
insertIndex < < 9 ;
insertMode < < NORMAL ;
insertString < < " an " ;
insertIndex < < 10 ;
insertMode < < REPLACE_UNTIL_END ;
insertString < < " unique instance. " ;
expectedString < < " Ensuring a unique instance. " ;
expectedString < < " Ensuring an instan " ;
expectedString < < " Ensuring instan " ;
expectedString < < " " ;
QTest : : newRow ( QString ( keys_str + " _patterns " ) . toLatin1 ( ) ) < <
insertString < <
insertIndex < <
insertMode < <
expectedString < <
bool ( use_keys ) ;
}
}
}
void tst_qquicktextinput : : undo ( )
{
QFETCH ( QStringList , insertString ) ;
QFETCH ( IntList , insertIndex ) ;
QFETCH ( IntList , insertMode ) ;
QFETCH ( QStringList , expectedString ) ;
QString componentStr = " import QtQuick 2.0 \n TextInput { focus: true } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
QVERIFY ( textInput ! = 0 ) ;
QQuickCanvas canvas ;
textInput - > setParentItem ( canvas . rootItem ( ) ) ;
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
QTRY_COMPARE ( QGuiApplication : : activeWindow ( ) , & canvas ) ;
int i ;
// STEP 1: First build up an undo history by inserting or typing some strings...
for ( i = 0 ; i < insertString . size ( ) ; + + i ) {
if ( insertIndex [ i ] > - 1 )
textInput - > setCursorPosition ( insertIndex [ i ] ) ;
// experimental stuff
if ( insertMode [ i ] = = REPLACE_UNTIL_END ) {
textInput - > select ( insertIndex [ i ] , insertIndex [ i ] + 8 ) ;
// This is what I actually want...
// QTest::keyClick(testWidget, Qt::Key_End, Qt::ShiftModifier);
}
for ( int j = 0 ; j < insertString . at ( i ) . length ( ) ; j + + )
QTest : : keyClick ( & canvas , insertString . at ( i ) . at ( j ) . toLatin1 ( ) ) ;
}
// STEP 2: Next call undo several times and see if we can restore to the previous state
for ( i = 0 ; i < expectedString . size ( ) - 1 ; + + i ) {
QCOMPARE ( textInput - > text ( ) , expectedString [ i ] ) ;
simulateKeys ( & canvas , QKeySequence : : Undo ) ;
}
// STEP 3: Verify that we have undone everything
QVERIFY ( textInput - > text ( ) . isEmpty ( ) ) ;
}
void tst_qquicktextinput : : redo_data ( )
{
QTest : : addColumn < QStringList > ( " insertString " ) ;
QTest : : addColumn < IntList > ( " insertIndex " ) ;
QTest : : addColumn < QStringList > ( " expectedString " ) ;
{
IntList insertIndex ;
QStringList insertString ;
QStringList expectedString ;
insertIndex < < - 1 ;
insertString < < " World " ; // World
insertIndex < < 0 ;
insertString < < " Hello " ; // HelloWorld
insertIndex < < 0 ;
insertString < < " Well " ; // WellHelloWorld
insertIndex < < 9 ;
insertString < < " There " ; // WellHelloThereWorld;
expectedString < < " World " ;
expectedString < < " HelloWorld " ;
expectedString < < " WellHelloWorld " ;
expectedString < < " WellHelloThereWorld " ;
QTest : : newRow ( " Inserts and setting cursor " ) < < insertString < < insertIndex < < expectedString ;
}
}
void tst_qquicktextinput : : redo ( )
{
QFETCH ( QStringList , insertString ) ;
QFETCH ( IntList , insertIndex ) ;
QFETCH ( QStringList , expectedString ) ;
QString componentStr = " import QtQuick 2.0 \n TextInput { focus: true } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
QVERIFY ( textInput ! = 0 ) ;
QQuickCanvas canvas ;
textInput - > setParentItem ( canvas . rootItem ( ) ) ;
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
QTRY_COMPARE ( QGuiApplication : : activeWindow ( ) , & canvas ) ;
int i ;
// inserts the diff strings at diff positions
for ( i = 0 ; i < insertString . size ( ) ; + + i ) {
if ( insertIndex [ i ] > - 1 )
textInput - > setCursorPosition ( insertIndex [ i ] ) ;
for ( int j = 0 ; j < insertString . at ( i ) . length ( ) ; j + + )
QTest : : keyClick ( & canvas , insertString . at ( i ) . at ( j ) . toLatin1 ( ) ) ;
}
// undo everything
while ( ! textInput - > text ( ) . isEmpty ( ) )
simulateKeys ( & canvas , QKeySequence : : Undo ) ;
for ( i = 0 ; i < expectedString . size ( ) ; + + i ) {
simulateKeys ( & canvas , QKeySequence : : Redo ) ;
QCOMPARE ( textInput - > text ( ) , expectedString [ i ] ) ;
}
}
void tst_qquicktextinput : : undo_keypressevents_data ( )
{
QTest : : addColumn < KeyList > ( " keys " ) ;
QTest : : addColumn < QStringList > ( " expectedString " ) ;
{
KeyList keys ;
QStringList expectedString ;
keys < < " AFRAID "
< < Qt : : Key_Home
< < " VERY "
< < Qt : : Key_Left
< < Qt : : Key_Left
< < Qt : : Key_Left
< < Qt : : Key_Left
< < " BE "
< < Qt : : Key_End
< < " ! " ;
expectedString < < " BEVERYAFRAID! " ;
expectedString < < " BEVERYAFRAID " ;
expectedString < < " VERYAFRAID " ;
expectedString < < " AFRAID " ;
QTest : : newRow ( " Inserts and moving cursor " ) < < keys < < expectedString ;
} {
KeyList keys ;
QStringList expectedString ;
// inserting '1234'
keys < < " 1234 " < < Qt : : Key_Home
// skipping '12'
< < Qt : : Key_Right < < Qt : : Key_Right
// selecting '34'
< < ( Qt : : Key_Right | Qt : : ShiftModifier ) < < ( Qt : : Key_Right | Qt : : ShiftModifier )
// deleting '34'
< < Qt : : Key_Delete ;
expectedString < < " 12 " ;
expectedString < < " 1234 " ;
QTest : : newRow ( " Inserts,moving,selection and delete " ) < < keys < < expectedString ;
} {
KeyList keys ;
QStringList expectedString ;
// inserting 'AB12'
keys < < " AB12 "
< < Qt : : Key_Home
// selecting 'AB'
< < ( Qt : : Key_Right | Qt : : ShiftModifier ) < < ( Qt : : Key_Right | Qt : : ShiftModifier )
< < Qt : : Key_Delete
< < QKeySequence : : Undo
< < Qt : : Key_Right
# ifdef Q_OS_WIN //Mac(?) has a specialcase to handle jumping to the end of a selection
< < Qt : : Key_Left
# endif
< < ( Qt : : Key_Right | Qt : : ShiftModifier ) < < ( Qt : : Key_Right | Qt : : ShiftModifier )
< < Qt : : Key_Delete ;
expectedString < < " AB " ;
expectedString < < " AB12 " ;
QTest : : newRow ( " Inserts,moving,selection, delete and undo " ) < < keys < < expectedString ;
} {
KeyList keys ;
QStringList expectedString ;
// inserting 'ABCD'
keys < < " abcd "
//move left two
< < Qt : : Key_Left < < Qt : : Key_Left
// inserting '1234'
< < " 1234 "
// selecting '1234'
< < ( Qt : : Key_Left | Qt : : ShiftModifier ) < < ( Qt : : Key_Left | Qt : : ShiftModifier ) < < ( Qt : : Key_Left | Qt : : ShiftModifier ) < < ( Qt : : Key_Left | Qt : : ShiftModifier )
// overwriting '1234' with '5'
< < " 5 "
// undoing deletion of 'AB'
< < QKeySequence : : Undo
// overwriting '1234' with '6'
< < " 6 " ;
expectedString < < " ab6cd " ;
// for versions previous to 3.2 we overwrite needed two undo operations
expectedString < < " ab1234cd " ;
expectedString < < " abcd " ;
QTest : : newRow ( " Inserts,moving,selection and undo, removing selection " ) < < keys < < expectedString ;
} {
KeyList keys ;
QStringList expectedString ;
// inserting 'ABC'
keys < < " ABC "
// removes 'C'
< < Qt : : Key_Backspace ;
expectedString < < " AB " ;
expectedString < < " ABC " ;
QTest : : newRow ( " Inserts,backspace " ) < < keys < < expectedString ;
} {
KeyList keys ;
QStringList expectedString ;
keys < < " ABC "
// removes 'C'
< < Qt : : Key_Backspace
// inserting 'Z'
< < " Z " ;
expectedString < < " ABZ " ;
expectedString < < " AB " ;
expectedString < < " ABC " ;
QTest : : newRow ( " Inserts,backspace,inserts " ) < < keys < < expectedString ;
} {
KeyList keys ;
QStringList expectedString ;
// inserting '123'
keys < < " 123 " < < Qt : : Key_Home
// selecting '123'
< < ( Qt : : Key_End | Qt : : ShiftModifier )
// overwriting '123' with 'ABC'
< < " ABC " ;
expectedString < < " ABC " ;
// for versions previous to 3.2 we overwrite needed two undo operations
expectedString < < " 123 " ;
QTest : : newRow ( " Inserts,moving,selection and overwriting " ) < < keys < < expectedString ;
}
}
void tst_qquicktextinput : : undo_keypressevents ( )
{
QFETCH ( KeyList , keys ) ;
QFETCH ( QStringList , expectedString ) ;
QString componentStr = " import QtQuick 2.0 \n TextInput { focus: true } " ;
QDeclarativeComponent textInputComponent ( & engine ) ;
textInputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextInput * textInput = qobject_cast < QQuickTextInput * > ( textInputComponent . create ( ) ) ;
QVERIFY ( textInput ! = 0 ) ;
QQuickCanvas canvas ;
textInput - > setParentItem ( canvas . rootItem ( ) ) ;
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
QTRY_COMPARE ( QGuiApplication : : activeWindow ( ) , & canvas ) ;
simulateKeys ( & canvas , keys ) ;
for ( int i = 0 ; i < expectedString . size ( ) ; + + i ) {
QCOMPARE ( textInput - > text ( ) , expectedString [ i ] ) ;
simulateKeys ( & canvas , QKeySequence : : Undo ) ;
}
QVERIFY ( textInput - > text ( ) . isEmpty ( ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : QTBUG_19956 ( )
2011-10-21 01:01:39 +00:00
{
QFETCH ( QString , url ) ;
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( url ) ) ) ;
2011-10-21 01:01:39 +00:00
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-10-21 01:01:39 +00:00
QVERIFY ( input ) ;
input - > setFocus ( true ) ;
QVERIFY ( input - > hasActiveFocus ( ) ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " topvalue " ) . toInt ( ) , 30 ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " bottomvalue " ) . toInt ( ) , 10 ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " text " ) . toString ( ) , QString ( " 20 " ) ) ;
QVERIFY ( canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
canvas . rootObject ( ) - > setProperty ( " topvalue " , 15 ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " topvalue " ) . toInt ( ) , 15 ) ;
QVERIFY ( ! canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
canvas . rootObject ( ) - > setProperty ( " topvalue " , 25 ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " topvalue " ) . toInt ( ) , 25 ) ;
QVERIFY ( canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
canvas . rootObject ( ) - > setProperty ( " bottomvalue " , 21 ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " bottomvalue " ) . toInt ( ) , 21 ) ;
QVERIFY ( ! canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
canvas . rootObject ( ) - > setProperty ( " bottomvalue " , 10 ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " bottomvalue " ) . toInt ( ) , 10 ) ;
QVERIFY ( canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextinput : : QTBUG_19956_regexp ( )
2011-10-21 01:01:39 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " qtbug-19956regexp.qml " ) ) ) ;
2011-10-21 01:01:39 +00:00
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextInput * input = qobject_cast < QQuickTextInput * > ( canvas . rootObject ( ) ) ;
2011-10-21 01:01:39 +00:00
QVERIFY ( input ) ;
input - > setFocus ( true ) ;
QVERIFY ( input - > hasActiveFocus ( ) ) ;
canvas . rootObject ( ) - > setProperty ( " regexvalue " , QRegExp ( " abc " ) ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " regexvalue " ) . toRegExp ( ) , QRegExp ( " abc " ) ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " text " ) . toString ( ) , QString ( " abc " ) ) ;
QVERIFY ( canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
canvas . rootObject ( ) - > setProperty ( " regexvalue " , QRegExp ( " abcd " ) ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " regexvalue " ) . toRegExp ( ) , QRegExp ( " abcd " ) ) ;
QVERIFY ( ! canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
canvas . rootObject ( ) - > setProperty ( " regexvalue " , QRegExp ( " abc " ) ) ;
QCOMPARE ( canvas . rootObject ( ) - > property ( " regexvalue " ) . toRegExp ( ) , QRegExp ( " abc " ) ) ;
QVERIFY ( canvas . rootObject ( ) - > property ( " acceptableInput " ) . toBool ( ) ) ;
}
2011-10-14 08:51:42 +00:00
QTEST_MAIN ( tst_qquicktextinput )
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
# include "tst_qquicktextinput.moc"