2011-04-27 12:13:26 +00:00
/****************************************************************************
* *
2015-01-28 11:55:39 +00:00
* * Copyright ( C ) 2015 The Qt Company Ltd .
* * Contact : http : //www.qt.io/licensing/
2011-04-27 12:13:26 +00:00
* *
* * This file is part of the test suite of the Qt Toolkit .
* *
2014-08-22 06:13:59 +00:00
* * $ QT_BEGIN_LICENSE : LGPL21 $
2012-09-20 05:21:40 +00:00
* * Commercial License Usage
* * Licensees holding valid commercial Qt licenses may use this file in
* * accordance with the commercial license agreement provided with the
* * Software or , alternatively , in accordance with the terms contained in
2015-01-28 11:55:39 +00:00
* * a written agreement between you and The Qt Company . For licensing terms
* * and conditions see http : //www.qt.io/terms-conditions. For further
* * information use the contact form at http : //www.qt.io/contact-us.
2012-09-20 05:21:40 +00:00
* *
2011-04-27 12:13:26 +00:00
* * GNU Lesser General Public License Usage
2012-09-20 05:21:40 +00:00
* * Alternatively , this file may be used under the terms of the GNU Lesser
2014-08-22 06:13:59 +00:00
* * General Public License version 2.1 or version 3 as published by the Free
* * Software Foundation and appearing in the file LICENSE . LGPLv21 and
* * LICENSE . LGPLv3 included in the packaging of this file . Please review the
* * following information to ensure the GNU Lesser General Public License
* * requirements will be met : https : //www.gnu.org/licenses/lgpl.html and
* * http : //www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
2012-09-20 05:21:40 +00:00
* *
2015-01-28 11:55:39 +00:00
* * As a special exception , The Qt Company gives you certain additional
* * rights . These rights are described in The Qt Company LGPL Exception
2011-04-27 12:13:26 +00:00
* * version 1.1 , included in the file LGPL_EXCEPTION . txt in this package .
* *
* * $ QT_END_LICENSE $
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <qtest.h>
# include <QtTest/QSignalSpy>
Say hello to QtQuick module
This change moves the QtQuick 2 types and C++ API (including
SceneGraph) to a new module (AKA library), QtQuick.
99% of this change is moving files from src/declarative to
src/quick, and from tests/auto/declarative to
tests/auto/qtquick2.
The loading of QtQuick 2 ("import QtQuick 2.0") is now delegated to
a plugin, src/imports/qtquick2, just like it's done for QtQuick 1.
All tools, examples, and tests that use QtQuick C++ API have gotten
"QT += quick" or "QT += quick-private" added to their .pro file.
A few additional internal QtDeclarative classes had to be exported
(via Q_DECLARATIVE_PRIVATE_EXPORT) since they're needed by the
QtQuick 2 implementation.
The old header locations (e.g. QtDeclarative/qquickitem.h) will
still be supported for some time, but will produce compile-time
warnings. (To avoid the QtQuick implementation using the
compatibility headers (since QtDeclarative's includepath comes
first), a few include statements were modified, e.g. from
"#include <qsgnode.h>" to "#include <QtQuick/qsgnode.h>".)
There's a change in qtbase that automatically adds QtQuick to the
module list if QtDeclarative is used. Together with the compatibility
headers, this should help reduce the migration pain for existing
projects.
In theory, simply getting an existing QtDeclarative-based project
to compile and link shouldn't require any changes for now -- but
porting to the new scheme is of course recommended, and will
eventually become mandatory.
Task-number: QTBUG-22889
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Change-Id: Ia52be9373172ba2f37e7623231ecb060316c96a7
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
2011-11-23 14:14:07 +00:00
# include "../../shared/testhttpserver.h"
2011-04-27 12:13:26 +00:00
# include <math.h>
# include <QFile>
# include <QTextDocument>
2012-02-16 04:43:03 +00:00
# include <QtQml/qqmlengine.h>
# include <QtQml/qqmlcontext.h>
# include <QtQml/qqmlexpression.h>
# include <QtQml/qqmlcomponent.h>
2011-09-27 05:53:46 +00:00
# include <QtGui/qguiapplication.h>
2011-10-14 08:51:42 +00:00
# include <private/qquicktextedit_p.h>
# include <private/qquicktextedit_p_p.h>
2012-01-16 06:40:13 +00:00
# include <private/qquicktext_p_p.h>
2011-04-27 12:13:26 +00:00
# include <QFontMetrics>
Say hello to QtQuick module
This change moves the QtQuick 2 types and C++ API (including
SceneGraph) to a new module (AKA library), QtQuick.
99% of this change is moving files from src/declarative to
src/quick, and from tests/auto/declarative to
tests/auto/qtquick2.
The loading of QtQuick 2 ("import QtQuick 2.0") is now delegated to
a plugin, src/imports/qtquick2, just like it's done for QtQuick 1.
All tools, examples, and tests that use QtQuick C++ API have gotten
"QT += quick" or "QT += quick-private" added to their .pro file.
A few additional internal QtDeclarative classes had to be exported
(via Q_DECLARATIVE_PRIVATE_EXPORT) since they're needed by the
QtQuick 2 implementation.
The old header locations (e.g. QtDeclarative/qquickitem.h) will
still be supported for some time, but will produce compile-time
warnings. (To avoid the QtQuick implementation using the
compatibility headers (since QtDeclarative's includepath comes
first), a few include statements were modified, e.g. from
"#include <qsgnode.h>" to "#include <QtQuick/qsgnode.h>".)
There's a change in qtbase that automatically adds QtQuick to the
module list if QtDeclarative is used. Together with the compatibility
headers, this should help reduce the migration pain for existing
projects.
In theory, simply getting an existing QtDeclarative-based project
to compile and link shouldn't require any changes for now -- but
porting to the new scheme is of course recommended, and will
eventually become mandatory.
Task-number: QTBUG-22889
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Change-Id: Ia52be9373172ba2f37e7623231ecb060316c96a7
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
2011-11-23 14:14:07 +00:00
# include <QtQuick/QQuickView>
2011-04-27 12:13:26 +00:00
# include <QDir>
2012-02-03 08:07:51 +00:00
# include <QInputMethod>
2011-04-27 12:13:26 +00:00
# include <QClipboard>
# include <QMimeData>
2011-11-10 04:58:17 +00:00
# include <private/qquicktextcontrol_p.h>
Say hello to QtQuick module
This change moves the QtQuick 2 types and C++ API (including
SceneGraph) to a new module (AKA library), QtQuick.
99% of this change is moving files from src/declarative to
src/quick, and from tests/auto/declarative to
tests/auto/qtquick2.
The loading of QtQuick 2 ("import QtQuick 2.0") is now delegated to
a plugin, src/imports/qtquick2, just like it's done for QtQuick 1.
All tools, examples, and tests that use QtQuick C++ API have gotten
"QT += quick" or "QT += quick-private" added to their .pro file.
A few additional internal QtDeclarative classes had to be exported
(via Q_DECLARATIVE_PRIVATE_EXPORT) since they're needed by the
QtQuick 2 implementation.
The old header locations (e.g. QtDeclarative/qquickitem.h) will
still be supported for some time, but will produce compile-time
warnings. (To avoid the QtQuick implementation using the
compatibility headers (since QtDeclarative's includepath comes
first), a few include statements were modified, e.g. from
"#include <qsgnode.h>" to "#include <QtQuick/qsgnode.h>".)
There's a change in qtbase that automatically adds QtQuick to the
module list if QtDeclarative is used. Together with the compatibility
headers, this should help reduce the migration pain for existing
projects.
In theory, simply getting an existing QtDeclarative-based project
to compile and link shouldn't require any changes for now -- but
porting to the new scheme is of course recommended, and will
eventually become mandatory.
Task-number: QTBUG-22889
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Change-Id: Ia52be9373172ba2f37e7623231ecb060316c96a7
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
2011-11-23 14:14:07 +00:00
# include "../../shared/util.h"
2012-09-10 14:36:55 +00:00
# include "../../shared/platformquirks.h"
2012-01-03 15:57:14 +00:00
# include "../../shared/platforminputcontext.h"
2012-02-03 08:07:51 +00:00
# include <private/qinputmethod_p.h>
2012-06-28 02:23:01 +00:00
# include <QtGui/qstylehints.h>
2013-05-07 09:22:52 +00:00
# include <qmath.h>
2011-04-27 12:13:26 +00:00
2011-10-19 05:04:15 +00:00
# ifdef Q_OS_MAC
2011-04-27 12:13:26 +00:00
# include <Carbon/Carbon.h>
# endif
2012-07-09 06:33:21 +00:00
# define SERVER_PORT 42332
# define SERVER_ADDR "http: //localhost:42332"
2011-09-27 05:53:46 +00:00
2011-10-14 08:51:42 +00:00
Q_DECLARE_METATYPE ( QQuickTextEdit : : SelectionMode )
2012-03-09 07:40:49 +00:00
Q_DECLARE_METATYPE ( Qt : : Key )
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.
2012-02-16 04:43:03 +00:00
QString persistent_dir = QQmlDataTest : : instance ( ) - > dataDirectory ( ) ;
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-04-27 12:13:26 +00:00
2012-02-16 04:43:03 +00:00
class tst_qquicktextedit : public QQmlDataTest
2011-04-27 12:13:26 +00:00
{
Q_OBJECT
public :
2011-10-14 08:51:42 +00:00
tst_qquicktextedit ( ) ;
2011-04-27 12:13:26 +00:00
private slots :
2012-01-09 14:31:54 +00:00
void cleanup ( ) ;
2011-04-27 12:13:26 +00:00
void text ( ) ;
void width ( ) ;
void wrap ( ) ;
void textFormat ( ) ;
2014-03-06 12:37:41 +00:00
void lineCount_data ( ) ;
void lineCount ( ) ;
2011-04-27 12:13:26 +00:00
2011-10-17 11:03:58 +00:00
// ### these tests may be trivial
2011-04-27 12:13:26 +00:00
void hAlign ( ) ;
void hAlign_RightToLeft ( ) ;
2012-05-16 06:07:47 +00:00
void hAlignVisual ( ) ;
2011-04-27 12:13:26 +00:00
void vAlign ( ) ;
void font ( ) ;
void color ( ) ;
void textMargin ( ) ;
void persistentSelection ( ) ;
2013-03-05 13:56:10 +00:00
void selectionOnFocusOut ( ) ;
2011-04-27 12:13:26 +00:00
void focusOnPress ( ) ;
void selection ( ) ;
void isRightToLeft_data ( ) ;
void isRightToLeft ( ) ;
void keySelection ( ) ;
void moveCursorSelection_data ( ) ;
void moveCursorSelection ( ) ;
void moveCursorSelectionSequence_data ( ) ;
void moveCursorSelectionSequence ( ) ;
void mouseSelection_data ( ) ;
void mouseSelection ( ) ;
void mouseSelectionMode_data ( ) ;
void mouseSelectionMode ( ) ;
void dragMouseSelection ( ) ;
2012-07-24 05:54:28 +00:00
void mouseSelectionMode_accessors ( ) ;
void selectByMouse ( ) ;
2013-03-01 14:26:54 +00:00
void selectByKeyboard ( ) ;
void keyboardSelection_data ( ) ;
void keyboardSelection ( ) ;
2012-07-24 05:54:28 +00:00
void renderType ( ) ;
2011-04-27 12:13:26 +00:00
void inputMethodHints ( ) ;
2012-07-10 01:30:53 +00:00
void positionAt_data ( ) ;
2011-04-27 12:13:26 +00:00
void positionAt ( ) ;
2013-04-22 16:14:55 +00:00
void linkInteraction ( ) ;
2011-12-13 05:42:49 +00:00
2012-02-14 02:55:38 +00:00
void cursorDelegate_data ( ) ;
2011-04-27 12:13:26 +00:00
void cursorDelegate ( ) ;
2012-07-09 06:33:21 +00:00
void remoteCursorDelegate ( ) ;
2011-04-27 12:13:26 +00:00
void cursorVisible ( ) ;
void delegateLoading_data ( ) ;
void delegateLoading ( ) ;
void navigation ( ) ;
void readOnly ( ) ;
2012-09-10 14:36:55 +00:00
# ifndef QT_NO_CLIPBOARD
2011-04-27 12:13:26 +00:00
void copyAndPaste ( ) ;
void canPaste ( ) ;
void canPasteEmpty ( ) ;
2012-08-03 06:50:24 +00:00
void middleClickPaste ( ) ;
2012-09-10 14:36:55 +00:00
# endif
2011-04-27 12:13:26 +00:00
void textInput ( ) ;
2012-02-03 08:07:51 +00:00
void inputMethodUpdate ( ) ;
2011-09-28 13:56:36 +00:00
void openInputPanel ( ) ;
2011-04-27 12:13:26 +00:00
void geometrySignals ( ) ;
2012-09-10 14:36:55 +00:00
# ifndef QT_NO_CLIPBOARD
2011-04-27 12:13:26 +00:00
void pastingRichText_QTBUG_14003 ( ) ;
2012-09-10 14:36:55 +00:00
# endif
2011-04-27 12:13:26 +00:00
void implicitSize_data ( ) ;
void implicitSize ( ) ;
2012-02-07 01:57:42 +00:00
void contentSize ( ) ;
2012-04-19 01:08:28 +00:00
void boundingRect ( ) ;
void clipRect ( ) ;
2012-03-22 02:04:16 +00:00
void implicitSizeBinding_data ( ) ;
void implicitSizeBinding ( ) ;
2011-04-27 12:13:26 +00:00
2011-11-09 00:40:58 +00:00
void preeditCursorRectangle ( ) ;
2011-04-27 12:13:26 +00:00
void inputMethodComposing ( ) ;
2014-10-14 08:44:47 +00:00
void cursorRectangleSize_data ( ) ;
2011-04-27 12:13:26 +00:00
void cursorRectangleSize ( ) ;
2011-11-24 02:53:05 +00:00
void getText_data ( ) ;
void getText ( ) ;
2011-11-28 04:03:34 +00:00
void getFormattedText_data ( ) ;
void getFormattedText ( ) ;
2013-06-06 13:16:59 +00:00
void append_data ( ) ;
void append ( ) ;
2011-11-24 02:53:05 +00:00
void insert_data ( ) ;
void insert ( ) ;
void remove_data ( ) ;
void remove ( ) ;
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 ( ) ;
2012-01-17 00:42:26 +00:00
void baseUrl ( ) ;
2012-01-16 06:40:13 +00:00
void embeddedImages ( ) ;
void embeddedImages_data ( ) ;
2011-10-20 05:48:29 +00:00
void emptytags_QTBUG_22058 ( ) ;
2014-05-12 16:09:08 +00:00
void cursorRectangle_QTBUG_38947 ( ) ;
2014-11-17 11:36:30 +00:00
void textCached_QTBUG_41583 ( ) ;
2011-10-20 05:48:29 +00:00
2011-04-27 12:13:26 +00:00
private :
2011-11-14 01:03:05 +00:00
void simulateKeys ( QWindow * window , const QList < Key > & keys ) ;
void simulateKeys ( QWindow * window , const QKeySequence & sequence ) ;
2012-03-09 07:40:49 +00:00
void simulateKey ( QWindow * , int key , Qt : : KeyboardModifiers modifiers = 0 ) ;
2011-04-27 12:13:26 +00:00
QStringList standard ;
QStringList richText ;
QStringList hAlignmentStrings ;
QStringList vAlignmentStrings ;
QList < Qt : : Alignment > vAlignments ;
QList < Qt : : Alignment > hAlignments ;
QStringList colorStrings ;
2012-02-16 04:43:03 +00:00
QQmlEngine engine ;
2011-04-27 12:13:26 +00:00
} ;
2011-11-14 01:03:05 +00:00
typedef QList < int > IntList ;
Q_DECLARE_METATYPE ( IntList )
typedef QList < Key > KeyList ;
Q_DECLARE_METATYPE ( KeyList )
2012-07-10 01:30:53 +00:00
Q_DECLARE_METATYPE ( QQuickTextEdit : : HAlignment )
Q_DECLARE_METATYPE ( QQuickTextEdit : : VAlignment )
2011-11-24 02:53:05 +00:00
Q_DECLARE_METATYPE ( QQuickTextEdit : : TextFormat )
2011-11-14 01:03:05 +00:00
void tst_qquicktextedit : : 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_qquicktextedit : : simulateKeys ( QWindow * window , const QKeySequence & sequence )
{
2012-01-20 12:07:20 +00:00
for ( int i = 0 ; i < sequence . count ( ) ; + + i ) {
2011-11-14 01:03:05 +00:00
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 )
{
2012-01-20 12:07:20 +00:00
for ( int i = 0 ; i < sequence . count ( ) ; + + i )
2011-11-14 01:03:05 +00:00
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
tst_qquicktextedit : : tst_qquicktextedit ( )
2011-04-27 12:13:26 +00:00
{
standard < < " the quick brown fox jumped over the lazy dog "
< < " the quick brown fox \n jumped over the lazy dog "
< < " Hello, world! "
< < " !dlrow ,olleH " ;
richText < < " <i>the <b>quick</b> brown <a href= \\ \" http://www.google.com \\ \" >fox</a> jumped over the <b>lazy</b> dog</i> "
< < " <i>the <b>quick</b> brown <a href= \\ \" http://www.google.com \\ \" >fox</a><br>jumped over the <b>lazy</b> dog</i> " ;
hAlignmentStrings < < " AlignLeft "
< < " AlignRight "
< < " AlignHCenter " ;
vAlignmentStrings < < " AlignTop "
< < " AlignBottom "
< < " AlignVCenter " ;
hAlignments < < Qt : : AlignLeft
< < Qt : : AlignRight
< < Qt : : AlignHCenter ;
vAlignments < < Qt : : AlignTop
< < Qt : : AlignBottom
< < Qt : : AlignVCenter ;
colorStrings < < " aliceblue "
< < " antiquewhite "
< < " aqua "
< < " darkkhaki "
< < " darkolivegreen "
< < " dimgray "
< < " palevioletred "
< < " lightsteelblue "
< < " #000000 "
< < " #AAAAAA "
< < " #FFFFFF "
< < " #2AC05F " ;
//
// need a different test to do alpha channel test
// << "#AA0011DD"
// << "#00F16B11";
2011-10-17 11:03:58 +00:00
//
2011-04-27 12:13:26 +00:00
}
2012-01-09 14:31:54 +00:00
void tst_qquicktextedit : : cleanup ( )
{
// ensure not even skipped tests with custom input context leave it dangling
2012-02-03 08:07:51 +00:00
QInputMethodPrivate * inputMethodPrivate = QInputMethodPrivate : : get ( qApp - > inputMethod ( ) ) ;
inputMethodPrivate - > testContext = 0 ;
2012-01-09 14:31:54 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : text ( )
2011-04-27 12:13:26 +00:00
{
{
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( " import QtQuick 2.0 \n TextEdit { text: \" \" } " , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > text ( ) , QString ( " " ) ) ;
2011-11-28 04:29:36 +00:00
QCOMPARE ( textEditObject - > length ( ) , 0 ) ;
2011-04-27 12:13:26 +00:00
}
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + standard . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > text ( ) , standard . at ( i ) ) ;
2011-11-28 04:29:36 +00:00
QCOMPARE ( textEditObject - > length ( ) , standard . at ( i ) . length ( ) ) ;
2011-04-27 12:13:26 +00:00
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + richText . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-12-13 03:56:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
QVERIFY ( textEditObject ! = 0 ) ;
QString expected = richText . at ( i ) ;
expected . replace ( QRegExp ( " \\ \\ (.) " ) , " \\ 1 " ) ;
QCOMPARE ( textEditObject - > text ( ) , expected ) ;
QCOMPARE ( textEditObject - > length ( ) , expected . length ( ) ) ;
}
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.RichText; text: \" " + standard . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-12-13 03:56:42 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
QVERIFY ( textEditObject ! = 0 ) ;
QString actual = textEditObject - > text ( ) ;
QString expected = standard . at ( i ) ;
actual . remove ( QRegExp ( " .*<body[^>]*> " ) ) ;
actual . remove ( QRegExp ( " (<[^>]*>)+ " ) ) ;
expected . remove ( " \n " ) ;
QCOMPARE ( actual . simplified ( ) , expected ) ;
QCOMPARE ( textEditObject - > length ( ) , expected . length ( ) ) ;
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.RichText; text: \" " + richText . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-12-13 03:56:42 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
QVERIFY ( textEditObject ! = 0 ) ;
QString actual = textEditObject - > text ( ) ;
QString expected = richText . at ( i ) ;
actual . replace ( QRegExp ( " .*<body[^>]*> " ) , " " ) ;
actual . replace ( QRegExp ( " (<[^>]*>)+ " ) , " <> " ) ;
expected . replace ( QRegExp ( " (<[^>]*>)+ " ) , " <> " ) ;
QCOMPARE ( actual . simplified ( ) , expected . simplified ( ) ) ;
expected . replace ( " <> " , " " ) ;
QCOMPARE ( textEditObject - > length ( ) , expected . simplified ( ) . length ( ) ) ;
}
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.AutoText; text: \" " + standard . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-12-13 03:56:42 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > text ( ) , standard . at ( i ) ) ;
QCOMPARE ( textEditObject - > length ( ) , standard . at ( i ) . length ( ) ) ;
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.AutoText; text: \" " + richText . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-12-13 03:56:42 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QString actual = textEditObject - > text ( ) ;
QString expected = richText . at ( i ) ;
actual . replace ( QRegExp ( " .*<body[^>]*> " ) , " " ) ;
actual . replace ( QRegExp ( " (<[^>]*>)+ " ) , " <> " ) ;
expected . replace ( QRegExp ( " (<[^>]*>)+ " ) , " <> " ) ;
QCOMPARE ( actual . simplified ( ) , expected . simplified ( ) ) ;
2011-11-28 04:29:36 +00:00
expected . replace ( " <> " , " " ) ;
QCOMPARE ( textEditObject - > length ( ) , expected . simplified ( ) . length ( ) ) ;
2011-04-27 12:13:26 +00:00
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : width ( )
2011-04-27 12:13:26 +00:00
{
// uses Font metrics to find the width for standard and document to find the width for rich
{
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( " import QtQuick 2.0 \n TextEdit { text: \" \" } " , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > width ( ) , 0.0 ) ;
}
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 + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + standard . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-12-05 01:01:15 +00:00
QString s = standard . at ( i ) ;
s . replace ( QLatin1Char ( ' \n ' ) , QChar : : LineSeparator ) ;
QTextLayout layout ( s ) ;
layout . setFont ( textEditObject - > font ( ) ) ;
layout . setFlags ( Qt : : TextExpandTabs | Qt : : TextShowMnemonic ) ;
if ( requiresUnhintedMetrics ) {
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
}
layout . beginLayout ( ) ;
forever {
QTextLine line = layout . createLine ( ) ;
if ( ! line . isValid ( ) )
break ;
}
layout . endLayout ( ) ;
2012-02-23 04:11:48 +00:00
qreal metricWidth = layout . boundingRect ( ) . width ( ) ;
2011-12-05 01:01:15 +00:00
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
2012-02-23 04:11:48 +00:00
QCOMPARE ( textEditObject - > width ( ) , metricWidth ) ;
2011-04-27 12:13:26 +00:00
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
QTextDocument document ;
document . setHtml ( richText . at ( i ) ) ;
document . setDocumentMargin ( 0 ) ;
2011-06-01 07:45:55 +00:00
if ( requiresUnhintedMetrics )
document . setUseDesignMetrics ( true ) ;
2011-04-27 12:13:26 +00:00
2012-02-23 04:11:48 +00:00
qreal documentWidth = document . idealWidth ( ) ;
2011-04-27 12:13:26 +00:00
2011-12-13 03:56:42 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.RichText; text: \" " + richText . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
2012-02-23 04:11:48 +00:00
QCOMPARE ( textEditObject - > width ( ) , documentWidth ) ;
2011-04-27 12:13:26 +00:00
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : wrap ( )
2011-04-27 12:13:26 +00:00
{
// for specified width and wrap set true
{
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( " import QtQuick 2.0 \n TextEdit { text: \" \" ; wrapMode: TextEdit.WordWrap; width: 300 } " , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > width ( ) , 300. ) ;
}
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { wrapMode: TextEdit.WordWrap; width: 300; text: \" " + standard . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > width ( ) , 300. ) ;
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { wrapMode: TextEdit.WordWrap; width: 300; text: \" " + richText . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > width ( ) , 300. ) ;
}
2012-07-24 05:54:28 +00:00
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit {} " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QSignalSpy spy ( edit , SIGNAL ( wrapModeChanged ( ) ) ) ;
QCOMPARE ( edit - > wrapMode ( ) , QQuickTextEdit : : NoWrap ) ;
edit - > setWrapMode ( QQuickTextEdit : : Wrap ) ;
QCOMPARE ( edit - > wrapMode ( ) , QQuickTextEdit : : Wrap ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setWrapMode ( QQuickTextEdit : : Wrap ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setWrapMode ( QQuickTextEdit : : NoWrap ) ;
QCOMPARE ( edit - > wrapMode ( ) , QQuickTextEdit : : NoWrap ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
}
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : textFormat ( )
2011-04-27 12:13:26 +00:00
{
{
2012-02-16 04:43:03 +00:00
QQmlComponent textComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
textComponent . setData ( " import QtQuick 2.0 \n TextEdit { text: \" Hello \" ; textFormat: Text.RichText } " , QUrl : : fromLocalFile ( " " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( textComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textObject ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QVERIFY ( textObject - > textFormat ( ) = = QQuickTextEdit : : RichText ) ;
2011-04-27 12:13:26 +00:00
}
{
2012-02-16 04:43:03 +00:00
QQmlComponent textComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
textComponent . setData ( " import QtQuick 2.0 \n TextEdit { text: \" <b>Hello</b> \" ; textFormat: Text.PlainText } " , QUrl : : fromLocalFile ( " " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( textComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textObject ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QVERIFY ( textObject - > textFormat ( ) = = QQuickTextEdit : : PlainText ) ;
2011-04-27 12:13:26 +00:00
}
2012-07-24 05:54:28 +00:00
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit {} " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QSignalSpy spy ( edit , SIGNAL ( textFormatChanged ( TextFormat ) ) ) ;
QCOMPARE ( edit - > textFormat ( ) , QQuickTextEdit : : PlainText ) ;
edit - > setTextFormat ( QQuickTextEdit : : RichText ) ;
QCOMPARE ( edit - > textFormat ( ) , QQuickTextEdit : : RichText ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setTextFormat ( QQuickTextEdit : : RichText ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setTextFormat ( QQuickTextEdit : : PlainText ) ;
QCOMPARE ( edit - > textFormat ( ) , QQuickTextEdit : : PlainText ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
}
2011-04-27 12:13:26 +00:00
}
2014-03-06 12:37:41 +00:00
static int calcLineCount ( QTextDocument * doc )
{
int subLines = 0 ;
for ( QTextBlock it = doc - > begin ( ) ; it ! = doc - > end ( ) ; it = it . next ( ) ) {
QTextLayout * layout = it . layout ( ) ;
if ( ! layout )
continue ;
subLines + = layout - > lineCount ( ) - 1 ;
}
return doc - > lineCount ( ) + subLines ;
}
void tst_qquicktextedit : : lineCount_data ( )
{
QTest : : addColumn < QStringList > ( " texts " ) ;
QTest : : newRow ( " plaintext " ) < < standard ;
QTest : : newRow ( " richtext " ) < < richText ;
}
void tst_qquicktextedit : : lineCount ( )
{
QFETCH ( QStringList , texts ) ;
foreach ( const QString & text , texts ) {
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit { } " , QUrl ( ) ) ;
QQuickTextEdit * textedit = qobject_cast < QQuickTextEdit * > ( component . create ( ) ) ;
QVERIFY ( textedit ) ;
QTextDocument * doc = QQuickTextEditPrivate : : get ( textedit ) - > document ;
QVERIFY ( doc ) ;
textedit - > setText ( text ) ;
textedit - > setWidth ( 100.0 ) ;
QCOMPARE ( textedit - > lineCount ( ) , calcLineCount ( doc ) ) ;
textedit - > setWrapMode ( QQuickTextEdit : : Wrap ) ;
QCOMPARE ( textedit - > lineCount ( ) , calcLineCount ( doc ) ) ;
textedit - > setWidth ( 50.0 ) ;
QCOMPARE ( textedit - > lineCount ( ) , calcLineCount ( doc ) ) ;
textedit - > setWrapMode ( QQuickTextEdit : : NoWrap ) ;
QCOMPARE ( textedit - > lineCount ( ) , calcLineCount ( doc ) ) ;
}
}
2011-04-27 12:13:26 +00:00
//the alignment tests may be trivial o.oa
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : hAlign ( )
2011-04-27 12:13:26 +00:00
{
//test one align each, and then test if two align fails.
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
for ( int j = 0 ; j < hAlignmentStrings . size ( ) ; j + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { horizontalAlignment: \" " + hAlignmentStrings . at ( j ) + " \" ; text: \" " + standard . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( ( int ) textEditObject - > hAlign ( ) , ( int ) hAlignments . at ( j ) ) ;
}
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
for ( int j = 0 ; j < hAlignmentStrings . size ( ) ; j + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { horizontalAlignment: \" " + hAlignmentStrings . at ( j ) + " \" ; text: \" " + richText . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( ( int ) textEditObject - > hAlign ( ) , ( int ) hAlignments . at ( j ) ) ;
}
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : hAlign_RightToLeft ( )
2011-04-27 12:13:26 +00:00
{
2012-01-09 14:31:54 +00:00
PlatformInputContext platformInputContext ;
2012-02-03 08:07:51 +00:00
QInputMethodPrivate * inputMethodPrivate = QInputMethodPrivate : : get ( qApp - > inputMethod ( ) ) ;
inputMethodPrivate - > testContext = & platformInputContext ;
2012-01-09 14:31:54 +00:00
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " horizontalAlignment_RightToLeft.qml " ) ) ;
QQuickTextEdit * textEdit = window . rootObject ( ) - > findChild < QQuickTextEdit * > ( " text " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit ! = 0 ) ;
2013-07-22 20:40:22 +00:00
window . showNormal ( ) ;
2011-04-27 12:13:26 +00:00
2011-05-20 04:22:39 +00:00
const QString rtlText = textEdit - > text ( ) ;
2011-04-27 12:13:26 +00:00
// implicit alignment should follow the reading direction of text
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// explicitly left aligned
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignLeft ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// explicitly right aligned
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
QString textString = textEdit - > text ( ) ;
textEdit - > setText ( QString ( " <i> " ) + textString + QString ( " </i> " ) ) ;
textEdit - > resetHAlign ( ) ;
// implicitly aligned rich text should follow the reading direction of RTL text
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textEdit - > effectiveHAlign ( ) , textEdit - > hAlign ( ) ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// explicitly left aligned rich text
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignLeft ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textEdit - > effectiveHAlign ( ) , textEdit - > hAlign ( ) ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// explicitly right aligned rich text
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textEdit - > effectiveHAlign ( ) , textEdit - > hAlign ( ) ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
textEdit - > setText ( textString ) ;
// explicitly center aligned
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignHCenter ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignHCenter ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// reseted alignment should go back to following the text reading direction
textEdit - > resetHAlign ( ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// mirror the text item
2011-10-14 08:51:42 +00:00
QQuickItemPrivate : : get ( textEdit ) - > 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 ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( textEdit - > effectiveHAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// mirrored explicitly right aligned behaves as left aligned
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( textEdit - > effectiveHAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// mirrored explicitly left aligned behaves as right aligned
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignLeft ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
QCOMPARE ( textEdit - > effectiveHAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
// disable mirroring
2011-10-14 08:51:42 +00:00
QQuickItemPrivate : : get ( textEdit ) - > setLayoutMirror ( false ) ;
2011-04-27 12:13:26 +00:00
textEdit - > resetHAlign ( ) ;
// English text should be implicitly left aligned
textEdit - > setText ( " Hello world! " ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2012-07-13 01:11:31 +00:00
QVERIFY ( textEdit - > hasActiveFocus ( ) ) ;
2011-05-20 04:22:39 +00:00
textEdit - > setText ( QString ( ) ) ;
2012-07-13 01:11:31 +00:00
{ QInputMethodEvent ev ( rtlText , QList < QInputMethodEvent : : Attribute > ( ) ) ; QGuiApplication : : sendEvent ( textEdit , & ev ) ; }
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-13 01:11:31 +00:00
{ QInputMethodEvent ev ( " Hello world! " , QList < QInputMethodEvent : : Attribute > ( ) ) ; QGuiApplication : : sendEvent ( textEdit , & ev ) ; }
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
2011-05-20 04:22:39 +00:00
2011-11-09 05:09:12 +00:00
// Clear pre-edit text. TextEdit should maybe do this itself on setText, but that may be
// redundant as an actual input method may take care of it.
2012-07-13 01:11:31 +00:00
{ QInputMethodEvent ev ; QGuiApplication : : sendEvent ( textEdit , & ev ) ; }
2011-11-09 05:09:12 +00:00
2011-04-27 12:13:26 +00:00
// empty text with implicit alignment follows the system locale-based
2012-02-03 08:07:51 +00:00
// keyboard input direction from qApp->inputMethod()->inputDirection
2011-04-27 12:13:26 +00:00
textEdit - > setText ( " " ) ;
2012-01-09 14:31:54 +00:00
platformInputContext . setInputDirection ( Qt : : LeftToRight ) ;
2012-02-03 08:07:51 +00:00
QVERIFY ( qApp - > inputMethod ( ) - > inputDirection ( ) = = Qt : : LeftToRight ) ;
2012-01-09 14:31:54 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < window . width ( ) / 2 ) ;
2012-01-09 14:31:54 +00:00
QSignalSpy cursorRectangleSpy ( textEdit , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
platformInputContext . setInputDirection ( Qt : : RightToLeft ) ;
QCOMPARE ( cursorRectangleSpy . count ( ) , 1 ) ;
2012-02-03 08:07:51 +00:00
QVERIFY ( qApp - > inputMethod ( ) - > inputDirection ( ) = = Qt : : RightToLeft ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
2012-04-24 13:46:27 +00:00
// neutral text follows also input method direction
textEdit - > resetHAlign ( ) ;
textEdit - > setText ( " ()((=<> " ) ;
platformInputContext . setInputDirection ( Qt : : LeftToRight ) ;
QCOMPARE ( textEdit - > effectiveHAlign ( ) , QQuickTextEdit : : AlignLeft ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > cursorRectangle ( ) . left ( ) < window . width ( ) / 2 ) ;
2012-04-24 13:46:27 +00:00
platformInputContext . setInputDirection ( Qt : : RightToLeft ) ;
QCOMPARE ( textEdit - > effectiveHAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > cursorRectangle ( ) . left ( ) > window . width ( ) / 2 ) ;
2012-04-24 13:46:27 +00:00
2012-01-09 14:31:54 +00:00
// set input direction while having content
platformInputContext . setInputDirection ( Qt : : LeftToRight ) ;
textEdit - > setText ( " a " ) ;
textEdit - > setCursorPosition ( 1 ) ;
platformInputContext . setInputDirection ( Qt : : RightToLeft ) ;
2012-07-11 07:32:16 +00:00
QTest : : keyClick ( & window , Qt : : Key_Backspace ) ;
2012-01-09 14:31:54 +00:00
QVERIFY ( textEdit - > text ( ) . isEmpty ( ) ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > cursorRectangle ( ) . left ( ) > window . width ( ) / 2 ) ;
2012-01-09 14:31:54 +00:00
// input direction changed while not having focus
platformInputContext . setInputDirection ( Qt : : LeftToRight ) ;
textEdit - > setFocus ( false ) ;
platformInputContext . setInputDirection ( Qt : : RightToLeft ) ;
textEdit - > setFocus ( true ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > cursorRectangle ( ) . left ( ) > window . width ( ) / 2 ) ;
2012-01-09 14:31:54 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > window . width ( ) / 2 ) ;
2012-04-20 14:18:53 +00:00
// make sure editor doesn't rely on input for updating size
2012-07-11 07:32:16 +00:00
QQuickTextEdit * emptyEdit = window . rootObject ( ) - > findChild < QQuickTextEdit * > ( " emptyTextEdit " ) ;
2012-04-20 14:18:53 +00:00
QVERIFY ( emptyEdit ! = 0 ) ;
platformInputContext . setInputDirection ( Qt : : RightToLeft ) ;
emptyEdit - > setFocus ( true ) ;
QCOMPARE ( emptyEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( emptyEdit - > cursorRectangle ( ) . left ( ) > window . width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
}
2012-05-16 06:07:47 +00:00
static int numberOfNonWhitePixels ( int fromX , int toX , const QImage & image )
{
int pixels = 0 ;
for ( int x = fromX ; x < toX ; + + x ) {
for ( int y = 0 ; y < image . height ( ) ; + + y ) {
if ( image . pixel ( x , y ) ! = qRgb ( 255 , 255 , 255 ) )
pixels + + ;
}
}
return pixels ;
}
2013-07-22 13:52:54 +00:00
static inline QByteArray msgNotGreaterThan ( int n1 , int n2 )
{
return QByteArray : : number ( n1 ) + QByteArrayLiteral ( " is not greater than " ) + QByteArray : : number ( n2 ) ;
}
static inline QByteArray msgNotLessThan ( int n1 , int n2 )
{
return QByteArray : : number ( n1 ) + QByteArrayLiteral ( " is not less than " ) + QByteArray : : number ( n2 ) ;
}
2012-05-16 06:07:47 +00:00
void tst_qquicktextedit : : hAlignVisual ( )
{
QQuickView view ( testFileUrl ( " hAlignVisual.qml " ) ) ;
2013-07-22 13:52:54 +00:00
view . setFlags ( view . flags ( ) | Qt : : WindowStaysOnTopHint ) ; // Prevent being obscured by other windows.
2013-07-22 20:40:22 +00:00
view . showNormal ( ) ;
2012-07-24 12:56:35 +00:00
QVERIFY ( QTest : : qWaitForWindowExposed ( & view ) ) ;
2012-05-16 06:07:47 +00:00
QQuickText * text = view . rootObject ( ) - > findChild < QQuickText * > ( " textItem " ) ;
QVERIFY ( text ! = 0 ) ;
2013-07-22 13:52:54 +00:00
// Try to check whether alignment works by checking the number of black
// pixels in the thirds of the grabbed image.
const int windowWidth = 200 ;
const int textWidth = qCeil ( text - > implicitWidth ( ) ) ;
QVERIFY2 ( textWidth < windowWidth , " System font too large. " ) ;
const int sectionWidth = textWidth / 3 ;
const int centeredSection1 = ( windowWidth - textWidth ) / 2 ;
const int centeredSection2 = centeredSection1 + sectionWidth ;
const int centeredSection3 = centeredSection2 + sectionWidth ;
const int centeredSection3End = centeredSection3 + sectionWidth ;
2012-05-16 06:07:47 +00:00
{
// Left Align
2012-07-11 07:32:16 +00:00
QImage image = view . grabWindow ( ) ;
2013-07-22 13:52:54 +00:00
const int left = numberOfNonWhitePixels ( centeredSection1 , centeredSection2 , image ) ;
const int mid = numberOfNonWhitePixels ( centeredSection2 , centeredSection3 , image ) ;
const int right = numberOfNonWhitePixels ( centeredSection3 , centeredSection3End , image ) ;
QVERIFY2 ( left > mid , msgNotGreaterThan ( left , mid ) . constData ( ) ) ;
QVERIFY2 ( mid > right , msgNotGreaterThan ( mid , right ) . constData ( ) ) ;
2012-05-16 06:07:47 +00:00
}
{
// HCenter Align
text - > setHAlign ( QQuickText : : AlignHCenter ) ;
2012-07-11 07:32:16 +00:00
QImage image = view . grabWindow ( ) ;
2013-07-22 13:52:54 +00:00
const int left = numberOfNonWhitePixels ( centeredSection1 , centeredSection2 , image ) ;
const int mid = numberOfNonWhitePixels ( centeredSection2 , centeredSection3 , image ) ;
const int right = numberOfNonWhitePixels ( centeredSection3 , centeredSection3End , image ) ;
QVERIFY2 ( left < mid , msgNotLessThan ( left , mid ) . constData ( ) ) ;
QVERIFY2 ( mid > right , msgNotGreaterThan ( mid , right ) . constData ( ) ) ;
2012-05-16 06:07:47 +00:00
}
{
// Right Align
text - > setHAlign ( QQuickText : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QImage image = view . grabWindow ( ) ;
2013-07-22 13:52:54 +00:00
const int left = numberOfNonWhitePixels ( centeredSection1 , centeredSection2 , image ) ;
const int mid = numberOfNonWhitePixels ( centeredSection2 , centeredSection3 , image ) ;
const int right = numberOfNonWhitePixels ( centeredSection3 , centeredSection3End , image ) ;
image . save ( " test3.png " ) ;
QVERIFY2 ( left < mid , msgNotLessThan ( left , mid ) . constData ( ) ) ;
QVERIFY2 ( mid < right , msgNotLessThan ( mid , right ) . constData ( ) ) ;
2012-05-16 06:07:47 +00:00
}
text - > setWidth ( 200 ) ;
{
// Left Align
2012-07-11 07:32:16 +00:00
QImage image = view . grabWindow ( ) ;
2012-05-16 06:07:47 +00:00
int x = qCeil ( text - > implicitWidth ( ) ) ;
int left = numberOfNonWhitePixels ( 0 , x , image ) ;
int right = numberOfNonWhitePixels ( x , image . width ( ) - x , image ) ;
2013-07-22 13:52:54 +00:00
QVERIFY2 ( left > 0 , msgNotGreaterThan ( left , 0 ) . constData ( ) ) ;
QCOMPARE ( right , 0 ) ;
2012-05-16 06:07:47 +00:00
}
{
// HCenter Align
text - > setHAlign ( QQuickText : : AlignHCenter ) ;
2012-07-11 07:32:16 +00:00
QImage image = view . grabWindow ( ) ;
2012-05-16 06:07:47 +00:00
int x1 = qFloor ( image . width ( ) - text - > implicitWidth ( ) ) / 2 ;
int x2 = image . width ( ) - x1 ;
int left = numberOfNonWhitePixels ( 0 , x1 , image ) ;
int mid = numberOfNonWhitePixels ( x1 , x2 - x1 , image ) ;
int right = numberOfNonWhitePixels ( x2 , image . width ( ) - x2 , image ) ;
2013-07-22 13:52:54 +00:00
QCOMPARE ( left , 0 ) ;
QVERIFY2 ( mid > 0 , msgNotGreaterThan ( left , 0 ) . constData ( ) ) ;
QCOMPARE ( right , 0 ) ;
2012-05-16 06:07:47 +00:00
}
{
// Right Align
text - > setHAlign ( QQuickText : : AlignRight ) ;
2012-07-11 07:32:16 +00:00
QImage image = view . grabWindow ( ) ;
2012-05-16 06:07:47 +00:00
int x = image . width ( ) - qCeil ( text - > implicitWidth ( ) ) ;
int left = numberOfNonWhitePixels ( 0 , x , image ) ;
int right = numberOfNonWhitePixels ( x , image . width ( ) - x , image ) ;
2013-07-22 13:52:54 +00:00
QCOMPARE ( left , 0 ) ;
QVERIFY2 ( right > 0 , msgNotGreaterThan ( left , 0 ) . constData ( ) ) ;
2012-05-16 06:07:47 +00:00
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : vAlign ( )
2011-04-27 12:13:26 +00:00
{
//test one align each, and then test if two align fails.
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
for ( int j = 0 ; j < vAlignmentStrings . size ( ) ; j + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { verticalAlignment: \" " + vAlignmentStrings . at ( j ) + " \" ; text: \" " + standard . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( ( int ) textEditObject - > vAlign ( ) , ( int ) vAlignments . at ( j ) ) ;
}
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
for ( int j = 0 ; j < vAlignmentStrings . size ( ) ; j + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { verticalAlignment: \" " + vAlignmentStrings . at ( j ) + " \" ; text: \" " + richText . at ( i ) + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( ( int ) textEditObject - > vAlign ( ) , ( int ) vAlignments . at ( j ) ) ;
}
}
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2012-02-03 03:34:57 +00:00
texteditComponent . setData (
" import QtQuick 2.0 \n "
" TextEdit { width: 100; height: 100; text: \" Hello World \" } " , QUrl ( ) ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > vAlign ( ) , QQuickTextEdit : : AlignTop ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . bottom ( ) < 50 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . bottom ( ) < 50 ) ;
// bottom aligned
textEditObject - > setVAlign ( QQuickTextEdit : : AlignBottom ) ;
QCOMPARE ( textEditObject - > vAlign ( ) , QQuickTextEdit : : AlignBottom ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . top ( ) > 50 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . top ( ) > 50 ) ;
// explicitly center aligned
textEditObject - > setVAlign ( QQuickTextEdit : : AlignVCenter ) ;
QCOMPARE ( textEditObject - > vAlign ( ) , QQuickTextEdit : : AlignVCenter ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . top ( ) < 50 ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . bottom ( ) > 50 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . top ( ) < 50 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . bottom ( ) > 50 ) ;
2014-03-11 10:02:43 +00:00
// Test vertical alignment after resizing the height.
textEditObject - > setHeight ( textEditObject - > height ( ) - 20 ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . top ( ) < 40 ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . bottom ( ) > 40 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . top ( ) < 40 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . bottom ( ) > 40 ) ;
textEditObject - > setHeight ( textEditObject - > height ( ) + 40 ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . top ( ) < 60 ) ;
QVERIFY ( textEditObject - > cursorRectangle ( ) . bottom ( ) > 60 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . top ( ) < 60 ) ;
QVERIFY ( textEditObject - > positionToRectangle ( 0 ) . bottom ( ) > 60 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : 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 TextEdit { font.pointSize: 40; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > font ( ) . pointSize ( ) , 40 ) ;
QCOMPARE ( textEditObject - > font ( ) . bold ( ) , false ) ;
QCOMPARE ( textEditObject - > font ( ) . italic ( ) , false ) ;
}
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { font.bold: true; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > font ( ) . bold ( ) , true ) ;
QCOMPARE ( textEditObject - > font ( ) . italic ( ) , false ) ;
}
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { font.italic: true; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > font ( ) . italic ( ) , true ) ;
QCOMPARE ( textEditObject - > font ( ) . bold ( ) , false ) ;
}
2011-10-14 08:51:42 +00:00
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { font.family: \" Helvetica \" ; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > font ( ) . family ( ) , QString ( " Helvetica " ) ) ;
QCOMPARE ( textEditObject - > font ( ) . bold ( ) , false ) ;
QCOMPARE ( textEditObject - > font ( ) . italic ( ) , false ) ;
}
2011-10-17 11:03:58 +00:00
{
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { font.family: \" \" ; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > font ( ) . family ( ) , QString ( " " ) ) ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : color ( )
2011-04-27 12:13:26 +00:00
{
//test initial color
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ) ;
2012-07-24 05:54:28 +00:00
QCOMPARE ( textEditObject - > color ( ) , QColor ( " black " ) ) ;
QCOMPARE ( textEditObject - > selectionColor ( ) , QColor : : fromRgba ( 0xFF000080 ) ) ;
QCOMPARE ( textEditObject - > selectedTextColor ( ) , QColor ( " white " ) ) ;
QSignalSpy colorSpy ( textEditObject , SIGNAL ( colorChanged ( QColor ) ) ) ;
QSignalSpy selectionColorSpy ( textEditObject , SIGNAL ( selectionColorChanged ( QColor ) ) ) ;
QSignalSpy selectedTextColorSpy ( textEditObject , SIGNAL ( selectedTextColorChanged ( QColor ) ) ) ;
textEditObject - > setColor ( QColor ( " white " ) ) ;
QCOMPARE ( textEditObject - > color ( ) , QColor ( " white " ) ) ;
QCOMPARE ( colorSpy . count ( ) , 1 ) ;
textEditObject - > setSelectionColor ( QColor ( " black " ) ) ;
QCOMPARE ( textEditObject - > selectionColor ( ) , QColor ( " black " ) ) ;
QCOMPARE ( selectionColorSpy . count ( ) , 1 ) ;
textEditObject - > setSelectedTextColor ( QColor ( " blue " ) ) ;
QCOMPARE ( textEditObject - > selectedTextColor ( ) , QColor ( " blue " ) ) ;
QCOMPARE ( selectedTextColorSpy . count ( ) , 1 ) ;
textEditObject - > setColor ( QColor ( " white " ) ) ;
QCOMPARE ( colorSpy . count ( ) , 1 ) ;
textEditObject - > setSelectionColor ( QColor ( " black " ) ) ;
QCOMPARE ( selectionColorSpy . count ( ) , 1 ) ;
textEditObject - > setSelectedTextColor ( QColor ( " blue " ) ) ;
QCOMPARE ( selectedTextColorSpy . count ( ) , 1 ) ;
textEditObject - > setColor ( QColor ( " black " ) ) ;
QCOMPARE ( textEditObject - > color ( ) , QColor ( " black " ) ) ;
QCOMPARE ( colorSpy . count ( ) , 2 ) ;
textEditObject - > setSelectionColor ( QColor ( " blue " ) ) ;
QCOMPARE ( textEditObject - > selectionColor ( ) , QColor ( " blue " ) ) ;
QCOMPARE ( selectionColorSpy . count ( ) , 2 ) ;
textEditObject - > setSelectedTextColor ( QColor ( " white " ) ) ;
QCOMPARE ( textEditObject - > selectedTextColor ( ) , QColor ( " white " ) ) ;
QCOMPARE ( selectedTextColorSpy . count ( ) , 2 ) ;
2011-04-27 12:13:26 +00:00
}
2012-07-24 05:54:28 +00:00
2011-04-27 12:13:26 +00:00
//test normal
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 TextEdit { color: \" " + colorStrings . at ( i ) + " \" ; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
//qDebug() << "textEditObject: " << textEditObject->color() << "vs. " << QColor(colorStrings.at(i));
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > color ( ) , QColor ( colorStrings . at ( i ) ) ) ;
}
//test selection
for ( int i = 0 ; i < colorStrings . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { selectionColor: \" " + colorStrings . at ( i ) + " \" ; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > selectionColor ( ) , QColor ( colorStrings . at ( i ) ) ) ;
}
//test selected text
for ( int i = 0 ; i < colorStrings . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { selectedTextColor: \" " + colorStrings . at ( i ) + " \" ; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > selectedTextColor ( ) , QColor ( colorStrings . at ( i ) ) ) ;
}
{
QString colorStr = " #AA001234 " ;
QColor testColor ( " #001234 " ) ;
testColor . setAlpha ( 170 ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { color: \" " + colorStr + " \" ; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > color ( ) , testColor ) ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : textMargin ( )
2011-04-27 12:13:26 +00:00
{
2011-10-17 11:03:58 +00:00
for ( qreal i = 0 ; i < = 10 ; i + = 0.3 ) {
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { textMargin: " + QString : : number ( i ) + " ; text: \" Hello World \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > textMargin ( ) , i ) ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : persistentSelection ( )
2011-04-27 12:13:26 +00:00
{
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " persistentSelection.qml " ) ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2012-01-20 06:10:23 +00:00
2012-07-11 07:32:16 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
2012-01-20 06:10:23 +00:00
QVERIFY ( edit ) ;
QVERIFY ( edit - > hasActiveFocus ( ) ) ;
QSignalSpy spy ( edit , SIGNAL ( persistentSelectionChanged ( bool ) ) ) ;
QCOMPARE ( edit - > persistentSelection ( ) , false ) ;
edit - > setPersistentSelection ( false ) ;
QCOMPARE ( edit - > persistentSelection ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 0 ) ;
edit - > select ( 1 , 4 ) ;
QCOMPARE ( edit - > property ( " selected " ) . toString ( ) , QLatin1String ( " ell " ) ) ;
edit - > setFocus ( false ) ;
QCOMPARE ( edit - > property ( " selected " ) . toString ( ) , QString ( ) ) ;
edit - > setFocus ( true ) ;
QCOMPARE ( edit - > property ( " selected " ) . toString ( ) , QString ( ) ) ;
edit - > setPersistentSelection ( true ) ;
QCOMPARE ( edit - > persistentSelection ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > select ( 1 , 4 ) ;
QCOMPARE ( edit - > property ( " selected " ) . toString ( ) , QLatin1String ( " ell " ) ) ;
edit - > setFocus ( false ) ;
QCOMPARE ( edit - > property ( " selected " ) . toString ( ) , QLatin1String ( " ell " ) ) ;
edit - > setFocus ( true ) ;
QCOMPARE ( edit - > property ( " selected " ) . toString ( ) , QLatin1String ( " ell " ) ) ;
2011-04-27 12:13:26 +00:00
}
2013-03-05 13:56:10 +00:00
void tst_qquicktextedit : : selectionOnFocusOut ( )
{
QQuickView window ( testFileUrl ( " focusOutSelection.qml " ) ) ;
window . show ( ) ;
window . requestActivate ( ) ;
QTest : : qWaitForWindowActive ( & window ) ;
QPoint p1 ( 25 , 35 ) ;
QPoint p2 ( 25 , 85 ) ;
QQuickTextEdit * edit1 = window . rootObject ( ) - > findChild < QQuickTextEdit * > ( " text1 " ) ;
QQuickTextEdit * edit2 = window . rootObject ( ) - > findChild < QQuickTextEdit * > ( " text2 " ) ;
QTest : : mouseClick ( & window , Qt : : LeftButton , 0 , p1 ) ;
QVERIFY ( edit1 - > hasActiveFocus ( ) ) ;
QVERIFY ( ! edit2 - > hasActiveFocus ( ) ) ;
edit1 - > selectAll ( ) ;
QCOMPARE ( edit1 - > selectedText ( ) , QLatin1String ( " text 1 " ) ) ;
QTest : : mouseClick ( & window , Qt : : LeftButton , 0 , p2 ) ;
QCOMPARE ( edit1 - > selectedText ( ) , QLatin1String ( " " ) ) ;
QVERIFY ( ! edit1 - > hasActiveFocus ( ) ) ;
QVERIFY ( edit2 - > hasActiveFocus ( ) ) ;
edit2 - > selectAll ( ) ;
QCOMPARE ( edit2 - > selectedText ( ) , QLatin1String ( " text 2 " ) ) ;
edit2 - > setFocus ( false , Qt : : ActiveWindowFocusReason ) ;
QVERIFY ( ! edit2 - > hasActiveFocus ( ) ) ;
QCOMPARE ( edit2 - > selectedText ( ) , QLatin1String ( " text 2 " ) ) ;
edit2 - > setFocus ( true ) ;
QVERIFY ( edit2 - > hasActiveFocus ( ) ) ;
edit2 - > setFocus ( false , Qt : : PopupFocusReason ) ;
2014-01-22 13:25:48 +00:00
QVERIFY ( edit2 - > hasActiveFocus ( ) ) ;
2013-03-05 13:56:10 +00:00
QCOMPARE ( edit2 - > selectedText ( ) , QLatin1String ( " text 2 " ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : focusOnPress ( )
2011-04-27 12:13:26 +00:00
{
2012-03-12 05:49:26 +00:00
QString componentStr =
" import QtQuick 2.0 \n "
" TextEdit { \n "
" property bool selectOnFocus: false \n "
" width: 100; height: 50 \n "
" activeFocusOnPress: true \n "
" text: \" Hello World \" \n "
" onFocusChanged: { if (focus && selectOnFocus) selectAll() } "
" } " ;
QQmlComponent texteditComponent ( & engine ) ;
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
QVERIFY ( textEditObject ! = 0 ) ;
QCOMPARE ( textEditObject - > focusOnPress ( ) , true ) ;
QCOMPARE ( textEditObject - > hasFocus ( ) , false ) ;
2011-04-27 12:13:26 +00:00
2012-03-12 05:49:26 +00:00
QSignalSpy focusSpy ( textEditObject , SIGNAL ( focusChanged ( bool ) ) ) ;
QSignalSpy activeFocusSpy ( textEditObject , SIGNAL ( focusChanged ( bool ) ) ) ;
QSignalSpy activeFocusOnPressSpy ( textEditObject , SIGNAL ( activeFocusOnPressChanged ( bool ) ) ) ;
textEditObject - > setFocusOnPress ( true ) ;
QCOMPARE ( textEditObject - > focusOnPress ( ) , true ) ;
QCOMPARE ( activeFocusOnPressSpy . count ( ) , 0 ) ;
2012-07-11 07:32:16 +00:00
QQuickWindow window ;
window . resize ( 100 , 50 ) ;
2012-08-07 01:26:37 +00:00
textEditObject - > setParentItem ( window . contentItem ( ) ) ;
2013-07-22 20:40:22 +00:00
window . showNormal ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2012-03-12 05:49:26 +00:00
QCOMPARE ( textEditObject - > hasFocus ( ) , false ) ;
QCOMPARE ( textEditObject - > hasActiveFocus ( ) , false ) ;
2012-07-11 07:32:16 +00:00
QPoint centerPoint ( window . width ( ) / 2 , window . height ( ) / 2 ) ;
2012-03-12 05:49:26 +00:00
Qt : : KeyboardModifiers noModifiers = 0 ;
2012-07-11 07:32:16 +00:00
QTest : : mousePress ( & window , Qt : : LeftButton , noModifiers , centerPoint ) ;
2012-03-12 05:49:26 +00:00
QGuiApplication : : processEvents ( ) ;
QCOMPARE ( textEditObject - > hasFocus ( ) , true ) ;
QCOMPARE ( textEditObject - > hasActiveFocus ( ) , true ) ;
QCOMPARE ( focusSpy . count ( ) , 1 ) ;
QCOMPARE ( activeFocusSpy . count ( ) , 1 ) ;
QCOMPARE ( textEditObject - > selectedText ( ) , QString ( ) ) ;
2012-07-11 07:32:16 +00:00
QTest : : mouseRelease ( & window , Qt : : LeftButton , noModifiers , centerPoint ) ;
2012-03-12 05:49:26 +00:00
textEditObject - > setFocusOnPress ( false ) ;
QCOMPARE ( textEditObject - > focusOnPress ( ) , false ) ;
QCOMPARE ( activeFocusOnPressSpy . count ( ) , 1 ) ;
textEditObject - > setFocus ( false ) ;
QCOMPARE ( textEditObject - > hasFocus ( ) , false ) ;
QCOMPARE ( textEditObject - > hasActiveFocus ( ) , false ) ;
QCOMPARE ( focusSpy . count ( ) , 2 ) ;
QCOMPARE ( activeFocusSpy . count ( ) , 2 ) ;
// Wait for double click timeout to expire before clicking again.
QTest : : qWait ( 400 ) ;
2012-07-11 07:32:16 +00:00
QTest : : mousePress ( & window , Qt : : LeftButton , noModifiers , centerPoint ) ;
2012-03-12 05:49:26 +00:00
QGuiApplication : : processEvents ( ) ;
QCOMPARE ( textEditObject - > hasFocus ( ) , false ) ;
QCOMPARE ( textEditObject - > hasActiveFocus ( ) , false ) ;
QCOMPARE ( focusSpy . count ( ) , 2 ) ;
QCOMPARE ( activeFocusSpy . count ( ) , 2 ) ;
2012-07-11 07:32:16 +00:00
QTest : : mouseRelease ( & window , Qt : : LeftButton , noModifiers , centerPoint ) ;
2012-03-12 05:49:26 +00:00
textEditObject - > setFocusOnPress ( true ) ;
QCOMPARE ( textEditObject - > focusOnPress ( ) , true ) ;
QCOMPARE ( activeFocusOnPressSpy . count ( ) , 2 ) ;
// Test a selection made in the on(Active)FocusChanged handler isn't overwritten.
textEditObject - > setProperty ( " selectOnFocus " , true ) ;
QTest : : qWait ( 400 ) ;
2012-07-11 07:32:16 +00:00
QTest : : mousePress ( & window , Qt : : LeftButton , noModifiers , centerPoint ) ;
2012-03-12 05:49:26 +00:00
QGuiApplication : : processEvents ( ) ;
QCOMPARE ( textEditObject - > hasFocus ( ) , true ) ;
QCOMPARE ( textEditObject - > hasActiveFocus ( ) , true ) ;
QCOMPARE ( focusSpy . count ( ) , 3 ) ;
QCOMPARE ( activeFocusSpy . count ( ) , 3 ) ;
QCOMPARE ( textEditObject - > selectedText ( ) , textEditObject - > text ( ) ) ;
2012-07-11 07:32:16 +00:00
QTest : : mouseRelease ( & window , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : selection ( )
2011-04-27 12:13:26 +00:00
{
QString testStr = standard [ 0 ] ; //TODO: What should happen for multiline/rich text?
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + testStr + " \" ; } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 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
textEditObject - > setCursorPosition ( i ) ;
QCOMPARE ( textEditObject - > cursorPosition ( ) , i ) ;
QCOMPARE ( textEditObject - > selectionStart ( ) , i ) ;
QCOMPARE ( textEditObject - > selectionEnd ( ) , i ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
}
textEditObject - > setCursorPosition ( 0 ) ;
QVERIFY ( textEditObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
// Verify invalid positions are ignored.
textEditObject - > setCursorPosition ( - 1 ) ;
QVERIFY ( textEditObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
textEditObject - > setCursorPosition ( textEditObject - > text ( ) . count ( ) + 1 ) ;
QVERIFY ( textEditObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textEditObject - > 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
textEditObject - > select ( 0 , i ) ;
QCOMPARE ( testStr . mid ( 0 , i ) , textEditObject - > 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
textEditObject - > select ( i , testStr . size ( ) ) ;
QCOMPARE ( testStr . mid ( i , testStr . size ( ) - i ) , textEditObject - > selectedText ( ) ) ;
}
textEditObject - > setCursorPosition ( 0 ) ;
QVERIFY ( textEditObject - > cursorPosition ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionStart ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectionEnd ( ) = = 0 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
//Test Error Ignoring behaviour
textEditObject - > setCursorPosition ( 0 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
textEditObject - > select ( - 10 , 0 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
textEditObject - > select ( 100 , 101 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
textEditObject - > select ( 0 , - 10 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
textEditObject - > select ( 0 , 100 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
textEditObject - > select ( 0 , 10 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . size ( ) = = 10 ) ;
textEditObject - > select ( - 10 , 0 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . size ( ) = = 10 ) ;
textEditObject - > select ( 100 , 101 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . size ( ) = = 10 ) ;
textEditObject - > select ( 0 , - 10 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . size ( ) = = 10 ) ;
textEditObject - > select ( 0 , 100 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . size ( ) = = 10 ) ;
textEditObject - > deselect ( ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
textEditObject - > select ( 0 , 10 ) ;
QVERIFY ( textEditObject - > selectedText ( ) . size ( ) = = 10 ) ;
textEditObject - > deselect ( ) ;
QVERIFY ( textEditObject - > selectedText ( ) . isNull ( ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : 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_qquicktextedit : : 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
QQuickTextEdit textEdit ;
2011-04-27 12:13:26 +00:00
textEdit . setText ( text ) ;
// first test that the right string is delivered to the QString::isRightToLeft()
QCOMPARE ( textEdit . isRightToLeft ( 0 , 0 ) , text . mid ( 0 , 0 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textEdit . isRightToLeft ( 0 , 1 ) , text . mid ( 0 , 1 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textEdit . isRightToLeft ( text . count ( ) - 2 , text . count ( ) - 1 ) , text . mid ( text . count ( ) - 2 , text . count ( ) - 1 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textEdit . isRightToLeft ( text . count ( ) / 2 , text . count ( ) / 2 + 1 ) , text . mid ( text . count ( ) / 2 , text . count ( ) / 2 + 1 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textEdit . isRightToLeft ( 0 , text . count ( ) / 4 ) , text . mid ( 0 , text . count ( ) / 4 ) . isRightToLeft ( ) ) ;
QCOMPARE ( textEdit . 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 TextEdit: isRightToLeft(start, end) called with the end property being smaller than the start. " ) ;
QCOMPARE ( textEdit . 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 ( textEdit . isRightToLeft ( 0 , 0 ) , emptyString ) ;
QCOMPARE ( textEdit . isRightToLeft ( 0 , 1 ) , firstCharacter ) ;
QCOMPARE ( textEdit . isRightToLeft ( text . count ( ) - 2 , text . count ( ) - 1 ) , lastCharacter ) ;
QCOMPARE ( textEdit . isRightToLeft ( text . count ( ) / 2 , text . count ( ) / 2 + 1 ) , middleCharacter ) ;
QCOMPARE ( textEdit . isRightToLeft ( 0 , text . count ( ) / 4 ) , startString ) ;
QCOMPARE ( textEdit . isRightToLeft ( text . count ( ) / 4 , 3 * text . count ( ) / 4 ) , midString ) ;
if ( text . isEmpty ( ) )
QTest : : ignoreMessage ( QtWarningMsg , " <Unknown File>: QML TextEdit: isRightToLeft(start, end) called with the end property being smaller than the start. " ) ;
QCOMPARE ( textEdit . isRightToLeft ( 3 * text . count ( ) / 4 , text . count ( ) - 1 ) , endString ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : keySelection ( )
2011-04-27 12:13:26 +00:00
{
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " navigation.qml " ) ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QQuickTextEdit * input = qobject_cast < QQuickTextEdit * > ( qvariant_cast < QObject * > ( window . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
2012-07-13 01:11:31 +00:00
QVERIFY ( input - > hasActiveFocus ( ) ) ;
2011-04-27 12:13:26 +00:00
2012-06-29 07:20:16 +00:00
QSignalSpy spy ( input , SIGNAL ( selectedTextChanged ( ) ) ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Right , Qt : : ShiftModifier ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( " a " ) ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Right ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( ) ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Right ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( ) ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left , Qt : : ShiftModifier ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( " a " ) ) ;
QCOMPARE ( spy . count ( ) , 3 ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( ) ) ;
QCOMPARE ( spy . count ( ) , 4 ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( ) ) ;
QCOMPARE ( spy . count ( ) , 4 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : 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 < QQuickTextEdit : : SelectionMode > ( " mode " ) ;
2011-04-27 12:13:26 +00:00
QTest : : addColumn < int > ( " selectionStart " ) ;
QTest : : addColumn < int > ( " selectionEnd " ) ;
QTest : : addColumn < bool > ( " reversible " ) ;
QTest : : newRow ( " (t)he|characters " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 1 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : SelectWords < < 20 < < 26 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <jumped( )>over|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 26 < < 27 < < QQuickTextEdit : : SelectWords < < 20 < < 27 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " jumped<( )over>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 27 < < 26 < < QQuickTextEdit : : SelectWords < < 26 < < 31 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(the )>quick|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 0 < < 4 < < QQuickTextEdit : : SelectWords < < 0 < < 4 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(the )quick>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 4 < < 0 < < QQuickTextEdit : : SelectWords < < 0 < < 9 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <lazy( dog)>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 40 < < 44 < < QQuickTextEdit : : SelectWords < < 36 < < 44 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " lazy<( dog)>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 44 < < 40 < < QQuickTextEdit : : SelectWords < < 40 < < 44 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <fox( jumped )>over|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 19 < < 27 < < QQuickTextEdit : : SelectWords < < 16 < < 27 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " fox<( jumped )over>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 0 ] < < 27 < < 19 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : SelectWords < < 5 < < 6 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<(, )>world|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 5 < < 7 < < QQuickTextEdit : : SelectWords < < 5 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<(, )world>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 7 < < 5 < < QQuickTextEdit : : SelectWords < < 5 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <Hel(lo, )>world|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 3 < < 7 < < QQuickTextEdit : : SelectWords < < 0 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <Hel(lo, )world>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 7 < < 3 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : SelectWords < < 6 < < 6 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<,( )>world|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 6 < < 7 < < QQuickTextEdit : : SelectWords < < 5 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello,<( )world>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 7 < < 6 < < QQuickTextEdit : : SelectWords < < 6 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<,( world)>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 6 < < 12 < < QQuickTextEdit : : SelectWords < < 5 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello,<( world)>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 12 < < 6 < < QQuickTextEdit : : SelectWords < < 6 < < 12 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello<,( world!)>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 6 < < 13 < < QQuickTextEdit : : SelectWords < < 5 < < 13 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " Hello,<( world!)>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 2 ] < < 13 < < 6 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : SelectWords < < 5 < < 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 < < 13 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : SelectWords < < 7 < < 8 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <dlrow( ,)>olleH|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 6 < < 8 < < QQuickTextEdit : : SelectWords < < 1 < < 8 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dlrow<( ,)>olleH|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 8 < < 6 < < QQuickTextEdit : : SelectWords < < 6 < < 8 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <dlrow( ,ol)leH>|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 6 < < 10 < < QQuickTextEdit : : SelectWords < < 1 < < 13 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dlrow<( ,ol)leH>|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 10 < < 6 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : SelectWords < < 7 < < 7 < < true ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <dlrow( )>,olleH|words " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 6 < < 7 < < QQuickTextEdit : : SelectWords < < 1 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " dlrow<( ),>olleH|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 6 < < QQuickTextEdit : : SelectWords < < 6 < < 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 ] < < 1 < < 7 < < QQuickTextEdit : : SelectWords < < 1 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(dlrow ),>olleH|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 1 < < QQuickTextEdit : : SelectWords < < 1 < < 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 < < 7 < < QQuickTextEdit : : SelectWords < < 0 < < 7 < < false ;
2011-04-27 12:13:26 +00:00
QTest : : newRow ( " <(!dlrow ),>olleH|words,reversed " )
2011-10-14 08:51:42 +00:00
< < standard [ 3 ] < < 7 < < 0 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : 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 < < QQuickTextEdit : : SelectWords < < 1 < < 1 < < true ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : 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 ( QQuickTextEdit : : 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 TextEdit { text: \" " + testStr + " \" ; } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textinputComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
textinputComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * texteditObject = qobject_cast < QQuickTextEdit * > ( textinputComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( texteditObject ! = 0 ) ;
texteditObject - > setCursorPosition ( cursorPosition ) ;
texteditObject - > moveCursorSelection ( movePosition , mode ) ;
QCOMPARE ( texteditObject - > selectedText ( ) , testStr . mid ( selectionStart , selectionEnd - selectionStart ) ) ;
QCOMPARE ( texteditObject - > selectionStart ( ) , selectionStart ) ;
QCOMPARE ( texteditObject - > selectionEnd ( ) , selectionEnd ) ;
if ( reversible ) {
texteditObject - > setCursorPosition ( movePosition ) ;
texteditObject - > moveCursorSelection ( cursorPosition , mode ) ;
QCOMPARE ( texteditObject - > selectedText ( ) , testStr . mid ( selectionStart , selectionEnd - selectionStart ) ) ;
QCOMPARE ( texteditObject - > selectionStart ( ) , selectionStart ) ;
QCOMPARE ( texteditObject - > selectionEnd ( ) , selectionEnd ) ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : 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 " ) ;
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 ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : 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 TextEdit { text: \" " + testStr + " \" ; } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent texteditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
texteditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * texteditObject = qobject_cast < QQuickTextEdit * > ( texteditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( texteditObject ! = 0 ) ;
texteditObject - > setCursorPosition ( cursorPosition ) ;
2011-10-14 08:51:42 +00:00
texteditObject - > moveCursorSelection ( movePosition1 , QQuickTextEdit : : SelectWords ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( texteditObject - > selectedText ( ) , testStr . mid ( selection1Start , selection1End - selection1Start ) ) ;
QCOMPARE ( texteditObject - > selectionStart ( ) , selection1Start ) ;
QCOMPARE ( texteditObject - > selectionEnd ( ) , selection1End ) ;
2011-10-14 08:51:42 +00:00
texteditObject - > moveCursorSelection ( movePosition2 , QQuickTextEdit : : SelectWords ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( texteditObject - > selectedText ( ) , testStr . mid ( selection2Start , selection2End - selection2Start ) ) ;
QCOMPARE ( texteditObject - > selectionStart ( ) , selection2Start ) ;
QCOMPARE ( texteditObject - > selectionEnd ( ) , selection2End ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : mouseSelection_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " qmlfile " ) ;
2011-05-09 03:57:34 +00:00
QTest : : addColumn < int > ( " from " ) ;
QTest : : addColumn < int > ( " to " ) ;
QTest : : addColumn < QString > ( " selectedText " ) ;
2012-03-12 05:49:26 +00:00
QTest : : addColumn < bool > ( " focus " ) ;
QTest : : addColumn < bool > ( " focusOnPress " ) ;
2012-06-28 02:23:01 +00:00
QTest : : addColumn < int > ( " clicks " ) ;
2011-04-27 12:13:26 +00:00
// import installed
2012-06-28 02:23:01 +00:00
QTest : : newRow ( " on " ) < < testFile ( " mouseselection_true.qml " ) < < 4 < < 9 < < " 45678 " < < true < < true < < 1 ;
QTest : : newRow ( " off " ) < < testFile ( " mouseselection_false.qml " ) < < 4 < < 9 < < QString ( ) < < true < < true < < 1 ;
QTest : : newRow ( " default " ) < < testFile ( " mouseselection_default.qml " ) < < 4 < < 9 < < QString ( ) < < true < < true < < 1 ;
QTest : : newRow ( " off word selection " ) < < testFile ( " mouseselection_false_words.qml " ) < < 4 < < 9 < < QString ( ) < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (4,9) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 4 < < 9 < < " 0123456789 " < < true < < true < < 1 ;
QTest : : newRow ( " on unfocused " ) < < testFile ( " mouseselection_true.qml " ) < < 4 < < 9 < < " 45678 " < < false < < false < < 1 ;
QTest : : newRow ( " on word selection (4,9) unfocused " ) < < testFile ( " mouseselection_true_words.qml " ) < < 4 < < 9 < < " 0123456789 " < < false < < false < < 1 ;
QTest : : newRow ( " on focus on press " ) < < testFile ( " mouseselection_true.qml " ) < < 4 < < 9 < < " 45678 " < < false < < true < < 1 ;
QTest : : newRow ( " on word selection (4,9) focus on press " ) < < testFile ( " mouseselection_true_words.qml " ) < < 4 < < 9 < < " 0123456789 " < < false < < true < < 1 ;
QTest : : newRow ( " on word selection (2,13) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 2 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (2,30) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 2 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (9,13) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 9 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (9,30) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 9 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (13,2) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 13 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (20,2) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 20 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (12,9) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 12 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on word selection (30,9) " ) < < testFile ( " mouseselection_true_words.qml " ) < < 30 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 1 ;
QTest : : newRow ( " on double click (4,9) " ) < < testFile ( " mouseselection_true.qml " ) < < 4 < < 9 < < " 0123456789 " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (2,13) " ) < < testFile ( " mouseselection_true.qml " ) < < 2 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (2,30) " ) < < testFile ( " mouseselection_true.qml " ) < < 2 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (9,13) " ) < < testFile ( " mouseselection_true.qml " ) < < 9 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (9,30) " ) < < testFile ( " mouseselection_true.qml " ) < < 9 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (13,2) " ) < < testFile ( " mouseselection_true.qml " ) < < 13 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (20,2) " ) < < testFile ( " mouseselection_true.qml " ) < < 20 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (12,9) " ) < < testFile ( " mouseselection_true.qml " ) < < 12 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on double click (30,9) " ) < < testFile ( " mouseselection_true.qml " ) < < 30 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " < < true < < true < < 2 ;
QTest : : newRow ( " on triple click (4,9) " ) < < testFile ( " mouseselection_true.qml " ) < < 4 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (2,13) " ) < < testFile ( " mouseselection_true.qml " ) < < 2 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (2,30) " ) < < testFile ( " mouseselection_true.qml " ) < < 2 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (9,13) " ) < < testFile ( " mouseselection_true.qml " ) < < 9 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (9,30) " ) < < testFile ( " mouseselection_true.qml " ) < < 9 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (13,2) " ) < < testFile ( " mouseselection_true.qml " ) < < 13 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (20,2) " ) < < testFile ( " mouseselection_true.qml " ) < < 20 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (12,9) " ) < < testFile ( " mouseselection_true.qml " ) < < 12 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (30,9) " ) < < testFile ( " mouseselection_true.qml " ) < < 30 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (2,40) " ) < < testFile ( " mouseselection_true.qml " ) < < 2 < < 40 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n 9876543210 \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (2,50) " ) < < testFile ( " mouseselection_true.qml " ) < < 2 < < 50 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n 9876543210 \n \n ZXYWVUTSRQPON MLKJIHGFEDCBA " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (25,40) " ) < < testFile ( " mouseselection_true.qml " ) < < 25 < < 40 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n 9876543210 \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (25,50) " ) < < testFile ( " mouseselection_true.qml " ) < < 25 < < 50 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n 9876543210 \n \n ZXYWVUTSRQPON MLKJIHGFEDCBA " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (40,25) " ) < < testFile ( " mouseselection_true.qml " ) < < 40 < < 25 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n 9876543210 \n " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (40,50) " ) < < testFile ( " mouseselection_true.qml " ) < < 40 < < 50 < < " 9876543210 \n \n ZXYWVUTSRQPON MLKJIHGFEDCBA " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (50,25) " ) < < testFile ( " mouseselection_true.qml " ) < < 50 < < 25 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ \n 9876543210 \n \n ZXYWVUTSRQPON MLKJIHGFEDCBA " < < true < < true < < 3 ;
QTest : : newRow ( " on triple click (50,40) " ) < < testFile ( " mouseselection_true.qml " ) < < 50 < < 40 < < " 9876543210 \n \n ZXYWVUTSRQPON MLKJIHGFEDCBA " < < true < < true < < 3 ;
2012-07-10 01:30:53 +00:00
QTest : : newRow ( " on tr align " ) < < testFile ( " mouseselection_align_tr.qml " ) < < 4 < < 9 < < " 45678 " < < true < < true < < 1 ;
QTest : : newRow ( " on center align " ) < < testFile ( " mouseselection_align_center.qml " ) < < 4 < < 9 < < " 45678 " < < true < < true < < 1 ;
QTest : : newRow ( " on bl align " ) < < testFile ( " mouseselection_align_bl.qml " ) < < 4 < < 9 < < " 45678 " < < true < < true < < 1 ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : mouseSelection ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , qmlfile ) ;
2011-05-09 03:57:34 +00:00
QFETCH ( int , from ) ;
QFETCH ( int , to ) ;
QFETCH ( QString , selectedText ) ;
2012-03-12 05:49:26 +00:00
QFETCH ( bool , focus ) ;
QFETCH ( bool , focusOnPress ) ;
2012-06-28 02:23:01 +00:00
QFETCH ( int , clicks ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QQuickView window ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
2012-03-12 05:49:26 +00:00
textEditObject - > setFocus ( focus ) ;
textEditObject - > setFocusOnPress ( focusOnPress ) ;
2011-04-27 12:13:26 +00:00
// press-and-drag-and-release from x1 to x2
2011-05-09 03:57:34 +00:00
QPoint p1 = textEditObject - > positionToRectangle ( from ) . center ( ) . toPoint ( ) ;
QPoint p2 = textEditObject - > positionToRectangle ( to ) . center ( ) . toPoint ( ) ;
2012-06-28 02:23:01 +00:00
if ( clicks = = 2 )
2012-07-11 07:32:16 +00:00
QTest : : mouseClick ( & window , Qt : : LeftButton , Qt : : NoModifier , p1 ) ;
2012-06-28 02:23:01 +00:00
else if ( clicks = = 3 )
2012-07-11 07:32:16 +00:00
QTest : : mouseDClick ( & window , Qt : : LeftButton , Qt : : NoModifier , p1 ) ;
QTest : : mousePress ( & window , Qt : : LeftButton , Qt : : NoModifier , p1 ) ;
QTest : : mouseMove ( & window , p2 ) ;
QTest : : mouseRelease ( & window , Qt : : LeftButton , Qt : : NoModifier , p2 ) ;
2011-09-29 02:31:30 +00:00
QTRY_COMPARE ( textEditObject - > selectedText ( ) , selectedText ) ;
2011-05-09 03:57:34 +00:00
2013-02-21 12:17:45 +00:00
QTest : : qWait ( QGuiApplication : : styleHints ( ) - > mouseDoubleClickInterval ( ) + 10 ) ;
2011-05-09 03:57:34 +00:00
// Clicking and shift to clicking between the same points should select the same text.
textEditObject - > setCursorPosition ( 0 ) ;
2012-06-28 02:23:01 +00:00
if ( clicks > 1 )
2012-07-11 07:32:16 +00:00
QTest : : mouseDClick ( & window , Qt : : LeftButton , Qt : : NoModifier , p1 ) ;
2012-06-28 02:23:01 +00:00
if ( clicks ! = 2 )
2012-07-11 07:32:16 +00:00
QTest : : mouseClick ( & window , Qt : : LeftButton , Qt : : NoModifier , p1 ) ;
QTest : : mouseClick ( & window , Qt : : LeftButton , Qt : : ShiftModifier , p2 ) ;
2011-09-27 05:53:46 +00:00
QTRY_COMPARE ( textEditObject - > selectedText ( ) , selectedText ) ;
2012-06-28 02:23:01 +00:00
// ### This is to prevent double click detection from carrying over to the next test.
QTest : : qWait ( QGuiApplication : : styleHints ( ) - > mouseDoubleClickInterval ( ) + 10 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : dragMouseSelection ( )
2011-04-27 12:13:26 +00:00
{
2011-12-21 08:06:26 +00:00
QString qmlfile = testFile ( " mouseselection_true.qml " ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QQuickView window ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
// press-and-drag-and-release from x1 to x2
int x1 = 10 ;
int x2 = 70 ;
2012-06-28 02:23:01 +00:00
int y = QFontMetrics ( textEditObject - > font ( ) ) . height ( ) / 2 ;
2012-07-11 07:32:16 +00:00
QTest : : mousePress ( & window , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
QTest : : mouseMove ( & window , QPoint ( x2 , y ) ) ;
QTest : : mouseRelease ( & window , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : qWait ( 300 ) ;
QString str1 ;
QTRY_VERIFY ( ( str1 = textEditObject - > selectedText ( ) ) . length ( ) > 3 ) ;
2011-04-27 12:13:26 +00:00
// press and drag the current selection.
x1 = 40 ;
x2 = 100 ;
2012-07-11 07:32:16 +00:00
QTest : : mousePress ( & window , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
QTest : : mouseMove ( & window , QPoint ( x2 , y ) ) ;
QTest : : mouseRelease ( & window , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : qWait ( 300 ) ;
QString str2 ;
QTRY_VERIFY ( ( str2 = textEditObject - > selectedText ( ) ) . length ( ) > 3 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( str1 ! = str2 ) ; // Verify the second press and drag is a new selection and not the first moved.
2012-06-28 02:23:01 +00:00
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : mouseSelectionMode_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " qmlfile " ) ;
QTest : : addColumn < bool > ( " selectWords " ) ;
// import installed
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " SelectWords " ) < < testFile ( " mouseselectionmode_words.qml " ) < < true ;
QTest : : newRow ( " SelectCharacters " ) < < testFile ( " mouseselectionmode_characters.qml " ) < < false ;
QTest : : newRow ( " default " ) < < testFile ( " mouseselectionmode_default.qml " ) < < false ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : mouseSelectionMode ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , qmlfile ) ;
QFETCH ( bool , selectWords ) ;
QString text = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
2012-07-11 07:32:16 +00:00
QQuickView window ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
// press-and-drag-and-release from x1 to x2
int x1 = 10 ;
int x2 = 70 ;
int y = textEditObject - > height ( ) / 2 ;
2012-07-11 07:32:16 +00:00
QTest : : mousePress ( & window , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
QTest : : mouseMove ( & window , QPoint ( x2 , y ) ) ;
QTest : : mouseRelease ( & window , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
2011-04-27 12:13:26 +00:00
QString str = textEditObject - > selectedText ( ) ;
if ( selectWords ) {
2011-09-27 05:53:46 +00:00
QTRY_COMPARE ( textEditObject - > selectedText ( ) , text ) ;
2011-04-27 12:13:26 +00:00
} else {
2011-09-27 05:53:46 +00:00
QTRY_VERIFY ( textEditObject - > selectedText ( ) . length ( ) > 3 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( str ! = text ) ;
}
}
2012-07-24 05:54:28 +00:00
void tst_qquicktextedit : : mouseSelectionMode_accessors ( )
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit {} " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QSignalSpy spy ( edit , SIGNAL ( mouseSelectionModeChanged ( SelectionMode ) ) ) ;
QCOMPARE ( edit - > mouseSelectionMode ( ) , QQuickTextEdit : : SelectCharacters ) ;
edit - > setMouseSelectionMode ( QQuickTextEdit : : SelectWords ) ;
QCOMPARE ( edit - > mouseSelectionMode ( ) , QQuickTextEdit : : SelectWords ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setMouseSelectionMode ( QQuickTextEdit : : SelectWords ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setMouseSelectionMode ( QQuickTextEdit : : SelectCharacters ) ;
QCOMPARE ( edit - > mouseSelectionMode ( ) , QQuickTextEdit : : SelectCharacters ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
}
void tst_qquicktextedit : : selectByMouse ( )
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit {} " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QSignalSpy spy ( edit , SIGNAL ( selectByMouseChanged ( bool ) ) ) ;
QCOMPARE ( edit - > selectByMouse ( ) , false ) ;
edit - > setSelectByMouse ( true ) ;
QCOMPARE ( edit - > selectByMouse ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
QCOMPARE ( spy . at ( 0 ) . at ( 0 ) . toBool ( ) , true ) ;
edit - > setSelectByMouse ( true ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setSelectByMouse ( false ) ;
QCOMPARE ( edit - > selectByMouse ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
QCOMPARE ( spy . at ( 1 ) . at ( 0 ) . toBool ( ) , false ) ;
}
2013-03-01 14:26:54 +00:00
void tst_qquicktextedit : : selectByKeyboard ( )
{
QQmlComponent oldComponent ( & engine ) ;
oldComponent . setData ( " import QtQuick 2.0 \n TextEdit { selectByKeyboard: true } " , QUrl ( ) ) ;
QVERIFY ( ! oldComponent . create ( ) ) ;
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.1 \n TextEdit { } " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QSignalSpy spy ( edit , SIGNAL ( selectByKeyboardChanged ( bool ) ) ) ;
QCOMPARE ( edit - > isReadOnly ( ) , false ) ;
QCOMPARE ( edit - > selectByKeyboard ( ) , true ) ;
edit - > setReadOnly ( true ) ;
QCOMPARE ( edit - > selectByKeyboard ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
QCOMPARE ( spy . at ( 0 ) . at ( 0 ) . toBool ( ) , false ) ;
edit - > setSelectByKeyboard ( true ) ;
QCOMPARE ( edit - > selectByKeyboard ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
QCOMPARE ( spy . at ( 1 ) . at ( 0 ) . toBool ( ) , true ) ;
edit - > setReadOnly ( false ) ;
QCOMPARE ( edit - > selectByKeyboard ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
edit - > setSelectByKeyboard ( false ) ;
QCOMPARE ( edit - > selectByKeyboard ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 3 ) ;
QCOMPARE ( spy . at ( 2 ) . at ( 0 ) . toBool ( ) , false ) ;
}
Q_DECLARE_METATYPE ( QKeySequence : : StandardKey )
void tst_qquicktextedit : : keyboardSelection_data ( )
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < bool > ( " readOnly " ) ;
QTest : : addColumn < bool > ( " selectByKeyboard " ) ;
QTest : : addColumn < int > ( " cursorPosition " ) ;
QTest : : addColumn < QKeySequence : : StandardKey > ( " standardKey " ) ;
QTest : : addColumn < QString > ( " selectedText " ) ;
QTest : : newRow ( " editable - select first char " )
< < QStringLiteral ( " editable - select first char " ) < < false < < true < < 0 < < QKeySequence : : SelectNextChar < < QStringLiteral ( " e " ) ;
QTest : : newRow ( " editable - select first word " )
< < QStringLiteral ( " editable - select first char " ) < < false < < true < < 0 < < QKeySequence : : SelectNextWord < < QStringLiteral ( " editable " ) ;
QTest : : newRow ( " editable - cannot select first char " )
< < QStringLiteral ( " editable - cannot select first char " ) < < false < < false < < 0 < < QKeySequence : : SelectNextChar < < QStringLiteral ( " " ) ;
QTest : : newRow ( " editable - cannot select first word " )
< < QStringLiteral ( " editable - cannot select first word " ) < < false < < false < < 0 < < QKeySequence : : SelectNextWord < < QStringLiteral ( " " ) ;
QTest : : newRow ( " editable - select last char " )
< < QStringLiteral ( " editable - select last char " ) < < false < < true < < 27 < < QKeySequence : : SelectPreviousChar < < QStringLiteral ( " r " ) ;
QTest : : newRow ( " editable - select last word " )
< < QStringLiteral ( " editable - select last word " ) < < false < < true < < 27 < < QKeySequence : : SelectPreviousWord < < QStringLiteral ( " word " ) ;
QTest : : newRow ( " editable - cannot select last char " )
< < QStringLiteral ( " editable - cannot select last char " ) < < false < < false < < 35 < < QKeySequence : : SelectPreviousChar < < QStringLiteral ( " " ) ;
QTest : : newRow ( " editable - cannot select last word " )
< < QStringLiteral ( " editable - cannot select last word " ) < < false < < false < < 35 < < QKeySequence : : SelectPreviousWord < < QStringLiteral ( " " ) ;
QTest : : newRow ( " read-only - cannot select first char " )
< < QStringLiteral ( " read-only - cannot select first char " ) < < true < < false < < 0 < < QKeySequence : : SelectNextChar < < QStringLiteral ( " " ) ;
QTest : : newRow ( " read-only - cannot select first word " )
< < QStringLiteral ( " read-only - cannot select first word " ) < < true < < false < < 0 < < QKeySequence : : SelectNextWord < < QStringLiteral ( " " ) ;
QTest : : newRow ( " read-only - cannot select last char " )
< < QStringLiteral ( " read-only - cannot select last char " ) < < true < < false < < 35 < < QKeySequence : : SelectPreviousChar < < QStringLiteral ( " " ) ;
QTest : : newRow ( " read-only - cannot select last word " )
< < QStringLiteral ( " read-only - cannot select last word " ) < < true < < false < < 35 < < QKeySequence : : SelectPreviousWord < < QStringLiteral ( " " ) ;
QTest : : newRow ( " read-only - select first char " )
< < QStringLiteral ( " read-only - select first char " ) < < true < < true < < 0 < < QKeySequence : : SelectNextChar < < QStringLiteral ( " r " ) ;
QTest : : newRow ( " read-only - select first word " )
< < QStringLiteral ( " read-only - select first word " ) < < true < < true < < 0 < < QKeySequence : : SelectNextWord < < QStringLiteral ( " read " ) ;
QTest : : newRow ( " read-only - select last char " )
< < QStringLiteral ( " read-only - select last char " ) < < true < < true < < 28 < < QKeySequence : : SelectPreviousChar < < QStringLiteral ( " r " ) ;
QTest : : newRow ( " read-only - select last word " )
< < QStringLiteral ( " read-only - select last word " ) < < true < < true < < 28 < < QKeySequence : : SelectPreviousWord < < QStringLiteral ( " word " ) ;
}
void tst_qquicktextedit : : keyboardSelection ( )
{
QFETCH ( QString , text ) ;
QFETCH ( bool , readOnly ) ;
QFETCH ( bool , selectByKeyboard ) ;
QFETCH ( int , cursorPosition ) ;
QFETCH ( QKeySequence : : StandardKey , standardKey ) ;
QFETCH ( QString , selectedText ) ;
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.1 \n TextEdit { focus: true } " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
edit - > setText ( text ) ;
edit - > setSelectByKeyboard ( selectByKeyboard ) ;
2013-03-19 14:04:44 +00:00
edit - > setReadOnly ( readOnly ) ;
2013-03-01 14:26:54 +00:00
edit - > setCursorPosition ( cursorPosition ) ;
QQuickWindow window ;
edit - > setParentItem ( window . contentItem ( ) ) ;
window . show ( ) ;
window . requestActivate ( ) ;
QTest : : qWaitForWindowActive ( & window ) ;
QVERIFY ( edit - > hasActiveFocus ( ) ) ;
simulateKeys ( & window , standardKey ) ;
QCOMPARE ( edit - > selectedText ( ) , selectedText ) ;
}
2012-07-24 05:54:28 +00:00
void tst_qquicktextedit : : renderType ( )
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit {} " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QSignalSpy spy ( edit , SIGNAL ( renderTypeChanged ( ) ) ) ;
QCOMPARE ( edit - > renderType ( ) , QQuickTextEdit : : QtRendering ) ;
edit - > setRenderType ( QQuickTextEdit : : NativeRendering ) ;
QCOMPARE ( edit - > renderType ( ) , QQuickTextEdit : : NativeRendering ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setRenderType ( QQuickTextEdit : : NativeRendering ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit - > setRenderType ( QQuickTextEdit : : QtRendering ) ;
QCOMPARE ( edit - > renderType ( ) , QQuickTextEdit : : QtRendering ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : inputMethodHints ( )
2011-04-27 12:13:26 +00:00
{
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " inputmethodhints.qml " ) ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QVERIFY ( textEditObject - > inputMethodHints ( ) & Qt : : ImhNoPredictiveText ) ;
2012-02-15 12:30:44 +00:00
QSignalSpy inputMethodHintSpy ( textEditObject , SIGNAL ( inputMethodHintsChanged ( ) ) ) ;
2011-04-27 12:13:26 +00:00
textEditObject - > setInputMethodHints ( Qt : : ImhUppercaseOnly ) ;
QVERIFY ( textEditObject - > inputMethodHints ( ) & Qt : : ImhUppercaseOnly ) ;
2012-02-15 12:30:44 +00:00
QCOMPARE ( inputMethodHintSpy . count ( ) , 1 ) ;
textEditObject - > setInputMethodHints ( Qt : : ImhUppercaseOnly ) ;
QCOMPARE ( inputMethodHintSpy . count ( ) , 1 ) ;
QQuickTextEdit plainTextEdit ;
QCOMPARE ( plainTextEdit . inputMethodHints ( ) , Qt : : ImhNone ) ;
2011-04-27 12:13:26 +00:00
}
2012-07-10 01:30:53 +00:00
void tst_qquicktextedit : : positionAt_data ( )
{
QTest : : addColumn < QQuickTextEdit : : HAlignment > ( " horizontalAlignment " ) ;
QTest : : addColumn < QQuickTextEdit : : VAlignment > ( " verticalAlignment " ) ;
QTest : : newRow ( " top-left " ) < < QQuickTextEdit : : AlignLeft < < QQuickTextEdit : : AlignTop ;
QTest : : newRow ( " bottom-left " ) < < QQuickTextEdit : : AlignLeft < < QQuickTextEdit : : AlignBottom ;
QTest : : newRow ( " center-left " ) < < QQuickTextEdit : : AlignLeft < < QQuickTextEdit : : AlignVCenter ;
QTest : : newRow ( " top-right " ) < < QQuickTextEdit : : AlignRight < < QQuickTextEdit : : AlignTop ;
QTest : : newRow ( " top-center " ) < < QQuickTextEdit : : AlignHCenter < < QQuickTextEdit : : AlignTop ;
QTest : : newRow ( " center " ) < < QQuickTextEdit : : AlignHCenter < < QQuickTextEdit : : AlignVCenter ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : positionAt ( )
2011-04-27 12:13:26 +00:00
{
2012-07-10 01:30:53 +00:00
QFETCH ( QQuickTextEdit : : HAlignment , horizontalAlignment ) ;
QFETCH ( QQuickTextEdit : : VAlignment , verticalAlignment ) ;
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " positionAt.qml " ) ) ;
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QQuickTextEdit * texteditObject = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( texteditObject ! = 0 ) ;
2012-07-10 01:30:53 +00:00
texteditObject - > setHAlign ( horizontalAlignment ) ;
texteditObject - > setVAlign ( verticalAlignment ) ;
2011-04-27 12:13:26 +00:00
2012-07-10 01:30:53 +00:00
QTextLayout layout ( texteditObject - > text ( ) . replace ( QLatin1Char ( ' \n ' ) , QChar : : LineSeparator ) ) ;
2011-12-05 01:01:15 +00:00
layout . setFont ( texteditObject - > font ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-06-01 07:45:55 +00:00
if ( ! qmlDisableDistanceField ( ) ) {
2011-11-09 03:26:36 +00:00
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
2011-12-05 01:01:15 +00:00
}
2011-06-01 07:45:55 +00:00
2011-12-05 01:01:15 +00:00
layout . beginLayout ( ) ;
QTextLine line = layout . createLine ( ) ;
2012-07-10 01:30:53 +00:00
line . setLineWidth ( texteditObject - > width ( ) ) ;
QTextLine secondLine = layout . createLine ( ) ;
secondLine . setLineWidth ( texteditObject - > width ( ) ) ;
2011-12-05 01:01:15 +00:00
layout . endLayout ( ) ;
2011-06-01 07:45:55 +00:00
2012-07-10 01:30:53 +00:00
qreal y0 ;
qreal y1 ;
switch ( verticalAlignment ) {
case QQuickTextEdit : : AlignTop :
y0 = line . height ( ) / 2 ;
y1 = line . height ( ) * 3 / 2 ;
break ;
case QQuickTextEdit : : AlignVCenter :
y0 = ( texteditObject - > height ( ) - line . height ( ) ) / 2 ;
y1 = ( texteditObject - > height ( ) + line . height ( ) ) / 2 ;
break ;
case QQuickTextEdit : : AlignBottom :
y0 = texteditObject - > height ( ) - line . height ( ) * 3 / 2 ;
y1 = texteditObject - > height ( ) - line . height ( ) / 2 ;
break ;
}
2011-12-05 01:01:15 +00:00
2014-08-11 12:30:35 +00:00
qreal xoff = 0 ;
2012-07-10 01:30:53 +00:00
switch ( horizontalAlignment ) {
case QQuickTextEdit : : AlignLeft :
break ;
case QQuickTextEdit : : AlignHCenter :
xoff = ( texteditObject - > width ( ) - secondLine . naturalTextWidth ( ) ) / 2 ;
break ;
case QQuickTextEdit : : AlignRight :
xoff = texteditObject - > width ( ) - secondLine . naturalTextWidth ( ) ;
break ;
2014-08-11 12:30:35 +00:00
default :
2012-12-19 15:18:52 +00:00
break ;
2012-07-10 01:30:53 +00:00
}
2011-12-05 01:01:15 +00:00
int pos = texteditObject - > positionAt ( texteditObject - > width ( ) / 2 , y0 ) ;
2012-07-10 01:30:53 +00:00
int widthBegin = floor ( xoff + line . cursorToX ( pos - 1 ) ) ;
int widthEnd = ceil ( xoff + line . cursorToX ( pos + 1 ) ) ;
2011-06-01 07:45:55 +00:00
2011-11-09 03:26:36 +00:00
QVERIFY ( widthBegin < = texteditObject - > width ( ) / 2 ) ;
QVERIFY ( widthEnd > = texteditObject - > width ( ) / 2 ) ;
2011-04-27 12:13:26 +00:00
const qreal x0 = texteditObject - > positionToRectangle ( pos ) . x ( ) ;
const qreal x1 = texteditObject - > positionToRectangle ( pos + 1 ) . x ( ) ;
QString preeditText = texteditObject - > text ( ) . mid ( 0 , pos ) ;
texteditObject - > setText ( texteditObject - > text ( ) . mid ( pos ) ) ;
texteditObject - > setCursorPosition ( 0 ) ;
QInputMethodEvent inputEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( ) ) ;
2012-07-13 01:11:31 +00:00
QGuiApplication : : sendEvent ( texteditObject , & inputEvent ) ;
2011-04-27 12:13:26 +00:00
// Check all points within the preedit text return the same position.
QCOMPARE ( texteditObject - > positionAt ( 0 , y0 ) , 0 ) ;
QCOMPARE ( texteditObject - > positionAt ( x0 / 2 , y0 ) , 0 ) ;
QCOMPARE ( texteditObject - > positionAt ( x0 , y0 ) , 0 ) ;
// Verify positioning returns to normal after the preedit text.
QCOMPARE ( texteditObject - > positionAt ( x1 , y0 ) , 1 ) ;
QCOMPARE ( texteditObject - > positionToRectangle ( 1 ) . x ( ) , x1 ) ;
QVERIFY ( texteditObject - > positionAt ( x0 / 2 , y1 ) > 0 ) ;
}
2013-04-22 16:14:55 +00:00
void tst_qquicktextedit : : linkInteraction ( )
2011-12-13 05:42:49 +00:00
{
2013-04-22 16:14:55 +00:00
QQuickView window ( testFileUrl ( " linkInteraction.qml " ) ) ;
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2011-12-13 05:42:49 +00:00
2012-07-11 07:32:16 +00:00
QQuickTextEdit * texteditObject = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
2011-12-13 05:42:49 +00:00
QVERIFY ( texteditObject ! = 0 ) ;
QSignalSpy spy ( texteditObject , SIGNAL ( linkActivated ( QString ) ) ) ;
2013-04-22 16:14:55 +00:00
QSignalSpy hover ( texteditObject , SIGNAL ( linkHovered ( QString ) ) ) ;
2011-12-13 05:42:49 +00:00
const QString link ( " http://example.com/ " ) ;
const QPointF linkPos = texteditObject - > positionToRectangle ( 7 ) . center ( ) ;
const QPointF textPos = texteditObject - > positionToRectangle ( 2 ) . center ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : mouseClick ( & window , Qt : : LeftButton , 0 , linkPos . toPoint ( ) ) ;
2011-12-13 05:42:49 +00:00
QTRY_COMPARE ( spy . count ( ) , 1 ) ;
2013-04-22 16:14:55 +00:00
QTRY_COMPARE ( hover . count ( ) , 1 ) ;
2011-12-13 05:42:49 +00:00
QCOMPARE ( spy . last ( ) [ 0 ] . toString ( ) , link ) ;
2013-04-22 16:14:55 +00:00
QCOMPARE ( hover . last ( ) [ 0 ] . toString ( ) , link ) ;
QCOMPARE ( texteditObject - > hoveredLink ( ) , link ) ;
2014-01-22 13:38:43 +00:00
QCOMPARE ( texteditObject - > linkAt ( linkPos . x ( ) , linkPos . y ( ) ) , link ) ;
2011-12-13 05:42:49 +00:00
2012-07-11 07:32:16 +00:00
QTest : : mouseClick ( & window , Qt : : LeftButton , 0 , textPos . toPoint ( ) ) ;
2013-04-22 16:14:55 +00:00
QTRY_COMPARE ( spy . count ( ) , 1 ) ;
QTRY_COMPARE ( hover . count ( ) , 2 ) ;
QCOMPARE ( hover . last ( ) [ 0 ] . toString ( ) , QString ( ) ) ;
QCOMPARE ( texteditObject - > hoveredLink ( ) , QString ( ) ) ;
2014-01-22 13:38:43 +00:00
QCOMPARE ( texteditObject - > linkAt ( textPos . x ( ) , textPos . y ( ) ) , QString ( ) ) ;
2011-12-13 05:42:49 +00:00
texteditObject - > setReadOnly ( true ) ;
2012-07-11 07:32:16 +00:00
QTest : : mouseClick ( & window , Qt : : LeftButton , 0 , linkPos . toPoint ( ) ) ;
2011-12-13 05:42:49 +00:00
QTRY_COMPARE ( spy . count ( ) , 2 ) ;
2013-04-22 16:14:55 +00:00
QTRY_COMPARE ( hover . count ( ) , 3 ) ;
2011-12-13 05:42:49 +00:00
QCOMPARE ( spy . last ( ) [ 0 ] . toString ( ) , link ) ;
2013-04-22 16:14:55 +00:00
QCOMPARE ( hover . last ( ) [ 0 ] . toString ( ) , link ) ;
QCOMPARE ( texteditObject - > hoveredLink ( ) , link ) ;
2014-01-22 13:38:43 +00:00
QCOMPARE ( texteditObject - > linkAt ( linkPos . x ( ) , linkPos . y ( ) ) , link ) ;
2011-12-13 05:42:49 +00:00
2012-07-11 07:32:16 +00:00
QTest : : mouseClick ( & window , Qt : : LeftButton , 0 , textPos . toPoint ( ) ) ;
2013-04-22 16:14:55 +00:00
QTRY_COMPARE ( spy . count ( ) , 2 ) ;
QTRY_COMPARE ( hover . count ( ) , 4 ) ;
QCOMPARE ( hover . last ( ) [ 0 ] . toString ( ) , QString ( ) ) ;
QCOMPARE ( texteditObject - > hoveredLink ( ) , QString ( ) ) ;
2014-01-22 13:38:43 +00:00
QCOMPARE ( texteditObject - > linkAt ( textPos . x ( ) , textPos . y ( ) ) , QString ( ) ) ;
2011-12-13 05:42:49 +00:00
}
2012-02-14 02:55:38 +00:00
void tst_qquicktextedit : : cursorDelegate_data ( )
{
QTest : : addColumn < QUrl > ( " source " ) ;
QTest : : newRow ( " out of line " ) < < testFileUrl ( " cursorTest.qml " ) ;
QTest : : newRow ( " in line " ) < < testFileUrl ( " cursorTestInline.qml " ) ;
QTest : : newRow ( " external " ) < < testFileUrl ( " cursorTestExternal.qml " ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : cursorDelegate ( )
2011-04-27 12:13:26 +00:00
{
2012-02-14 02:55:38 +00:00
QFETCH ( QUrl , source ) ;
QQuickView view ( source ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2013-01-11 11:35:01 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = view . rootObject ( ) - > findChild < QQuickTextEdit * > ( " textEditObject " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
2012-09-06 21:44:08 +00:00
// Delegate creation is deferred until focus in or cursor visibility is forced.
2012-05-04 06:07:32 +00:00
QVERIFY ( ! textEditObject - > findChild < QQuickItem * > ( " cursorInstance " ) ) ;
QVERIFY ( ! textEditObject - > isCursorVisible ( ) ) ;
2011-04-27 12:13:26 +00:00
//Test Delegate gets created
textEditObject - > setFocus ( true ) ;
2012-05-04 06:07:32 +00:00
QVERIFY ( textEditObject - > isCursorVisible ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * delegateObject = textEditObject - > 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 < = textEditObject - > text ( ) . length ( ) ; i + + ) {
2011-04-27 12:13:26 +00:00
textEditObject - > setCursorPosition ( i ) ;
2012-02-23 04:11:48 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
2011-04-27 12:13:26 +00:00
}
2011-05-09 03:57:34 +00:00
// Test delegate gets moved on mouse press.
textEditObject - > setSelectByMouse ( true ) ;
textEditObject - > setCursorPosition ( 0 ) ;
const QPoint point1 = textEditObject - > positionToRectangle ( 5 ) . center ( ) . toPoint ( ) ;
2012-03-12 00:55:25 +00:00
QTest : : qWait ( 400 ) ; //ensure this isn't treated as a double-click
2011-05-09 03:57:34 +00:00
QTest : : mouseClick ( & view , Qt : : LeftButton , 0 , point1 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_VERIFY ( textEditObject - > cursorPosition ( ) ! = 0 ) ;
2012-02-23 04:11:48 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
2011-05-09 03:57:34 +00:00
// Test delegate gets moved on mouse drag
textEditObject - > setCursorPosition ( 0 ) ;
const QPoint point2 = textEditObject - > positionToRectangle ( 10 ) . center ( ) . toPoint ( ) ;
2012-03-12 00:55:25 +00:00
QTest : : qWait ( 400 ) ; //ensure this isn't treated as a double-click
2011-05-09 03:57:34 +00:00
QTest : : mousePress ( & view , Qt : : LeftButton , 0 , point1 ) ;
QMouseEvent mv ( QEvent : : MouseMove , point2 , Qt : : LeftButton , Qt : : LeftButton , Qt : : NoModifier ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : sendEvent ( & view , & mv ) ;
2011-05-09 03:57:34 +00:00
QTest : : mouseRelease ( & view , Qt : : LeftButton , 0 , point2 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
2012-02-23 04:11:48 +00:00
QTRY_COMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
2011-05-09 03:57:34 +00:00
textEditObject - > setReadOnly ( true ) ;
textEditObject - > setCursorPosition ( 0 ) ;
2012-03-12 00:55:25 +00:00
QTest : : qWait ( 400 ) ; //ensure this isn't treated as a double-click
2011-05-09 03:57:34 +00:00
QTest : : mouseClick ( & view , Qt : : LeftButton , 0 , textEditObject - > positionToRectangle ( 5 ) . center ( ) . toPoint ( ) ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_VERIFY ( textEditObject - > cursorPosition ( ) ! = 0 ) ;
2012-02-23 04:11:48 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
2011-05-09 03:57:34 +00:00
textEditObject - > setCursorPosition ( 0 ) ;
2012-03-12 00:55:25 +00:00
QTest : : qWait ( 400 ) ; //ensure this isn't treated as a double-click
2011-05-09 03:57:34 +00:00
QTest : : mouseClick ( & view , Qt : : LeftButton , 0 , textEditObject - > positionToRectangle ( 5 ) . center ( ) . toPoint ( ) ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_VERIFY ( textEditObject - > cursorPosition ( ) ! = 0 ) ;
2012-02-23 04:11:48 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
2011-05-09 03:57:34 +00:00
2011-04-27 12:13:26 +00:00
textEditObject - > setCursorPosition ( 0 ) ;
2012-02-23 04:11:48 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
2012-04-18 07:20:24 +00:00
2012-05-25 06:41:14 +00:00
textEditObject - > setReadOnly ( false ) ;
2012-04-18 07:20:24 +00:00
// Delegate moved when text is entered
textEditObject - > setText ( QString ( ) ) ;
for ( int i = 0 ; i < 20 ; + + i ) {
QTest : : keyClick ( & view , Qt : : Key_A ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
}
// Delegate moved when text is entered by im.
textEditObject - > setText ( QString ( ) ) ;
for ( int i = 0 ; i < 20 ; + + i ) {
QInputMethodEvent event ;
event . setCommitString ( " a " ) ;
2012-05-25 06:41:14 +00:00
QGuiApplication : : sendEvent ( textEditObject , & event ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
}
// Delegate moved when text is removed by im.
for ( int i = 19 ; i > 1 ; - - i ) {
QInputMethodEvent event ;
event . setCommitString ( QString ( ) , - 1 , 1 ) ;
QGuiApplication : : sendEvent ( textEditObject , & event ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
}
{ // Delegate moved the text is changed in place by im.
QInputMethodEvent event ;
event . setCommitString ( " i " , - 1 , 1 ) ;
QGuiApplication : : sendEvent ( textEditObject , & event ) ;
2012-04-18 07:20:24 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , delegateObject - > x ( ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , delegateObject - > y ( ) ) ;
}
2011-04-27 12:13:26 +00:00
//Test Delegate gets deleted
textEditObject - > setCursorDelegate ( 0 ) ;
2011-10-14 08:51:42 +00:00
QVERIFY ( ! textEditObject - > findChild < QQuickItem * > ( " cursorInstance " ) ) ;
2011-04-27 12:13:26 +00:00
}
2012-07-09 06:33:21 +00:00
void tst_qquicktextedit : : remoteCursorDelegate ( )
{
2014-03-20 22:21:49 +00:00
TestHTTPServer server ;
QVERIFY2 ( server . listen ( SERVER_PORT ) , qPrintable ( server . errorString ( ) ) ) ;
2013-01-23 11:05:41 +00:00
server . serveDirectory ( dataDirectory ( ) , TestHTTPServer : : Delay ) ;
2012-07-09 06:33:21 +00:00
QQuickView view ;
QQmlComponent component ( view . engine ( ) , QUrl ( SERVER_ADDR " /RemoteCursor.qml " ) ) ;
view . rootContext ( ) - > setContextProperty ( " contextDelegate " , & component ) ;
view . setSource ( testFileUrl ( " cursorTestRemote.qml " ) ) ;
2013-07-22 20:40:22 +00:00
view . showNormal ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2013-01-11 11:35:01 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2012-07-09 06:33:21 +00:00
QQuickTextEdit * textEditObject = view . rootObject ( ) - > findChild < QQuickTextEdit * > ( " textEditObject " ) ;
QVERIFY ( textEditObject ! = 0 ) ;
// Delegate is created on demand, and so won't be available immediately. Focus in or
// setCursorVisible(true) will trigger creation.
QTRY_VERIFY ( ! textEditObject - > findChild < QQuickItem * > ( " cursorInstance " ) ) ;
QVERIFY ( ! textEditObject - > isCursorVisible ( ) ) ;
textEditObject - > setFocus ( true ) ;
QVERIFY ( textEditObject - > isCursorVisible ( ) ) ;
// Wait for component to load.
QTRY_COMPARE ( component . status ( ) , QQmlComponent : : Ready ) ;
QVERIFY ( textEditObject - > findChild < QQuickItem * > ( " cursorInstance " ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : cursorVisible ( )
2011-04-27 12:13:26 +00:00
{
2012-03-29 06:34:09 +00:00
QQuickTextEdit edit ;
edit . componentComplete ( ) ;
QSignalSpy spy ( & edit , SIGNAL ( cursorVisibleChanged ( bool ) ) ) ;
2011-12-21 08:06:26 +00:00
QQuickView view ( testFileUrl ( " cursorVisible.qml " ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2012-07-13 01:11:31 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
QCOMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
edit . setCursorVisible ( true ) ;
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
edit . setCursorVisible ( false ) ;
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
edit . setFocus ( true ) ;
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
edit . setParentItem ( view . rootObject ( ) ) ;
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 3 ) ;
edit . setFocus ( false ) ;
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 4 ) ;
edit . setFocus ( true ) ;
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 5 ) ;
2012-03-29 06:34:09 +00:00
QWindow alternateView ;
2011-10-24 03:57:12 +00:00
alternateView . show ( ) ;
2012-10-19 16:05:01 +00:00
alternateView . requestActivate ( ) ;
2012-07-13 01:11:31 +00:00
QTest : : qWaitForWindowActive ( & alternateView ) ;
2011-10-24 03:57:12 +00:00
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 6 ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2012-07-06 12:10:38 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 7 ) ;
2012-03-29 06:34:09 +00:00
{ // Cursor attribute with 0 length hides cursor.
QInputMethodEvent ev ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , 0 , QVariant ( ) ) ) ;
QCoreApplication : : sendEvent ( & edit , & ev ) ;
}
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 8 ) ;
{ // Cursor attribute with non zero length shows cursor.
QInputMethodEvent ev ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , 1 , QVariant ( ) ) ) ;
QCoreApplication : : sendEvent ( & edit , & ev ) ;
}
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 9 ) ;
{ // If the cursor is hidden by the input method and the text is changed it should be visible again.
QInputMethodEvent ev ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , 0 , QVariant ( ) ) ) ;
QCoreApplication : : sendEvent ( & edit , & ev ) ;
}
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 10 ) ;
edit . setText ( " something " ) ;
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 11 ) ;
{ // If the cursor is hidden by the input method and the cursor position is changed it should be visible again.
QInputMethodEvent ev ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , 0 , QVariant ( ) ) ) ;
QCoreApplication : : sendEvent ( & edit , & ev ) ;
}
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 12 ) ;
edit . setCursorPosition ( 5 ) ;
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 13 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : delegateLoading_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " qmlfile " ) ;
QTest : : addColumn < QString > ( " error " ) ;
// import installed
QTest : : newRow ( " pass " ) < < " cursorHttpTestPass.qml " < < " " ;
2013-10-30 15:59:04 +00:00
QTest : : newRow ( " fail1 " ) < < " cursorHttpTestFail1.qml " < < " http://localhost:42332/FailItem.qml: Remote host closed the connection " ;
QTest : : newRow ( " fail2 " ) < < " cursorHttpTestFail2.qml " < < " http://localhost:42332/ErrItem.qml:4:5: Fungus is not a type " ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : delegateLoading ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , qmlfile ) ;
QFETCH ( QString , error ) ;
2014-03-20 22:21:49 +00:00
TestHTTPServer server ;
QVERIFY2 ( server . listen ( SERVER_PORT ) , qPrintable ( server . errorString ( ) ) ) ;
2011-12-21 08:06:26 +00:00
server . serveDirectory ( testFile ( " httpfail " ) , TestHTTPServer : : Disconnect ) ;
server . serveDirectory ( testFile ( " httpslow " ) , TestHTTPServer : : Delay ) ;
server . serveDirectory ( testFile ( " http " ) ) ;
2011-04-27 12:13:26 +00:00
2012-07-09 06:33:21 +00:00
QQuickView view ( QUrl ( QLatin1String ( SERVER_ADDR " / " ) + qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2011-04-27 12:13:26 +00:00
if ( ! error . isEmpty ( ) ) {
QTest : : ignoreMessage ( QtWarningMsg , error . toUtf8 ( ) ) ;
2011-10-14 08:51:42 +00:00
QTRY_VERIFY ( view . status ( ) = = QQuickView : : Error ) ;
2011-04-27 12:13:26 +00:00
QTRY_VERIFY ( ! view . rootObject ( ) ) ; // there is fail item inside this test
} else {
QTRY_VERIFY ( view . rootObject ( ) ) ; //Wait for loading to finish.
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = view . rootObject ( ) - > findChild < QQuickTextEdit * > ( " textEditObject " ) ;
2011-04-27 12:13:26 +00:00
// view.rootObject()->dumpObjectTree();
QVERIFY ( textEditObject ! = 0 ) ;
textEditObject - > setFocus ( true ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * delegate ;
delegate = view . rootObject ( ) - > findChild < QQuickItem * > ( " delegateOkay " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( delegate ) ;
2011-10-14 08:51:42 +00:00
delegate = view . rootObject ( ) - > findChild < QQuickItem * > ( " delegateSlow " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( delegate ) ;
delete delegate ;
}
//A test should be added here with a component which is ready but component.create() returns null
2011-10-14 08:51:42 +00:00
//Not sure how to accomplish this with QQuickTextEdits cursor delegate
2011-04-27 12:13:26 +00:00
//###This was only needed for code coverage, and could be a case of overzealous defensive programming
2011-10-14 08:51:42 +00:00
//delegate = view.rootObject()->findChild<QQuickItem*>("delegateErrorB");
2011-04-27 12:13:26 +00:00
//QVERIFY(!delegate);
}
/*
TextEdit 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_qquicktextedit : : navigation ( )
2011-04-27 12:13:26 +00:00
{
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " navigation.qml " ) ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QQuickTextEdit * input = qobject_cast < QQuickTextEdit * > ( qvariant_cast < QObject * > ( window . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
QTRY_VERIFY ( input - > hasActiveFocus ( ) = = true ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Right ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Right ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Right ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
2012-04-27 01:06:12 +00:00
// Test left and right navigation works if the TextEdit is empty (QTBUG-25447).
input - > setText ( QString ( ) ) ;
QCOMPARE ( input - > cursorPosition ( ) , 0 ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Right ) ;
2012-04-27 01:06:12 +00:00
QCOMPARE ( input - > hasActiveFocus ( ) , false ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left ) ;
2012-04-27 01:06:12 +00:00
QCOMPARE ( input - > hasActiveFocus ( ) , true ) ;
2012-07-11 07:32:16 +00:00
simulateKey ( & window , Qt : : Key_Left ) ;
2012-04-27 01:06:12 +00:00
QCOMPARE ( input - > hasActiveFocus ( ) , false ) ;
2011-04-27 12:13:26 +00:00
}
# ifndef QT_NO_CLIPBOARD
2012-09-10 14:36:55 +00:00
void tst_qquicktextedit : : copyAndPaste ( )
{
if ( ! PlatformQuirks : : isClipboardAvailable ( ) )
QSKIP ( " This machine doesn't support the clipboard " ) ;
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" Hello world! \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit ! = 0 ) ;
// copy and paste
QCOMPARE ( textEdit - > text ( ) . length ( ) , 12 ) ;
textEdit - > select ( 0 , textEdit - > text ( ) . length ( ) ) ; ;
textEdit - > copy ( ) ;
QCOMPARE ( textEdit - > selectedText ( ) , QString ( " Hello world! " ) ) ;
QCOMPARE ( textEdit - > selectedText ( ) . length ( ) , 12 ) ;
textEdit - > setCursorPosition ( 0 ) ;
QVERIFY ( textEdit - > canPaste ( ) ) ;
textEdit - > paste ( ) ;
QCOMPARE ( textEdit - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
QCOMPARE ( textEdit - > text ( ) . length ( ) , 24 ) ;
// canPaste
QVERIFY ( textEdit - > canPaste ( ) ) ;
textEdit - > setReadOnly ( true ) ;
QVERIFY ( ! textEdit - > canPaste ( ) ) ;
2012-07-31 06:25:16 +00:00
textEdit - > paste ( ) ;
QCOMPARE ( textEdit - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
QCOMPARE ( textEdit - > text ( ) . length ( ) , 24 ) ;
2011-04-27 12:13:26 +00:00
textEdit - > setReadOnly ( false ) ;
QVERIFY ( textEdit - > canPaste ( ) ) ;
// QTBUG-12339
// test that document and internal text attribute are in sync
2011-10-14 08:51:42 +00:00
QQuickItemPrivate * pri = QQuickItemPrivate : : get ( textEdit ) ;
QQuickTextEditPrivate * editPrivate = static_cast < QQuickTextEditPrivate * > ( pri ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textEdit - > text ( ) , editPrivate - > text ) ;
2012-07-31 06:25:16 +00:00
// cut: no selection
textEdit - > cut ( ) ;
QCOMPARE ( textEdit - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
2011-04-27 12:13:26 +00:00
// select word
textEdit - > setCursorPosition ( 0 ) ;
textEdit - > selectWord ( ) ;
QCOMPARE ( textEdit - > selectedText ( ) , QString ( " Hello " ) ) ;
2012-07-31 06:25:16 +00:00
// cut: read only.
textEdit - > setReadOnly ( true ) ;
textEdit - > cut ( ) ;
QCOMPARE ( textEdit - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
textEdit - > setReadOnly ( false ) ;
2011-04-27 12:13:26 +00:00
// select all and cut
textEdit - > selectAll ( ) ;
textEdit - > cut ( ) ;
QCOMPARE ( textEdit - > text ( ) . length ( ) , 0 ) ;
textEdit - > paste ( ) ;
QCOMPARE ( textEdit - > text ( ) , QString ( " Hello world!Hello world! " ) ) ;
QCOMPARE ( textEdit - > text ( ) . length ( ) , 24 ) ;
2012-07-31 06:25:16 +00:00
// Copy first word.
textEdit - > setCursorPosition ( 0 ) ;
textEdit - > selectWord ( ) ;
textEdit - > copy ( ) ;
// copy: no selection, previous copy retained;
textEdit - > setCursorPosition ( 0 ) ;
QCOMPARE ( textEdit - > selectedText ( ) , QString ( ) ) ;
textEdit - > copy ( ) ;
textEdit - > setText ( QString ( ) ) ;
textEdit - > paste ( ) ;
QCOMPARE ( textEdit - > text ( ) , QString ( " Hello " ) ) ;
2011-04-27 12:13:26 +00:00
}
2012-09-10 14:36:55 +00:00
# endif
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2012-09-10 14:36:55 +00:00
void tst_qquicktextedit : : canPaste ( )
{
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 TextEdit { text: \" Hello world! \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit ! = 0 ) ;
// check initial value - QTBUG-17765
2012-07-05 00:18:43 +00:00
QTextDocument document ;
QQuickTextControl tc ( & document ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textEdit - > canPaste ( ) , tc . canPaste ( ) ) ;
}
2012-09-10 14:36:55 +00:00
# endif
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2012-09-10 14:36:55 +00:00
void tst_qquicktextedit : : canPasteEmpty ( )
{
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 TextEdit { text: \" Hello world! \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit ! = 0 ) ;
// check initial value - QTBUG-17765
2012-07-05 00:18:43 +00:00
QTextDocument document ;
QQuickTextControl tc ( & document ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( textEdit - > canPaste ( ) , tc . canPaste ( ) ) ;
}
2012-09-10 14:36:55 +00:00
# endif
2011-04-27 12:13:26 +00:00
2012-09-10 14:36:55 +00:00
# ifndef QT_NO_CLIPBOARD
2012-08-03 06:50:24 +00:00
void tst_qquicktextedit : : middleClickPaste ( )
{
2012-09-10 14:36:55 +00:00
if ( ! PlatformQuirks : : isClipboardAvailable ( ) )
QSKIP ( " This machine doesn't support the clipboard " ) ;
2012-08-03 06:50:24 +00:00
QQuickView window ( testFileUrl ( " mouseselection_true.qml " ) ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-08-03 06:50:24 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( window . rootObject ( ) ) ;
QVERIFY ( textEditObject ! = 0 ) ;
textEditObject - > setFocus ( true ) ;
QString originalText = textEditObject - > text ( ) ;
QString selectedText = " 234567 " ;
// press-and-drag-and-release from x1 to x2
const QPoint p1 = textEditObject - > positionToRectangle ( 2 ) . center ( ) . toPoint ( ) ;
const QPoint p2 = textEditObject - > positionToRectangle ( 8 ) . center ( ) . toPoint ( ) ;
const QPoint p3 = textEditObject - > positionToRectangle ( 1 ) . center ( ) . toPoint ( ) ;
QTest : : mousePress ( & window , Qt : : LeftButton , Qt : : NoModifier , p1 ) ;
QTest : : mouseMove ( & window , p2 ) ;
QTest : : mouseRelease ( & window , Qt : : LeftButton , Qt : : NoModifier , p2 ) ;
QTRY_COMPARE ( textEditObject - > selectedText ( ) , selectedText ) ;
// Middle click pastes the selected text, assuming the platform supports it.
QTest : : mouseClick ( & window , Qt : : MiddleButton , Qt : : NoModifier , p3 ) ;
// ### This is to prevent double click detection from carrying over to the next test.
QTest : : qWait ( QGuiApplication : : styleHints ( ) - > mouseDoubleClickInterval ( ) + 10 ) ;
if ( QGuiApplication : : clipboard ( ) - > supportsSelection ( ) )
QCOMPARE ( textEditObject - > text ( ) . mid ( 1 , selectedText . length ( ) ) , selectedText ) ;
else
QCOMPARE ( textEditObject - > text ( ) , originalText ) ;
}
2012-09-10 14:36:55 +00:00
# endif
2012-08-03 06:50:24 +00:00
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : readOnly ( )
2011-04-27 12:13:26 +00:00
{
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " readOnly.qml " ) ) ;
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( qvariant_cast < QObject * > ( window . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit ! = 0 ) ;
QTRY_VERIFY ( edit - > hasActiveFocus ( ) = = true ) ;
QVERIFY ( edit - > isReadOnly ( ) = = true ) ;
QString initial = edit - > text ( ) ;
2011-10-17 11:03:58 +00:00
for ( int k = Qt : : Key_0 ; k < = Qt : : Key_Z ; k + + )
2012-07-11 07:32:16 +00:00
simulateKey ( & window , k ) ;
simulateKey ( & window , Qt : : Key_Return ) ;
simulateKey ( & window , Qt : : Key_Space ) ;
simulateKey ( & window , Qt : : Key_Escape ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit - > text ( ) , initial ) ;
2011-07-26 00:10:50 +00:00
edit - > setCursorPosition ( 3 ) ;
edit - > setReadOnly ( false ) ;
QCOMPARE ( edit - > isReadOnly ( ) , false ) ;
QCOMPARE ( edit - > cursorPosition ( ) , edit - > text ( ) . length ( ) ) ;
2011-04-27 12:13:26 +00:00
}
2012-03-09 07:40:49 +00:00
void tst_qquicktextedit : : simulateKey ( QWindow * view , int key , Qt : : KeyboardModifiers modifiers )
2011-04-27 12:13:26 +00:00
{
QKeyEvent press ( QKeyEvent : : KeyPress , key , modifiers ) ;
QKeyEvent release ( QKeyEvent : : KeyRelease , key , modifiers ) ;
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-10-14 08:51:42 +00:00
void tst_qquicktextedit : : textInput ( )
2011-04-27 12:13:26 +00:00
{
2011-12-21 08:06:26 +00:00
QQuickView view ( testFileUrl ( " inputMethodEvent.qml " ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2012-07-13 01:11:31 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit ) ;
QVERIFY ( edit - > hasActiveFocus ( ) = = true ) ;
2011-12-09 13:15:21 +00:00
// test that input method event is committed and change signal is emitted
2012-01-11 01:00:36 +00:00
QSignalSpy spy ( edit , SIGNAL ( textChanged ( ) ) ) ;
2011-04-27 12:13:26 +00:00
QInputMethodEvent event ;
event . setCommitString ( " Hello world! " , 0 , 0 ) ;
2012-07-13 01:11:31 +00:00
QGuiApplication : : sendEvent ( edit , & event ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit - > text ( ) , QString ( " Hello world! " ) ) ;
2011-12-09 13:15:21 +00:00
QCOMPARE ( spy . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
// QTBUG-12339
// test that document and internal text attribute are in sync
2011-10-14 08:51:42 +00:00
QQuickTextEditPrivate * editPrivate = static_cast < QQuickTextEditPrivate * > ( QQuickItemPrivate : : get ( edit ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( editPrivate - > text , QString ( " Hello world! " ) ) ;
2011-12-09 13:15:21 +00:00
2012-01-20 12:07:20 +00:00
QInputMethodQueryEvent queryEvent ( Qt : : ImEnabled ) ;
2012-07-13 01:11:31 +00:00
QGuiApplication : : sendEvent ( edit , & queryEvent ) ;
2012-01-20 12:07:20 +00:00
QCOMPARE ( queryEvent . value ( Qt : : ImEnabled ) . toBool ( ) , true ) ;
edit - > setReadOnly ( true ) ;
QGuiApplication : : sendEvent ( edit , & queryEvent ) ;
QCOMPARE ( queryEvent . value ( Qt : : ImEnabled ) . toBool ( ) , false ) ;
}
2012-02-03 08:07:51 +00:00
void tst_qquicktextedit : : inputMethodUpdate ( )
2012-01-20 12:07:20 +00:00
{
PlatformInputContext platformInputContext ;
2012-02-03 08:07:51 +00:00
QInputMethodPrivate * inputMethodPrivate = QInputMethodPrivate : : get ( qApp - > inputMethod ( ) ) ;
inputMethodPrivate - > testContext = & platformInputContext ;
2012-01-20 12:07:20 +00:00
QQuickView view ( testFileUrl ( " inputMethodEvent.qml " ) ) ;
view . show ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2012-07-13 01:11:31 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2012-01-20 12:07:20 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( view . rootObject ( ) ) ;
QVERIFY ( edit ) ;
QVERIFY ( edit - > hasActiveFocus ( ) = = true ) ;
// text change even without cursor position change needs to trigger update
edit - > setText ( " test " ) ;
platformInputContext . clear ( ) ;
edit - > setText ( " xxxx " ) ;
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
// input method event replacing text
platformInputContext . clear ( ) ;
{
QInputMethodEvent inputMethodEvent ;
inputMethodEvent . setCommitString ( " y " , - 1 , 1 ) ;
QGuiApplication : : sendEvent ( edit , & inputMethodEvent ) ;
}
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
// input method changing selection
platformInputContext . clear ( ) ;
{
QList < QInputMethodEvent : : Attribute > attributes ;
attributes < < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Selection , 0 , 2 , QVariant ( ) ) ;
QInputMethodEvent inputMethodEvent ( " " , attributes ) ;
QGuiApplication : : sendEvent ( edit , & inputMethodEvent ) ;
}
QVERIFY ( edit - > selectionStart ( ) ! = edit - > selectionEnd ( ) ) ;
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
2012-01-25 12:15:29 +00:00
// programmatical selections trigger update
platformInputContext . clear ( ) ;
edit - > selectAll ( ) ;
QCOMPARE ( platformInputContext . m_updateCallCount , 1 ) ;
2012-01-20 12:07:20 +00:00
// font changes
platformInputContext . clear ( ) ;
QFont font = edit - > font ( ) ;
font . setBold ( ! font . bold ( ) ) ;
edit - > setFont ( font ) ;
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
// normal input
platformInputContext . clear ( ) ;
{
QInputMethodEvent inputMethodEvent ;
inputMethodEvent . setCommitString ( " y " ) ;
QGuiApplication : : sendEvent ( edit , & inputMethodEvent ) ;
}
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
// changing cursor position
platformInputContext . clear ( ) ;
edit - > setCursorPosition ( 0 ) ;
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
// continuing with selection
platformInputContext . clear ( ) ;
edit - > moveCursorSelection ( 1 ) ;
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
// read only disabled input method
platformInputContext . clear ( ) ;
edit - > setReadOnly ( true ) ;
QVERIFY ( platformInputContext . m_updateCallCount > 0 ) ;
edit - > setReadOnly ( false ) ;
// no updates while no focus
edit - > setFocus ( false ) ;
platformInputContext . clear ( ) ;
edit - > setText ( " Foo " ) ;
QCOMPARE ( platformInputContext . m_updateCallCount , 0 ) ;
edit - > setCursorPosition ( 1 ) ;
QCOMPARE ( platformInputContext . m_updateCallCount , 0 ) ;
edit - > selectAll ( ) ;
QCOMPARE ( platformInputContext . m_updateCallCount , 0 ) ;
edit - > setReadOnly ( true ) ;
QCOMPARE ( platformInputContext . m_updateCallCount , 0 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : openInputPanel ( )
2011-04-27 12:13:26 +00:00
{
2011-11-21 14:50:06 +00:00
PlatformInputContext platformInputContext ;
2012-02-03 08:07:51 +00:00
QInputMethodPrivate * inputMethodPrivate = QInputMethodPrivate : : get ( qApp - > inputMethod ( ) ) ;
inputMethodPrivate - > testContext = & platformInputContext ;
2011-11-21 14:50:06 +00:00
2011-12-21 08:06:26 +00:00
QQuickView view ( testFileUrl ( " openInputPanel.qml " ) ) ;
2013-07-22 20:40:22 +00:00
view . showNormal ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2012-07-13 01:11:31 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit ) ;
2011-09-28 13:56:36 +00:00
// check default values
2011-04-27 12:13:26 +00:00
QVERIFY ( edit - > focusOnPress ( ) ) ;
2011-09-28 13:56:36 +00:00
QVERIFY ( ! edit - > hasActiveFocus ( ) ) ;
2012-02-02 12:58:49 +00:00
QVERIFY ( qApp - > focusObject ( ) ! = edit ) ;
2011-11-21 14:50:06 +00:00
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , false ) ;
2011-09-28 13:56:36 +00:00
// 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 ( edit - > hasActiveFocus ( ) ) ;
2012-02-02 12:58:49 +00:00
QCOMPARE ( qApp - > focusObject ( ) , edit ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , true ) ;
2011-09-28 13:56:36 +00:00
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 TextEdit
2012-02-03 08:07:51 +00:00
qApp - > inputMethod ( ) - > hide ( ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , false ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit - > 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 ( ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , true ) ;
2011-09-28 13:56:36 +00:00
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 editor
2012-02-03 08:07:51 +00:00
QSignalSpy inputPanelVisibilitySpy ( qApp - > inputMethod ( ) , SIGNAL ( visibleChanged ( ) ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit anotherEdit ;
2011-04-27 12:13:26 +00:00
anotherEdit . setParentItem ( view . rootObject ( ) ) ;
anotherEdit . setFocus ( true ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , true ) ;
2012-02-02 12:58:49 +00:00
QCOMPARE ( qApp - > focusObject ( ) , qobject_cast < QObject * > ( & anotherEdit ) ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( inputPanelVisibilitySpy . count ( ) , 0 ) ;
anotherEdit . setFocus ( false ) ;
2012-02-02 12:58:49 +00:00
QVERIFY ( qApp - > focusObject ( ) ! = & anotherEdit ) ;
2012-08-07 01:26:37 +00:00
QCOMPARE ( view . activeFocusItem ( ) , view . contentItem ( ) ) ;
2011-09-28 13:56:36 +00:00
anotherEdit . setFocus ( true ) ;
2011-04-27 12:13:26 +00:00
2012-02-03 08:07:51 +00:00
qApp - > inputMethod ( ) - > hide ( ) ;
2011-09-28 13:56:36 +00:00
// input panel should not be opened if TextEdit is read only
edit - > setReadOnly ( true ) ;
edit - > setFocus ( true ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , false ) ;
2011-09-28 13:56:36 +00:00
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : processEvents ( ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , 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
edit - > setFocusOnPress ( false ) ;
edit - > setFocus ( false ) ;
edit - > setFocus ( true ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , false ) ;
2011-09-28 13:56:36 +00:00
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2012-04-18 19:16:21 +00:00
QCOMPARE ( qApp - > inputMethod ( ) - > isVisible ( ) , false ) ;
2011-04-27 12:13:26 +00:00
2012-02-03 08:07:51 +00:00
inputMethodPrivate - > testContext = 0 ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : geometrySignals ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " 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 ;
}
2012-09-10 14:36:55 +00:00
# ifndef QT_NO_CLIPBOARD
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : pastingRichText_QTBUG_14003 ( )
2011-04-27 12:13:26 +00:00
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.PlainText } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine ) ;
2011-04-27 12:13:26 +00:00
component . setData ( componentStr . toLatin1 ( ) , QUrl : : fromLocalFile ( " " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * obj = qobject_cast < QQuickTextEdit * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QTRY_VERIFY ( obj ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QTRY_VERIFY ( obj - > textFormat ( ) = = QQuickTextEdit : : PlainText ) ;
2011-04-27 12:13:26 +00:00
QMimeData * mData = new QMimeData ;
mData - > setHtml ( " <font color= \" red \" >Hello</font> " ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : clipboard ( ) - > setMimeData ( mData ) ;
2011-04-27 12:13:26 +00:00
obj - > paste ( ) ;
QTRY_VERIFY ( obj - > text ( ) = = " " ) ;
2011-10-14 08:51:42 +00:00
QTRY_VERIFY ( obj - > textFormat ( ) = = QQuickTextEdit : : PlainText ) ;
2011-04-27 12:13:26 +00:00
}
2012-09-10 14:36:55 +00:00
# endif
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : implicitSize_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < QString > ( " wrap " ) ;
2012-03-22 02:04:16 +00:00
QTest : : addColumn < QString > ( " format " ) ;
QTest : : newRow ( " plain " ) < < " The quick red fox jumped over the lazy brown dog " < < " TextEdit.NoWrap " < < " TextEdit.PlainText " ;
QTest : : newRow ( " richtext " ) < < " <b>The quick red fox jumped over the lazy brown dog</b> " < < " TextEdit.NoWrap " < < " TextEdit.RichText " ;
QTest : : newRow ( " plain_wrap " ) < < " The quick red fox jumped over the lazy brown dog " < < " TextEdit.Wrap " < < " TextEdit.PlainText " ;
QTest : : newRow ( " richtext_wrap " ) < < " <b>The quick red fox jumped over the lazy brown dog</b> " < < " TextEdit.Wrap " < < " TextEdit.RichText " ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : implicitSize ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , text ) ;
QFETCH ( QString , wrap ) ;
2012-03-22 02:04:16 +00:00
QFETCH ( QString , format ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + text + " \" ; width: 50; wrapMode: " + wrap + " ; textFormat: " + format + " } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textComponent ( & engine ) ;
2011-04-27 12:13:26 +00:00
textComponent . setData ( componentStr . toLatin1 ( ) , QUrl : : fromLocalFile ( " " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( textComponent . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textObject - > width ( ) < textObject - > implicitWidth ( ) ) ;
QVERIFY ( textObject - > height ( ) = = textObject - > implicitHeight ( ) ) ;
textObject - > resetWidth ( ) ;
QVERIFY ( textObject - > width ( ) = = textObject - > implicitWidth ( ) ) ;
QVERIFY ( textObject - > height ( ) = = textObject - > implicitHeight ( ) ) ;
}
2012-02-07 01:57:42 +00:00
void tst_qquicktextedit : : contentSize ( )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { width: 75; height: 16; font.pixelSize: 10 } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textComponent ( & engine ) ;
2012-02-07 01:57:42 +00:00
textComponent . setData ( componentStr . toLatin1 ( ) , QUrl : : fromLocalFile ( " " ) ) ;
QScopedPointer < QObject > object ( textComponent . create ( ) ) ;
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QSignalSpy spy ( textObject , SIGNAL ( contentSizeChanged ( ) ) ) ;
textObject - > setText ( " The quick red fox jumped over the lazy brown dog " ) ;
QVERIFY ( textObject - > contentWidth ( ) > textObject - > width ( ) ) ;
QVERIFY ( textObject - > contentHeight ( ) < textObject - > height ( ) ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
textObject - > setWrapMode ( QQuickTextEdit : : WordWrap ) ;
QVERIFY ( textObject - > contentWidth ( ) < = textObject - > width ( ) ) ;
QVERIFY ( textObject - > contentHeight ( ) > textObject - > height ( ) ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
textObject - > setText ( " The quickredfoxjumpedoverthe lazy brown dog " ) ;
QVERIFY ( textObject - > contentWidth ( ) > textObject - > width ( ) ) ;
QVERIFY ( textObject - > contentHeight ( ) > textObject - > height ( ) ) ;
QCOMPARE ( spy . count ( ) , 3 ) ;
}
2012-03-22 02:04:16 +00:00
void tst_qquicktextedit : : implicitSizeBinding_data ( )
{
implicitSize_data ( ) ;
}
void tst_qquicktextedit : : implicitSizeBinding ( )
{
QFETCH ( QString , text ) ;
QFETCH ( QString , wrap ) ;
QFETCH ( QString , format ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + text + " \" ; width: implicitWidth; height: implicitHeight; wrapMode: " + wrap + " ; textFormat: " + format + " } " ;
2012-03-26 05:13:54 +00:00
QQmlComponent textComponent ( & engine ) ;
2012-03-22 02:04:16 +00:00
textComponent . setData ( componentStr . toLatin1 ( ) , QUrl : : fromLocalFile ( " " ) ) ;
QScopedPointer < QObject > object ( textComponent . create ( ) ) ;
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QCOMPARE ( textObject - > width ( ) , textObject - > implicitWidth ( ) ) ;
QCOMPARE ( textObject - > height ( ) , textObject - > implicitHeight ( ) ) ;
textObject - > resetWidth ( ) ;
QCOMPARE ( textObject - > width ( ) , textObject - > implicitWidth ( ) ) ;
QCOMPARE ( textObject - > height ( ) , textObject - > implicitHeight ( ) ) ;
textObject - > resetHeight ( ) ;
QCOMPARE ( textObject - > width ( ) , textObject - > implicitWidth ( ) ) ;
QCOMPARE ( textObject - > height ( ) , textObject - > implicitHeight ( ) ) ;
}
2012-04-19 01:08:28 +00:00
void tst_qquicktextedit : : clipRect ( )
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit {} " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + edit - > cursorRectangle ( ) . width ( ) ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
edit - > setText ( " Hello World " ) ;
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
// XXX: TextEdit allows an extra 3 pixels boundary for the cursor beyond it's width for non
// empty text. TextInput doesn't.
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + edit - > cursorRectangle ( ) . width ( ) + 3 ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
// clip rect shouldn't exceed the size of the item, expect for the cursor width;
edit - > setWidth ( edit - > width ( ) / 2 ) ;
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + edit - > cursorRectangle ( ) . width ( ) + 3 ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
edit - > setHeight ( edit - > height ( ) * 2 ) ;
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + edit - > cursorRectangle ( ) . width ( ) + 3 ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
QQmlComponent cursorComponent ( & engine ) ;
cursorComponent . setData ( " import QtQuick 2.0 \n Rectangle { height: 20; width: 8 } " , QUrl ( ) ) ;
edit - > setCursorDelegate ( & cursorComponent ) ;
2012-05-04 06:07:32 +00:00
edit - > setCursorVisible ( true ) ;
2012-04-19 01:08:28 +00:00
// If a cursor delegate is used it's size should determine the excess width.
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + 8 + 3 ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
// Alignment and wrapping don't affect the clip rect.
edit - > setHAlign ( QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + 8 + 3 ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
edit - > setWrapMode ( QQuickTextEdit : : Wrap ) ;
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + 8 + 3 ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
edit - > setVAlign ( QQuickTextEdit : : AlignBottom ) ;
QCOMPARE ( edit - > clipRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > clipRect ( ) . width ( ) , edit - > width ( ) + 8 + 3 ) ;
QCOMPARE ( edit - > clipRect ( ) . height ( ) , edit - > height ( ) ) ;
}
void tst_qquicktextedit : : boundingRect ( )
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit {} " , QUrl ( ) ) ;
QScopedPointer < QObject > object ( component . create ( ) ) ;
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( object . data ( ) ) ;
QVERIFY ( edit ) ;
QTextLayout layout ;
layout . setFont ( edit - > font ( ) ) ;
if ( ! qmlDisableDistanceField ( ) ) {
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
}
layout . beginLayout ( ) ;
QTextLine line = layout . createLine ( ) ;
layout . endLayout ( ) ;
QCOMPARE ( edit - > boundingRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . width ( ) , edit - > cursorRectangle ( ) . width ( ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . height ( ) , line . height ( ) ) ;
edit - > setText ( " Hello World " ) ;
layout . setText ( edit - > text ( ) ) ;
layout . beginLayout ( ) ;
line = layout . createLine ( ) ;
layout . endLayout ( ) ;
QCOMPARE ( edit - > boundingRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . width ( ) , line . naturalTextWidth ( ) + edit - > cursorRectangle ( ) . width ( ) + 3 ) ;
QCOMPARE ( edit - > boundingRect ( ) . height ( ) , line . height ( ) ) ;
// the size of the bounding rect shouldn't be bounded by the size of item.
edit - > setWidth ( edit - > width ( ) / 2 ) ;
QCOMPARE ( edit - > boundingRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . width ( ) , line . naturalTextWidth ( ) + edit - > cursorRectangle ( ) . width ( ) + 3 ) ;
QCOMPARE ( edit - > boundingRect ( ) . height ( ) , line . height ( ) ) ;
edit - > setHeight ( edit - > height ( ) * 2 ) ;
QCOMPARE ( edit - > boundingRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . width ( ) , line . naturalTextWidth ( ) + edit - > cursorRectangle ( ) . width ( ) + 3 ) ;
QCOMPARE ( edit - > boundingRect ( ) . height ( ) , line . height ( ) ) ;
QQmlComponent cursorComponent ( & engine ) ;
cursorComponent . setData ( " import QtQuick 2.0 \n Rectangle { height: 20; width: 8 } " , QUrl ( ) ) ;
edit - > setCursorDelegate ( & cursorComponent ) ;
2012-05-04 06:07:32 +00:00
edit - > setCursorVisible ( true ) ;
2012-04-19 01:08:28 +00:00
// Don't include the size of a cursor delegate as it has its own bounding rect.
QCOMPARE ( edit - > boundingRect ( ) . x ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . width ( ) , line . naturalTextWidth ( ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . height ( ) , line . height ( ) ) ;
edit - > setHAlign ( QQuickTextEdit : : AlignRight ) ;
QCOMPARE ( edit - > boundingRect ( ) . x ( ) , edit - > width ( ) - line . naturalTextWidth ( ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . y ( ) , qreal ( 0 ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . width ( ) , line . naturalTextWidth ( ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . height ( ) , line . height ( ) ) ;
edit - > setWrapMode ( QQuickTextEdit : : Wrap ) ;
QCOMPARE ( edit - > boundingRect ( ) . right ( ) , edit - > width ( ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . y ( ) , qreal ( 0 ) ) ;
QVERIFY ( edit - > boundingRect ( ) . width ( ) < line . naturalTextWidth ( ) ) ;
QVERIFY ( edit - > boundingRect ( ) . height ( ) > line . height ( ) ) ;
edit - > setVAlign ( QQuickTextEdit : : AlignBottom ) ;
QCOMPARE ( edit - > boundingRect ( ) . right ( ) , edit - > width ( ) ) ;
QCOMPARE ( edit - > boundingRect ( ) . bottom ( ) , edit - > height ( ) ) ;
QVERIFY ( edit - > boundingRect ( ) . width ( ) < line . naturalTextWidth ( ) ) ;
QVERIFY ( edit - > boundingRect ( ) . height ( ) > line . height ( ) ) ;
}
2011-11-09 00:40:58 +00:00
void tst_qquicktextedit : : preeditCursorRectangle ( )
2011-04-27 12:13:26 +00:00
{
QString preeditText = " super " ;
2011-12-21 08:06:26 +00:00
QQuickView view ( testFileUrl ( " inputMethodEvent.qml " ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2012-07-13 01:11:31 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2011-05-19 06:19:44 +00:00
2011-10-14 08:51:42 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit ) ;
2012-04-18 07:20:24 +00:00
QQuickItem * cursor = edit - > findChild < QQuickItem * > ( " cursor " ) ;
QVERIFY ( cursor ) ;
2011-11-09 00:40:58 +00:00
QSignalSpy editSpy ( edit , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
2012-02-03 08:07:51 +00:00
QSignalSpy panelSpy ( qGuiApp - > inputMethod ( ) , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
2011-05-18 07:00:49 +00:00
2012-04-18 07:20:24 +00:00
QRectF currentRect ;
2011-11-09 00:40:58 +00:00
2012-07-13 01:11:31 +00:00
QCOMPARE ( QGuiApplication : : focusObject ( ) , static_cast < QObject * > ( edit ) ) ;
2011-11-09 00:40:58 +00:00
QInputMethodQueryEvent query ( Qt : : ImCursorRectangle ) ;
2012-07-13 01:11:31 +00:00
QCoreApplication : : sendEvent ( edit , & query ) ;
2012-04-18 07:20:24 +00:00
QRectF previousRect = query . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
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-09 00:40:58 +00:00
QInputMethodEvent imEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , preeditText . length ( ) , QVariant ( ) ) ) ;
2012-07-13 01:11:31 +00:00
QCoreApplication : : sendEvent ( edit , & imEvent ) ;
QCoreApplication : : sendEvent ( edit , & query ) ;
2012-04-18 07:20:24 +00:00
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
QCOMPARE ( edit - > cursorRectangle ( ) , currentRect ) ;
2012-10-22 14:59:25 +00:00
QCOMPARE ( cursor - > position ( ) , currentRect . topLeft ( ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( currentRect , previousRect ) ;
// Verify that the micro focus rect moves to the left as the cursor position
// is incremented.
2012-05-03 03:03:29 +00:00
editSpy . clear ( ) ;
panelSpy . clear ( ) ;
2011-04-27 12:13:26 +00:00
for ( int i = 1 ; i < = 5 ; + + i ) {
2011-11-09 00:40:58 +00:00
QInputMethodEvent imEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , i , preeditText . length ( ) , QVariant ( ) ) ) ;
2012-07-13 01:11:31 +00:00
QCoreApplication : : sendEvent ( edit , & imEvent ) ;
QCoreApplication : : sendEvent ( edit , & query ) ;
2012-04-18 07:20:24 +00:00
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
QCOMPARE ( edit - > cursorRectangle ( ) , currentRect ) ;
2012-10-22 14:59:25 +00:00
QCOMPARE ( cursor - > position ( ) , currentRect . topLeft ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( previousRect . left ( ) < currentRect . left ( ) ) ;
2012-04-18 07:20:24 +00:00
QCOMPARE ( editSpy . count ( ) , 1 ) ; editSpy . clear ( ) ;
QCOMPARE ( panelSpy . count ( ) , 1 ) ; panelSpy . clear ( ) ;
2011-04-27 12:13:26 +00:00
previousRect = currentRect ;
}
2012-05-03 03:03:29 +00:00
// Verify that if the cursor rectangle is updated if the pre-edit text changes
// but the (non-zero) cursor position is the same.
editSpy . clear ( ) ;
panelSpy . clear ( ) ;
{ QInputMethodEvent imEvent ( " wwwww " , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 5 , 1 , QVariant ( ) ) ) ;
2012-07-13 01:11:31 +00:00
QCoreApplication : : sendEvent ( edit , & imEvent ) ; }
QCoreApplication : : sendEvent ( edit , & query ) ;
2012-05-03 03:03:29 +00:00
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
QCOMPARE ( edit - > cursorRectangle ( ) , currentRect ) ;
2012-10-22 14:59:25 +00:00
QCOMPARE ( cursor - > position ( ) , currentRect . topLeft ( ) ) ;
2012-05-03 03:03:29 +00:00
QCOMPARE ( editSpy . count ( ) , 1 ) ;
QCOMPARE ( panelSpy . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
// 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-09 00:40:58 +00:00
editSpy . clear ( ) ;
panelSpy . clear ( ) ;
{ QInputMethodEvent imEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( ) ) ;
2012-07-13 01:11:31 +00:00
QCoreApplication : : sendEvent ( edit , & imEvent ) ; }
QCoreApplication : : sendEvent ( edit , & query ) ;
2012-04-18 07:20:24 +00:00
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
QCOMPARE ( edit - > cursorRectangle ( ) , currentRect ) ;
2012-10-22 14:59:25 +00:00
QCOMPARE ( cursor - > position ( ) , currentRect . topLeft ( ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( currentRect , previousRect ) ;
2012-04-18 07:20:24 +00:00
QCOMPARE ( editSpy . count ( ) , 1 ) ;
QCOMPARE ( panelSpy . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : inputMethodComposing ( )
2011-04-27 12:13:26 +00:00
{
QString text = " supercalifragisiticexpialidocious! " ;
2011-12-21 08:06:26 +00:00
QQuickView view ( testFileUrl ( " inputContext.qml " ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2012-10-19 16:05:01 +00:00
view . requestActivate ( ) ;
2012-07-13 01:11:31 +00:00
QTest : : qWaitForWindowActive ( & view ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit ) ;
2012-07-13 01:11:31 +00:00
QCOMPARE ( QGuiApplication : : focusObject ( ) , static_cast < QObject * > ( edit ) ) ;
2011-04-27 12:13:26 +00:00
QSignalSpy spy ( edit , SIGNAL ( inputMethodComposingChanged ( ) ) ) ;
edit - > setCursorPosition ( 12 ) ;
QCOMPARE ( edit - > isInputMethodComposing ( ) , false ) ;
{
QInputMethodEvent event ( text . mid ( 3 ) , QList < QInputMethodEvent : : Attribute > ( ) ) ;
2011-09-28 14:47:19 +00:00
QGuiApplication : : sendEvent ( edit , & event ) ;
2011-04-27 12:13:26 +00:00
}
2011-09-28 14:47:19 +00:00
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit - > isInputMethodComposing ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
{
QInputMethodEvent event ( text . mid ( 12 ) , QList < QInputMethodEvent : : Attribute > ( ) ) ;
2011-09-28 14:47:19 +00:00
QGuiApplication : : sendEvent ( edit , & 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 ( edit , & event ) ;
2011-04-27 12:13:26 +00:00
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
2012-03-29 06:34:09 +00:00
// Changing the text while not composing doesn't alter the composing state.
edit - > setText ( text . mid ( 0 , 16 ) ) ;
QCOMPARE ( edit - > isInputMethodComposing ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
{
QInputMethodEvent event ( text . mid ( 16 ) , QList < QInputMethodEvent : : Attribute > ( ) ) ;
QGuiApplication : : sendEvent ( edit , & event ) ;
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 3 ) ;
// Changing the text while composing cancels composition.
edit - > setText ( text . mid ( 0 , 12 ) ) ;
QCOMPARE ( edit - > isInputMethodComposing ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 4 ) ;
{ // Preedit cursor positioned outside (empty) preedit; composing.
QInputMethodEvent event ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , - 2 , 1 , QVariant ( ) ) ) ;
QGuiApplication : : sendEvent ( edit , & event ) ;
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 5 ) ;
{ // Cursor hidden; composing
QInputMethodEvent event ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , 0 , QVariant ( ) ) ) ;
QGuiApplication : : sendEvent ( edit , & event ) ;
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 5 ) ;
{ // Default cursor attributes; composing.
QInputMethodEvent event ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , 1 , QVariant ( ) ) ) ;
QGuiApplication : : sendEvent ( edit , & event ) ;
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 5 ) ;
{ // Selections are persisted: not composing
QInputMethodEvent event ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Selection , 2 , 4 , QVariant ( ) ) ) ;
QGuiApplication : : sendEvent ( edit , & event ) ;
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 6 ) ;
edit - > setCursorPosition ( 0 ) ;
{ // Formatting applied; composing.
QTextCharFormat format ;
format . setUnderlineStyle ( QTextCharFormat : : SingleUnderline ) ;
QInputMethodEvent event ( QString ( ) , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : TextFormat , 2 , 4 , format ) ) ;
QGuiApplication : : sendEvent ( edit , & event ) ;
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 7 ) ;
{
QInputMethodEvent event ;
QGuiApplication : : sendEvent ( edit , & event ) ;
}
QCOMPARE ( edit - > isInputMethodComposing ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 8 ) ;
2011-04-27 12:13:26 +00:00
}
2014-10-14 08:44:47 +00:00
void tst_qquicktextedit : : cursorRectangleSize_data ( )
{
QTest : : addColumn < bool > ( " useCursorDelegate " ) ;
QTest : : newRow ( " default cursor " ) < < false ;
QTest : : newRow ( " custom cursor delegate " ) < < true ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : cursorRectangleSize ( )
2011-04-27 12:13:26 +00:00
{
2014-10-14 08:44:47 +00:00
QFETCH ( bool , useCursorDelegate ) ;
2012-07-11 07:32:16 +00:00
QQuickView * window = new QQuickView ( testFileUrl ( " positionAt.qml " ) ) ;
QVERIFY ( window - > rootObject ( ) ! = 0 ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( window - > rootObject ( ) ) ;
2011-11-18 11:19:09 +00:00
2014-10-14 08:44:47 +00:00
QQmlComponent cursorDelegate ( window - > engine ( ) ) ;
if ( useCursorDelegate ) {
cursorDelegate . setData ( " import QtQuick 2.0 \n Rectangle { width:10; height:10; } " , QUrl ( ) ) ;
textEdit - > setCursorDelegate ( & cursorDelegate ) ;
}
2011-11-18 11:19:09 +00:00
// make sure cursor rectangle is not at (0,0)
textEdit - > setX ( 10 ) ;
textEdit - > setY ( 10 ) ;
textEdit - > setCursorPosition ( 3 ) ;
QVERIFY ( textEdit ! = 0 ) ;
textEdit - > setFocus ( true ) ;
2012-07-11 07:32:16 +00:00
window - > show ( ) ;
2012-10-19 16:05:01 +00:00
window - > requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( window ) ;
2011-04-27 12:13:26 +00:00
2011-09-30 10:37:51 +00:00
QInputMethodQueryEvent event ( Qt : : ImCursorRectangle ) ;
2012-07-13 01:11:31 +00:00
qApp - > sendEvent ( textEdit , & event ) ;
2011-11-18 11:19:09 +00:00
QRectF cursorRectFromQuery = event . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
2012-02-23 04:11:48 +00:00
QRectF cursorRectFromItem = textEdit - > cursorRectangle ( ) ;
2011-11-18 11:19:09 +00:00
QRectF cursorRectFromPositionToRectangle = textEdit - > positionToRectangle ( textEdit - > cursorPosition ( ) ) ;
2014-10-14 08:44:47 +00:00
QVERIFY ( cursorRectFromItem . isValid ( ) ) ;
QVERIFY ( cursorRectFromQuery . isValid ( ) ) ;
QVERIFY ( cursorRectFromPositionToRectangle . isValid ( ) ) ;
2011-11-18 11:19:09 +00:00
// item and input query cursor rectangles match
2012-02-23 04:11:48 +00:00
QCOMPARE ( cursorRectFromItem , cursorRectFromQuery ) ;
2011-11-18 11:19:09 +00:00
// item cursor rectangle and positionToRectangle calculations match
2012-02-23 04:11:48 +00:00
QCOMPARE ( cursorRectFromItem , cursorRectFromPositionToRectangle ) ;
2011-09-30 10:37:51 +00:00
2012-07-11 07:32:16 +00:00
// item-window transform and input item transform match
QCOMPARE ( QQuickItemPrivate : : get ( textEdit ) - > itemToWindowTransform ( ) , qApp - > inputMethod ( ) - > 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
2012-07-11 07:32:16 +00:00
QRectF sceneCursorRect = QQuickItemPrivate : : get ( textEdit ) - > itemToWindowTransform ( ) . mapRect ( cursorRectFromItem ) ;
2012-02-03 08:07:51 +00:00
QCOMPARE ( sceneCursorRect , qApp - > inputMethod ( ) - > cursorRectangle ( ) ) ;
2011-04-27 12:13:26 +00:00
2012-07-11 07:32:16 +00:00
delete window ;
2011-04-27 12:13:26 +00:00
}
2011-11-24 02:53:05 +00:00
void tst_qquicktextedit : : getText_data ( )
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < int > ( " start " ) ;
QTest : : addColumn < int > ( " end " ) ;
QTest : : addColumn < QString > ( " expectedText " ) ;
const QString richBoldText = QStringLiteral ( " This is some <b>bold</b> text " ) ;
const QString plainBoldText = QStringLiteral ( " This is some bold text " ) ;
2012-06-28 02:23:01 +00:00
const QString richBoldTextLB = QStringLiteral ( " This is some<br/><b>bold</b> text " ) ;
const QString plainBoldTextLB = QString ( QStringLiteral ( " This is some \n bold text " ) ) . replace ( QLatin1Char ( ' \n ' ) , QChar ( QChar : : LineSeparator ) ) ;
2011-11-24 02:53:05 +00:00
QTest : : newRow ( " all plain text " )
< < standard . at ( 0 )
< < 0 < < standard . at ( 0 ) . length ( )
< < standard . at ( 0 ) ;
QTest : : newRow ( " plain text sub string " )
< < standard . at ( 0 )
< < 0 < < 12
< < standard . at ( 0 ) . mid ( 0 , 12 ) ;
QTest : : newRow ( " plain text sub string reversed " )
< < standard . at ( 0 )
< < 12 < < 0
< < standard . at ( 0 ) . mid ( 0 , 12 ) ;
QTest : : newRow ( " plain text cropped beginning " )
< < standard . at ( 0 )
< < - 3 < < 4
< < standard . at ( 0 ) . mid ( 0 , 4 ) ;
QTest : : newRow ( " plain text cropped end " )
< < standard . at ( 0 )
< < 23 < < standard . at ( 0 ) . length ( ) + 8
< < standard . at ( 0 ) . mid ( 23 ) ;
QTest : : newRow ( " plain text cropped beginning and end " )
< < standard . at ( 0 )
< < - 9 < < standard . at ( 0 ) . length ( ) + 4
< < standard . at ( 0 ) ;
QTest : : newRow ( " all rich text " )
< < richBoldText
< < 0 < < plainBoldText . length ( )
< < plainBoldText ;
2011-11-28 04:03:34 +00:00
QTest : : newRow ( " rich text sub string " )
2011-11-24 02:53:05 +00:00
< < richBoldText
< < 14 < < 21
< < plainBoldText . mid ( 14 , 7 ) ;
2012-06-28 02:23:01 +00:00
// Line break.
QTest : : newRow ( " all plain text (line break) " )
< < standard . at ( 1 )
< < 0 < < standard . at ( 1 ) . length ( )
< < standard . at ( 1 ) ;
QTest : : newRow ( " plain text sub string (line break) " )
< < standard . at ( 1 )
< < 0 < < 12
< < standard . at ( 1 ) . mid ( 0 , 12 ) ;
QTest : : newRow ( " plain text sub string reversed (line break) " )
< < standard . at ( 1 )
< < 12 < < 0
< < standard . at ( 1 ) . mid ( 0 , 12 ) ;
QTest : : newRow ( " plain text cropped beginning (line break) " )
< < standard . at ( 1 )
< < - 3 < < 4
< < standard . at ( 1 ) . mid ( 0 , 4 ) ;
QTest : : newRow ( " plain text cropped end (line break) " )
< < standard . at ( 1 )
< < 23 < < standard . at ( 1 ) . length ( ) + 8
< < standard . at ( 1 ) . mid ( 23 ) ;
QTest : : newRow ( " plain text cropped beginning and end (line break) " )
< < standard . at ( 1 )
< < - 9 < < standard . at ( 1 ) . length ( ) + 4
< < standard . at ( 1 ) ;
QTest : : newRow ( " all rich text (line break) " )
< < richBoldTextLB
< < 0 < < plainBoldTextLB . length ( )
< < plainBoldTextLB ;
QTest : : newRow ( " rich text sub string (line break) " )
< < richBoldTextLB
< < 14 < < 21
< < plainBoldTextLB . mid ( 14 , 7 ) ;
2011-11-24 02:53:05 +00:00
}
void tst_qquicktextedit : : getText ( )
{
QFETCH ( QString , text ) ;
QFETCH ( int , start ) ;
QFETCH ( int , end ) ;
QFETCH ( QString , expectedText ) ;
2011-12-13 03:56:42 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.AutoText; text: \" " + text + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-11-24 02:53:05 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
QCOMPARE ( textEdit - > getText ( start , end ) , expectedText ) ;
}
2011-11-28 04:03:34 +00:00
void tst_qquicktextedit : : getFormattedText_data ( )
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < QQuickTextEdit : : TextFormat > ( " textFormat " ) ;
QTest : : addColumn < int > ( " start " ) ;
QTest : : addColumn < int > ( " end " ) ;
QTest : : addColumn < QString > ( " expectedText " ) ;
const QString richBoldText = QStringLiteral ( " This is some <b>bold</b> text " ) ;
const QString plainBoldText = QStringLiteral ( " This is some bold text " ) ;
QTest : : newRow ( " all plain text " )
< < standard . at ( 0 )
< < QQuickTextEdit : : PlainText
< < 0 < < standard . at ( 0 ) . length ( )
< < standard . at ( 0 ) ;
QTest : : newRow ( " plain text sub string " )
< < standard . at ( 0 )
< < QQuickTextEdit : : PlainText
< < 0 < < 12
< < standard . at ( 0 ) . mid ( 0 , 12 ) ;
QTest : : newRow ( " plain text sub string reversed " )
< < standard . at ( 0 )
< < QQuickTextEdit : : PlainText
< < 12 < < 0
< < standard . at ( 0 ) . mid ( 0 , 12 ) ;
QTest : : newRow ( " plain text cropped beginning " )
< < standard . at ( 0 )
< < QQuickTextEdit : : PlainText
< < - 3 < < 4
< < standard . at ( 0 ) . mid ( 0 , 4 ) ;
QTest : : newRow ( " plain text cropped end " )
< < standard . at ( 0 )
< < QQuickTextEdit : : PlainText
< < 23 < < standard . at ( 0 ) . length ( ) + 8
< < standard . at ( 0 ) . mid ( 23 ) ;
QTest : : newRow ( " plain text cropped beginning and end " )
< < standard . at ( 0 )
< < QQuickTextEdit : : PlainText
< < - 9 < < standard . at ( 0 ) . length ( ) + 4
< < standard . at ( 0 ) ;
QTest : : newRow ( " all rich (Auto) text " )
< < richBoldText
< < QQuickTextEdit : : AutoText
< < 0 < < plainBoldText . length ( )
< < QString ( " This is some \\ <.* \\ >bold \\ </.* \\ > text " ) ;
QTest : : newRow ( " all rich (Rich) text " )
< < richBoldText
< < QQuickTextEdit : : RichText
< < 0 < < plainBoldText . length ( )
< < QString ( " This is some \\ <.* \\ >bold \\ </.* \\ > text " ) ;
QTest : : newRow ( " all rich (Plain) text " )
< < richBoldText
< < QQuickTextEdit : : PlainText
< < 0 < < richBoldText . length ( )
< < richBoldText ;
QTest : : newRow ( " rich (Auto) text sub string " )
< < richBoldText
< < QQuickTextEdit : : AutoText
< < 14 < < 21
< < QString ( " \\ <.* \\ >old \\ </.* \\ > tex " ) ;
QTest : : newRow ( " rich (Rich) text sub string " )
< < richBoldText
< < QQuickTextEdit : : RichText
< < 14 < < 21
< < QString ( " \\ <.* \\ >old \\ </.* \\ > tex " ) ;
QTest : : newRow ( " rich (Plain) text sub string " )
< < richBoldText
< < QQuickTextEdit : : PlainText
< < 17 < < 27
< < richBoldText . mid ( 17 , 10 ) ;
}
void tst_qquicktextedit : : getFormattedText ( )
{
QFETCH ( QString , text ) ;
QFETCH ( QQuickTextEdit : : TextFormat , textFormat ) ;
QFETCH ( int , start ) ;
QFETCH ( int , end ) ;
QFETCH ( QString , expectedText ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit {} " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-11-28 04:03:34 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
textEdit - > setTextFormat ( textFormat ) ;
textEdit - > setText ( text ) ;
if ( textFormat = = QQuickTextEdit : : RichText
| | ( textFormat = = QQuickTextEdit : : AutoText & & Qt : : mightBeRichText ( text ) ) ) {
QVERIFY ( textEdit - > getFormattedText ( start , end ) . contains ( QRegExp ( expectedText ) ) ) ;
} else {
QCOMPARE ( textEdit - > getFormattedText ( start , end ) , expectedText ) ;
}
}
2013-06-06 13:16:59 +00:00
void tst_qquicktextedit : : append_data ( )
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < QQuickTextEdit : : TextFormat > ( " textFormat " ) ;
QTest : : addColumn < int > ( " selectionStart " ) ;
QTest : : addColumn < int > ( " selectionEnd " ) ;
QTest : : addColumn < QString > ( " appendText " ) ;
QTest : : addColumn < QString > ( " expectedText " ) ;
QTest : : addColumn < int > ( " expectedSelectionStart " ) ;
QTest : : addColumn < int > ( " expectedSelectionEnd " ) ;
QTest : : addColumn < int > ( " expectedCursorPosition " ) ;
QTest : : addColumn < bool > ( " selectionChanged " ) ;
QTest : : addColumn < bool > ( " cursorPositionChanged " ) ;
QTest : : newRow ( " cursor kept intact (beginning) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " cursor kept intact (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < 18 < < 18 < < 18
< < false < < false ;
QTest : : newRow ( " cursor follows (end) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( )
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < standard . at ( 0 ) . length ( ) + 6 < < standard . at ( 0 ) . length ( ) + 6 < < standard . at ( 0 ) . length ( ) + 6
< < false < < true ;
QTest : : newRow ( " selection kept intact (beginning) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < 0 < < 18 < < 18
< < false < < false ;
QTest : : newRow ( " selection kept intact (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 14 < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < 14 < < 18 < < 18
< < false < < false ;
QTest : : newRow ( " selection kept intact, cursor follows (end) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < standard . at ( 0 ) . length ( )
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < 18 < < standard . at ( 0 ) . length ( ) + 6 < < standard . at ( 0 ) . length ( ) + 6
< < false < < true ;
QTest : : newRow ( " reversed selection kept intact " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < 14
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < 14 < < 18 < < 14
< < false < < false ;
QTest : : newRow ( " rich text into plain text " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < QString ( " <b>Hello</b> " )
< < standard . at ( 0 ) + QString ( " \n <b>Hello</b> " )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " rich text into rich text " )
< < standard . at ( 0 ) < < QQuickTextEdit : : RichText
< < 0 < < 0
< < QString ( " <b>Hello</b> " )
< < standard . at ( 0 ) + QChar ( QChar : : ParagraphSeparator ) + QString ( " Hello " )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " rich text into auto text " )
< < standard . at ( 0 ) < < QQuickTextEdit : : AutoText
< < 0 < < 0
< < QString ( " <b>Hello</b> " )
< < standard . at ( 0 ) + QString ( " \n Hello " )
< < 0 < < 0 < < 0
< < false < < false ;
}
void tst_qquicktextedit : : append ( )
{
QFETCH ( QString , text ) ;
QFETCH ( QQuickTextEdit : : TextFormat , textFormat ) ;
QFETCH ( int , selectionStart ) ;
QFETCH ( int , selectionEnd ) ;
QFETCH ( QString , appendText ) ;
QFETCH ( QString , expectedText ) ;
QFETCH ( int , expectedSelectionStart ) ;
QFETCH ( int , expectedSelectionEnd ) ;
QFETCH ( int , expectedCursorPosition ) ;
QFETCH ( bool , selectionChanged ) ;
QFETCH ( bool , cursorPositionChanged ) ;
QString componentStr = " import QtQuick 2.2 \n TextEdit { text: \" " + text + " \" } " ;
QQmlComponent textEditComponent ( & engine ) ;
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
textEdit - > setTextFormat ( textFormat ) ;
textEdit - > select ( selectionStart , selectionEnd ) ;
QSignalSpy selectionSpy ( textEdit , SIGNAL ( selectedTextChanged ( ) ) ) ;
QSignalSpy selectionStartSpy ( textEdit , SIGNAL ( selectionStartChanged ( ) ) ) ;
QSignalSpy selectionEndSpy ( textEdit , SIGNAL ( selectionEndChanged ( ) ) ) ;
QSignalSpy textSpy ( textEdit , SIGNAL ( textChanged ( ) ) ) ;
QSignalSpy cursorPositionSpy ( textEdit , SIGNAL ( cursorPositionChanged ( ) ) ) ;
textEdit - > append ( appendText ) ;
if ( textFormat = = QQuickTextEdit : : RichText | | ( textFormat = = QQuickTextEdit : : AutoText & & (
Qt : : mightBeRichText ( text ) | | Qt : : mightBeRichText ( appendText ) ) ) ) {
QCOMPARE ( textEdit - > getText ( 0 , expectedText . length ( ) ) , expectedText ) ;
} else {
QCOMPARE ( textEdit - > text ( ) , expectedText ) ;
}
QCOMPARE ( textEdit - > length ( ) , expectedText . length ( ) ) ;
QCOMPARE ( textEdit - > selectionStart ( ) , expectedSelectionStart ) ;
QCOMPARE ( textEdit - > selectionEnd ( ) , expectedSelectionEnd ) ;
QCOMPARE ( textEdit - > cursorPosition ( ) , expectedCursorPosition ) ;
if ( selectionStart > selectionEnd )
qSwap ( selectionStart , selectionEnd ) ;
QEXPECT_FAIL ( " into selection " , " selectedTextChanged signal isn't emitted on edits within selection " , Continue ) ;
QEXPECT_FAIL ( " into reversed selection " , " selectedTextChanged signal isn't emitted on edits within selection " , Continue ) ;
QCOMPARE ( selectionSpy . count ( ) > 0 , selectionChanged ) ;
QCOMPARE ( selectionStartSpy . count ( ) > 0 , selectionStart ! = expectedSelectionStart ) ;
QEXPECT_FAIL ( " into reversed selection " , " selectionEndChanged signal not emitted " , Continue ) ;
QCOMPARE ( selectionEndSpy . count ( ) > 0 , selectionEnd ! = expectedSelectionEnd ) ;
QCOMPARE ( textSpy . count ( ) > 0 , text ! = expectedText ) ;
QCOMPARE ( cursorPositionSpy . count ( ) > 0 , cursorPositionChanged ) ;
}
2011-11-24 02:53:05 +00:00
void tst_qquicktextedit : : insert_data ( )
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < QQuickTextEdit : : TextFormat > ( " textFormat " ) ;
QTest : : addColumn < int > ( " selectionStart " ) ;
QTest : : addColumn < int > ( " selectionEnd " ) ;
QTest : : addColumn < int > ( " insertPosition " ) ;
QTest : : addColumn < QString > ( " insertText " ) ;
QTest : : addColumn < QString > ( " expectedText " ) ;
QTest : : addColumn < int > ( " expectedSelectionStart " ) ;
QTest : : addColumn < int > ( " expectedSelectionEnd " ) ;
QTest : : addColumn < int > ( " expectedCursorPosition " ) ;
QTest : : addColumn < bool > ( " selectionChanged " ) ;
QTest : : addColumn < bool > ( " cursorPositionChanged " ) ;
QTest : : newRow ( " at cursor position (beginning) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0 < < 0
< < QString ( " Hello " )
< < QString ( " Hello " ) + standard . at ( 0 )
< < 5 < < 5 < < 5
< < false < < true ;
QTest : : newRow ( " at cursor position (end) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( )
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " Hello " )
< < standard . at ( 0 ) . length ( ) + 5 < < standard . at ( 0 ) . length ( ) + 5 < < standard . at ( 0 ) . length ( ) + 5
< < false < < true ;
QTest : : newRow ( " at cursor position (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < 18 < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) . mid ( 0 , 18 ) + QString ( " Hello " ) + standard . at ( 0 ) . mid ( 18 )
< < 23 < < 23 < < 23
< < false < < true ;
QTest : : newRow ( " after cursor position (beginning) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0 < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) . mid ( 0 , 18 ) + QString ( " Hello " ) + standard . at ( 0 ) . mid ( 18 )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " before cursor position (end) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( ) < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) . mid ( 0 , 18 ) + QString ( " Hello " ) + standard . at ( 0 ) . mid ( 18 )
< < standard . at ( 0 ) . length ( ) + 5 < < standard . at ( 0 ) . length ( ) + 5 < < standard . at ( 0 ) . length ( ) + 5
< < false < < true ;
QTest : : newRow ( " before cursor position (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < 18 < < 0
< < QString ( " Hello " )
< < QString ( " Hello " ) + standard . at ( 0 )
< < 23 < < 23 < < 23
< < false < < true ;
QTest : : newRow ( " after cursor position (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < 18 < < standard . at ( 0 ) . length ( )
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " Hello " )
< < 18 < < 18 < < 18
< < false < < false ;
QTest : : newRow ( " before selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 14 < < 19 < < 0
< < QString ( " Hello " )
< < QString ( " Hello " ) + standard . at ( 0 )
< < 19 < < 24 < < 24
< < false < < true ;
QTest : : newRow ( " before reversed selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 19 < < 14 < < 0
< < QString ( " Hello " )
< < QString ( " Hello " ) + standard . at ( 0 )
< < 19 < < 24 < < 19
< < false < < true ;
QTest : : newRow ( " after selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 14 < < 19 < < standard . at ( 0 ) . length ( )
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " Hello " )
< < 14 < < 19 < < 19
< < false < < false ;
QTest : : newRow ( " after reversed selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 19 < < 14 < < standard . at ( 0 ) . length ( )
< < QString ( " Hello " )
< < standard . at ( 0 ) + QString ( " Hello " )
< < 14 < < 19 < < 14
< < false < < false ;
QTest : : newRow ( " into selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 14 < < 19 < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) . mid ( 0 , 18 ) + QString ( " Hello " ) + standard . at ( 0 ) . mid ( 18 )
< < 14 < < 24 < < 24
< < true < < true ;
QTest : : newRow ( " into reversed selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 19 < < 14 < < 18
< < QString ( " Hello " )
< < standard . at ( 0 ) . mid ( 0 , 18 ) + QString ( " Hello " ) + standard . at ( 0 ) . mid ( 18 )
< < 14 < < 24 < < 14
< < true < < false ;
QTest : : newRow ( " rich text into plain text " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0 < < 0
< < QString ( " <b>Hello</b> " )
< < QString ( " <b>Hello</b> " ) + standard . at ( 0 )
< < 12 < < 12 < < 12
< < false < < true ;
QTest : : newRow ( " rich text into rich text " )
< < standard . at ( 0 ) < < QQuickTextEdit : : RichText
< < 0 < < 0 < < 0
< < QString ( " <b>Hello</b> " )
< < QString ( " Hello " ) + standard . at ( 0 )
< < 5 < < 5 < < 5
< < false < < true ;
QTest : : newRow ( " rich text into auto text " )
< < standard . at ( 0 ) < < QQuickTextEdit : : AutoText
< < 0 < < 0 < < 0
< < QString ( " <b>Hello</b> " )
< < QString ( " Hello " ) + standard . at ( 0 )
< < 5 < < 5 < < 5
< < false < < true ;
QTest : : newRow ( " before start " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0 < < - 3
< < QString ( " Hello " )
< < standard . at ( 0 )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " past end " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0 < < standard . at ( 0 ) . length ( ) + 3
< < QString ( " Hello " )
< < standard . at ( 0 )
< < 0 < < 0 < < 0
< < false < < false ;
}
void tst_qquicktextedit : : insert ( )
{
QFETCH ( QString , text ) ;
QFETCH ( QQuickTextEdit : : TextFormat , textFormat ) ;
QFETCH ( int , selectionStart ) ;
QFETCH ( int , selectionEnd ) ;
QFETCH ( int , insertPosition ) ;
QFETCH ( QString , insertText ) ;
QFETCH ( QString , expectedText ) ;
QFETCH ( int , expectedSelectionStart ) ;
QFETCH ( int , expectedSelectionEnd ) ;
QFETCH ( int , expectedCursorPosition ) ;
QFETCH ( bool , selectionChanged ) ;
QFETCH ( bool , cursorPositionChanged ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + text + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-11-24 02:53:05 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
textEdit - > setTextFormat ( textFormat ) ;
textEdit - > select ( selectionStart , selectionEnd ) ;
2012-06-29 07:20:16 +00:00
QSignalSpy selectionSpy ( textEdit , SIGNAL ( selectedTextChanged ( ) ) ) ;
2011-11-24 02:53:05 +00:00
QSignalSpy selectionStartSpy ( textEdit , SIGNAL ( selectionStartChanged ( ) ) ) ;
QSignalSpy selectionEndSpy ( textEdit , SIGNAL ( selectionEndChanged ( ) ) ) ;
2012-01-11 01:00:36 +00:00
QSignalSpy textSpy ( textEdit , SIGNAL ( textChanged ( ) ) ) ;
2011-11-24 02:53:05 +00:00
QSignalSpy cursorPositionSpy ( textEdit , SIGNAL ( cursorPositionChanged ( ) ) ) ;
textEdit - > insert ( insertPosition , insertText ) ;
if ( textFormat = = QQuickTextEdit : : RichText | | ( textFormat = = QQuickTextEdit : : AutoText & & (
Qt : : mightBeRichText ( text ) | | Qt : : mightBeRichText ( insertText ) ) ) ) {
QCOMPARE ( textEdit - > getText ( 0 , expectedText . length ( ) ) , expectedText ) ;
} else {
QCOMPARE ( textEdit - > text ( ) , expectedText ) ;
2011-11-28 04:29:36 +00:00
2011-11-24 02:53:05 +00:00
}
2011-11-28 04:29:36 +00:00
QCOMPARE ( textEdit - > length ( ) , expectedText . length ( ) ) ;
2011-11-24 02:53:05 +00:00
QCOMPARE ( textEdit - > selectionStart ( ) , expectedSelectionStart ) ;
QCOMPARE ( textEdit - > selectionEnd ( ) , expectedSelectionEnd ) ;
QCOMPARE ( textEdit - > cursorPosition ( ) , expectedCursorPosition ) ;
if ( selectionStart > selectionEnd )
qSwap ( selectionStart , selectionEnd ) ;
2012-06-29 07:20:16 +00:00
QEXPECT_FAIL ( " into selection " , " selectedTextChanged signal isn't emitted on edits within selection " , Continue ) ;
QEXPECT_FAIL ( " into reversed selection " , " selectedTextChanged signal isn't emitted on edits within selection " , Continue ) ;
2011-11-24 02:53:05 +00:00
QCOMPARE ( selectionSpy . count ( ) > 0 , selectionChanged ) ;
QCOMPARE ( selectionStartSpy . count ( ) > 0 , selectionStart ! = expectedSelectionStart ) ;
2011-11-28 04:29:36 +00:00
QEXPECT_FAIL ( " into reversed selection " , " selectionEndChanged signal not emitted " , Continue ) ;
2011-11-24 02:53:05 +00:00
QCOMPARE ( selectionEndSpy . count ( ) > 0 , selectionEnd ! = expectedSelectionEnd ) ;
QCOMPARE ( textSpy . count ( ) > 0 , text ! = expectedText ) ;
QCOMPARE ( cursorPositionSpy . count ( ) > 0 , cursorPositionChanged ) ;
}
void tst_qquicktextedit : : remove_data ( )
{
QTest : : addColumn < QString > ( " text " ) ;
QTest : : addColumn < QQuickTextEdit : : TextFormat > ( " textFormat " ) ;
QTest : : addColumn < int > ( " selectionStart " ) ;
QTest : : addColumn < int > ( " selectionEnd " ) ;
QTest : : addColumn < int > ( " removeStart " ) ;
QTest : : addColumn < int > ( " removeEnd " ) ;
QTest : : addColumn < QString > ( " expectedText " ) ;
QTest : : addColumn < int > ( " expectedSelectionStart " ) ;
QTest : : addColumn < int > ( " expectedSelectionEnd " ) ;
QTest : : addColumn < int > ( " expectedCursorPosition " ) ;
QTest : : addColumn < bool > ( " selectionChanged " ) ;
QTest : : addColumn < bool > ( " cursorPositionChanged " ) ;
const QString richBoldText = QStringLiteral ( " This is some <b>bold</b> text " ) ;
const QString plainBoldText = QStringLiteral ( " This is some bold text " ) ;
QTest : : newRow ( " from cursor position (beginning) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < 0 < < 5
< < standard . at ( 0 ) . mid ( 5 )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " to cursor position (beginning) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < 5 < < 0
< < standard . at ( 0 ) . mid ( 5 )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " to cursor position (end) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( )
< < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( ) - 5
< < standard . at ( 0 ) . mid ( 0 , standard . at ( 0 ) . length ( ) - 5 )
< < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( ) - 5
< < false < < true ;
QTest : : newRow ( " to cursor position (end) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( )
< < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( )
< < standard . at ( 0 ) . mid ( 0 , standard . at ( 0 ) . length ( ) - 5 )
< < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( ) - 5
< < false < < true ;
QTest : : newRow ( " from cursor position (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < 18
< < 18 < < 23
< < standard . at ( 0 ) . mid ( 0 , 18 ) + standard . at ( 0 ) . mid ( 23 )
< < 18 < < 18 < < 18
< < false < < false ;
QTest : : newRow ( " to cursor position (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 23 < < 23
< < 18 < < 23
< < standard . at ( 0 ) . mid ( 0 , 18 ) + standard . at ( 0 ) . mid ( 23 )
< < 18 < < 18 < < 18
< < false < < true ;
QTest : : newRow ( " after cursor position (beginning) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < 18 < < 23
< < standard . at ( 0 ) . mid ( 0 , 18 ) + standard . at ( 0 ) . mid ( 23 )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " before cursor position (end) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < standard . at ( 0 ) . length ( ) < < standard . at ( 0 ) . length ( )
< < 18 < < 23
< < standard . at ( 0 ) . mid ( 0 , 18 ) + standard . at ( 0 ) . mid ( 23 )
< < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( ) - 5
< < false < < true ;
QTest : : newRow ( " before cursor position (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 23 < < 23
< < 0 < < 5
< < standard . at ( 0 ) . mid ( 5 )
< < 18 < < 18 < < 18
< < false < < true ;
QTest : : newRow ( " after cursor position (middle) " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 18 < < 18
< < 18 < < 23
< < standard . at ( 0 ) . mid ( 0 , 18 ) + standard . at ( 0 ) . mid ( 23 )
< < 18 < < 18 < < 18
< < false < < false ;
QTest : : newRow ( " before selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 14 < < 19
< < 0 < < 5
< < standard . at ( 0 ) . mid ( 5 )
< < 9 < < 14 < < 14
< < false < < true ;
QTest : : newRow ( " before reversed selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 19 < < 14
< < 0 < < 5
< < standard . at ( 0 ) . mid ( 5 )
< < 9 < < 14 < < 9
< < false < < true ;
QTest : : newRow ( " after selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 14 < < 19
< < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( )
< < standard . at ( 0 ) . mid ( 0 , standard . at ( 0 ) . length ( ) - 5 )
< < 14 < < 19 < < 19
< < false < < false ;
QTest : : newRow ( " after reversed selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 19 < < 14
< < standard . at ( 0 ) . length ( ) - 5 < < standard . at ( 0 ) . length ( )
< < standard . at ( 0 ) . mid ( 0 , standard . at ( 0 ) . length ( ) - 5 )
< < 14 < < 19 < < 14
< < false < < false ;
QTest : : newRow ( " from selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 14 < < 24
< < 18 < < 23
< < standard . at ( 0 ) . mid ( 0 , 18 ) + standard . at ( 0 ) . mid ( 23 )
< < 14 < < 19 < < 19
< < true < < true ;
QTest : : newRow ( " from reversed selection " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 24 < < 14
< < 18 < < 23
< < standard . at ( 0 ) . mid ( 0 , 18 ) + standard . at ( 0 ) . mid ( 23 )
< < 14 < < 19 < < 14
< < true < < false ;
QTest : : newRow ( " plain text cropped beginning " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < - 3 < < 4
< < standard . at ( 0 ) . mid ( 4 )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " plain text cropped end " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < 23 < < standard . at ( 0 ) . length ( ) + 8
< < standard . at ( 0 ) . mid ( 0 , 23 )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " plain text cropped beginning and end " )
< < standard . at ( 0 ) < < QQuickTextEdit : : PlainText
< < 0 < < 0
< < - 9 < < standard . at ( 0 ) . length ( ) + 4
< < QString ( )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " all rich text " )
< < richBoldText < < QQuickTextEdit : : RichText
< < 0 < < 0
< < 0 < < plainBoldText . length ( )
< < QString ( )
< < 0 < < 0 < < 0
< < false < < false ;
QTest : : newRow ( " rick text sub string " )
< < richBoldText < < QQuickTextEdit : : RichText
< < 0 < < 0
< < 14 < < 21
< < plainBoldText . mid ( 0 , 14 ) + plainBoldText . mid ( 21 )
< < 0 < < 0 < < 0
< < false < < false ;
}
void tst_qquicktextedit : : remove ( )
{
QFETCH ( QString , text ) ;
QFETCH ( QQuickTextEdit : : TextFormat , textFormat ) ;
QFETCH ( int , selectionStart ) ;
QFETCH ( int , selectionEnd ) ;
QFETCH ( int , removeStart ) ;
QFETCH ( int , removeEnd ) ;
QFETCH ( QString , expectedText ) ;
QFETCH ( int , expectedSelectionStart ) ;
QFETCH ( int , expectedSelectionEnd ) ;
QFETCH ( int , expectedCursorPosition ) ;
QFETCH ( bool , selectionChanged ) ;
QFETCH ( bool , cursorPositionChanged ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + text + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-11-24 02:53:05 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
textEdit - > setTextFormat ( textFormat ) ;
textEdit - > select ( selectionStart , selectionEnd ) ;
2012-07-05 00:18:43 +00:00
QSignalSpy selectionSpy ( textEdit , SIGNAL ( selectedTextChanged ( ) ) ) ;
2011-11-24 02:53:05 +00:00
QSignalSpy selectionStartSpy ( textEdit , SIGNAL ( selectionStartChanged ( ) ) ) ;
QSignalSpy selectionEndSpy ( textEdit , SIGNAL ( selectionEndChanged ( ) ) ) ;
2012-01-11 01:00:36 +00:00
QSignalSpy textSpy ( textEdit , SIGNAL ( textChanged ( ) ) ) ;
2011-11-24 02:53:05 +00:00
QSignalSpy cursorPositionSpy ( textEdit , SIGNAL ( cursorPositionChanged ( ) ) ) ;
textEdit - > remove ( removeStart , removeEnd ) ;
if ( textFormat = = QQuickTextEdit : : RichText
| | ( textFormat = = QQuickTextEdit : : AutoText & & Qt : : mightBeRichText ( text ) ) ) {
QCOMPARE ( textEdit - > getText ( 0 , expectedText . length ( ) ) , expectedText ) ;
} else {
QCOMPARE ( textEdit - > text ( ) , expectedText ) ;
}
2011-11-28 04:29:36 +00:00
QCOMPARE ( textEdit - > length ( ) , expectedText . length ( ) ) ;
2011-11-24 02:53:05 +00:00
if ( selectionStart > selectionEnd ) //
qSwap ( selectionStart , selectionEnd ) ;
QCOMPARE ( textEdit - > selectionStart ( ) , expectedSelectionStart ) ;
QCOMPARE ( textEdit - > selectionEnd ( ) , expectedSelectionEnd ) ;
QCOMPARE ( textEdit - > cursorPosition ( ) , expectedCursorPosition ) ;
2012-06-29 07:20:16 +00:00
QEXPECT_FAIL ( " from selection " , " selectedTextChanged signal isn't emitted on edits within selection " , Continue ) ;
QEXPECT_FAIL ( " from reversed selection " , " selectedTextChanged signal isn't emitted on edits within selection " , Continue ) ;
2011-11-24 02:53:05 +00:00
QCOMPARE ( selectionSpy . count ( ) > 0 , selectionChanged ) ;
QCOMPARE ( selectionStartSpy . count ( ) > 0 , selectionStart ! = expectedSelectionStart ) ;
QEXPECT_FAIL ( " from reversed selection " , " selectionEndChanged signal not emitted " , Continue ) ;
QCOMPARE ( selectionEndSpy . count ( ) > 0 , selectionEnd ! = expectedSelectionEnd ) ;
QCOMPARE ( textSpy . count ( ) > 0 , text ! = expectedText ) ;
if ( cursorPositionChanged ) //
QVERIFY ( cursorPositionSpy . count ( ) > 0 ) ;
}
2011-11-14 01:03:05 +00:00
void tst_qquicktextedit : : 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 " ) ;
2012-03-09 07:40:49 +00:00
QTest : : addColumn < Qt : : Key > ( " layoutDirection " ) ;
2011-11-14 01:03:05 +00:00
// 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
2012-03-09 07:40:49 +00:00
< < 44 < < standard . at ( 0 ) < < standard . at ( 0 )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " select start of line " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectStartOfLine ) < < 5 < < 5
< < 0 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 0 , 5 )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " select start of block " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectStartOfBlock ) < < 5 < < 5
< < 0 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 0 , 5 )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " select end of line " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectEndOfLine ) < < 5 < < 5
2012-03-09 07:40:49 +00:00
< < 44 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 5 )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " select end of document " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectEndOfDocument ) < < 3 < < 3
2012-03-09 07:40:49 +00:00
< < 44 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 3 )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " select end of block " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectEndOfBlock ) < < 18 < < 18
2012-03-09 07:40:49 +00:00
< < 44 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 18 )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " delete end of line " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : DeleteEndOfLine ) < < 24 < < 24
2012-03-09 07:40:49 +00:00
< < 24 < < standard . at ( 0 ) . mid ( 0 , 24 ) < < QString ( )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " move to start of line " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToStartOfLine ) < < 31 < < 31
2012-03-09 07:40:49 +00:00
< < 0 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " move to start of block " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToStartOfBlock ) < < 25 < < 25
2012-03-09 07:40:49 +00:00
< < 0 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " move to next char " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToNextChar ) < < 12 < < 12
2012-03-09 07:40:49 +00:00
< < 13 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " move to previous char (ltr) " )
2011-11-14 01:03:05 +00:00
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToPreviousChar ) < < 3 < < 3
2012-03-09 07:40:49 +00:00
< < 2 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " move to previous char (rtl) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToPreviousChar ) < < 3 < < 3
< < 4 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_R ;
QTest : : newRow ( " move to previous char with selection " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToPreviousChar ) < < 3 < < 7
< < 3 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " select next char (ltr) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectNextChar ) < < 23 < < 23
< < 24 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 23 , 1 )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " select next char (rtl) " )
2011-11-14 01:03:05 +00:00
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectNextChar ) < < 23 < < 23
2012-03-09 07:40:49 +00:00
< < 22 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 22 , 1 )
< < Qt : : Key_Direction_R ;
QTest : : newRow ( " select previous char (ltr) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectPreviousChar ) < < 19 < < 19
< < 18 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 18 , 1 )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " select previous char (rtl) " )
2011-11-14 01:03:05 +00:00
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectPreviousChar ) < < 19 < < 19
2012-03-09 07:40:49 +00:00
< < 20 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 19 , 1 )
< < Qt : : Key_Direction_R ;
QTest : : newRow ( " move to next word (ltr) " )
2011-11-14 01:03:05 +00:00
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToNextWord ) < < 7 < < 7
2012-03-09 07:40:49 +00:00
< < 10 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " move to next word (rtl) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToNextWord ) < < 7 < < 7
< < 4 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_R ;
QTest : : newRow ( " move to previous word (ltr) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToPreviousWord ) < < 7 < < 7
< < 4 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_L ;
QTest : : newRow ( " move to previous word (rlt) " )
2011-11-14 01:03:05 +00:00
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : MoveToPreviousWord ) < < 7 < < 7
2012-03-09 07:40:49 +00:00
< < 10 < < standard . at ( 0 ) < < QString ( )
< < Qt : : Key_Direction_R ;
QTest : : newRow ( " select next word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectNextWord ) < < 11 < < 11
< < 16 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 11 , 5 )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " select previous word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : SelectPreviousWord ) < < 11 < < 11
2012-03-09 07:40:49 +00:00
< < 10 < < standard . at ( 0 ) < < standard . at ( 0 ) . mid ( 10 , 1 )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " delete (selection) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : Delete ) < < 12 < < 15
2012-03-09 07:40:49 +00:00
< < 12 < < ( standard . at ( 0 ) . mid ( 0 , 12 ) + standard . at ( 0 ) . mid ( 15 ) ) < < QString ( )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " delete (no selection) " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : Delete ) < < 15 < < 15
2012-03-09 07:40:49 +00:00
< < 15 < < ( standard . at ( 0 ) . mid ( 0 , 15 ) + standard . at ( 0 ) . mid ( 16 ) ) < < QString ( )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " delete end of word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : DeleteEndOfWord ) < < 24 < < 24
2012-03-09 07:40:49 +00:00
< < 24 < < ( standard . at ( 0 ) . mid ( 0 , 24 ) + standard . at ( 0 ) . mid ( 27 ) ) < < QString ( )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
QTest : : newRow ( " delete start of word " )
< < standard . at ( 0 ) < < QKeySequence ( QKeySequence : : DeleteStartOfWord ) < < 7 < < 7
2012-03-09 07:40:49 +00:00
< < 4 < < ( standard . at ( 0 ) . mid ( 0 , 4 ) + standard . at ( 0 ) . mid ( 7 ) ) < < QString ( )
< < Qt : : Key_Direction_L ;
2011-11-14 01:03:05 +00:00
}
void tst_qquicktextedit : : keySequence ( )
{
QFETCH ( QString , text ) ;
QFETCH ( QKeySequence , sequence ) ;
QFETCH ( int , selectionStart ) ;
QFETCH ( int , selectionEnd ) ;
QFETCH ( int , cursorPosition ) ;
QFETCH ( QString , expectedText ) ;
QFETCH ( QString , selectedText ) ;
2012-03-09 07:40:49 +00:00
QFETCH ( Qt : : Key , layoutDirection ) ;
2011-11-14 01:03:05 +00:00
if ( sequence . isEmpty ( ) ) {
QSKIP ( " Key sequence is undefined " ) ;
}
QString componentStr = " import QtQuick 2.0 \n TextEdit { focus: true; text: \" " + text + " \" } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2011-11-14 01:03:05 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
2012-07-11 07:32:16 +00:00
QQuickWindow window ;
2012-08-07 01:26:37 +00:00
textEdit - > setParentItem ( window . contentItem ( ) ) ;
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2012-07-13 01:11:31 +00:00
QVERIFY ( textEdit - > hasActiveFocus ( ) ) ;
2011-11-14 01:03:05 +00:00
2012-07-11 07:32:16 +00:00
simulateKey ( & window , layoutDirection ) ;
2012-03-09 07:40:49 +00:00
2011-11-14 01:03:05 +00:00
textEdit - > select ( selectionStart , selectionEnd ) ;
2012-07-11 07:32:16 +00:00
simulateKeys ( & window , sequence ) ;
2011-11-14 01:03:05 +00:00
QCOMPARE ( textEdit - > cursorPosition ( ) , cursorPosition ) ;
QCOMPARE ( textEdit - > text ( ) , expectedText ) ;
QCOMPARE ( textEdit - > selectedText ( ) , selectedText ) ;
}
# define NORMAL 0
# define REPLACE_UNTIL_END 1
void tst_qquicktextedit : : 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. " ;
2012-03-09 07:40:49 +00:00
expectedString < < " Ensuring a " ; // ### Not present in TextEdit.
2011-11-14 01:03:05 +00:00
expectedString < < " Ensuring an instan " ;
expectedString < < " Ensuring instan " ;
expectedString < < " " ;
QTest : : newRow ( QString ( keys_str + " _patterns " ) . toLatin1 ( ) ) < <
insertString < <
insertIndex < <
insertMode < <
expectedString < <
bool ( use_keys ) ;
}
}
}
void tst_qquicktextedit : : undo ( )
{
QFETCH ( QStringList , insertString ) ;
QFETCH ( IntList , insertIndex ) ;
QFETCH ( IntList , insertMode ) ;
QFETCH ( QStringList , expectedString ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { focus: true } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2012-01-10 01:52:43 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
2011-11-14 01:03:05 +00:00
2012-07-11 07:32:16 +00:00
QQuickWindow window ;
2012-08-07 01:26:37 +00:00
textEdit - > setParentItem ( window . contentItem ( ) ) ;
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2011-11-14 01:03:05 +00:00
2012-07-13 01:11:31 +00:00
QVERIFY ( textEdit - > hasActiveFocus ( ) ) ;
2012-01-10 01:52:43 +00:00
QVERIFY ( ! textEdit - > canUndo ( ) ) ;
QSignalSpy spy ( textEdit , SIGNAL ( canUndoChanged ( ) ) ) ;
2011-11-14 01:03:05 +00:00
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 )
2012-01-10 01:52:43 +00:00
textEdit - > setCursorPosition ( insertIndex [ i ] ) ;
2011-11-14 01:03:05 +00:00
// experimental stuff
if ( insertMode [ i ] = = REPLACE_UNTIL_END ) {
2012-01-10 01:52:43 +00:00
textEdit - > select ( insertIndex [ i ] , insertIndex [ i ] + 8 ) ;
2011-11-14 01:03:05 +00:00
// This is what I actually want...
// QTest::keyClick(testWidget, Qt::Key_End, Qt::ShiftModifier);
}
for ( int j = 0 ; j < insertString . at ( i ) . length ( ) ; j + + )
2012-07-11 07:32:16 +00:00
QTest : : keyClick ( & window , insertString . at ( i ) . at ( j ) . toLatin1 ( ) ) ;
2011-11-14 01:03:05 +00:00
}
2012-01-10 01:52:43 +00:00
QCOMPARE ( spy . count ( ) , 1 ) ;
2011-11-14 01:03:05 +00:00
// 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 ) {
2012-01-10 01:52:43 +00:00
QCOMPARE ( textEdit - > text ( ) , expectedString [ i ] ) ;
QVERIFY ( textEdit - > canUndo ( ) ) ;
textEdit - > undo ( ) ;
2011-11-14 01:03:05 +00:00
}
// STEP 3: Verify that we have undone everything
2012-01-10 01:52:43 +00:00
QVERIFY ( textEdit - > text ( ) . isEmpty ( ) ) ;
QVERIFY ( ! textEdit - > canUndo ( ) ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
2011-11-14 01:03:05 +00:00
}
void tst_qquicktextedit : : 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_qquicktextedit : : redo ( )
{
QFETCH ( QStringList , insertString ) ;
QFETCH ( IntList , insertIndex ) ;
QFETCH ( QStringList , expectedString ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { focus: true } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2012-01-10 01:52:43 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
2011-11-14 01:03:05 +00:00
2012-07-11 07:32:16 +00:00
QQuickWindow window ;
2012-08-07 01:26:37 +00:00
textEdit - > setParentItem ( window . contentItem ( ) ) ;
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2012-07-13 01:11:31 +00:00
QVERIFY ( textEdit - > hasActiveFocus ( ) ) ;
2011-11-14 01:03:05 +00:00
2012-01-10 01:52:43 +00:00
QVERIFY ( ! textEdit - > canUndo ( ) ) ;
QVERIFY ( ! textEdit - > canRedo ( ) ) ;
QSignalSpy spy ( textEdit , SIGNAL ( canRedoChanged ( ) ) ) ;
2011-11-14 01:03:05 +00:00
int i ;
// inserts the diff strings at diff positions
for ( i = 0 ; i < insertString . size ( ) ; + + i ) {
if ( insertIndex [ i ] > - 1 )
2012-01-10 01:52:43 +00:00
textEdit - > setCursorPosition ( insertIndex [ i ] ) ;
2011-11-14 01:03:05 +00:00
for ( int j = 0 ; j < insertString . at ( i ) . length ( ) ; j + + )
2012-07-11 07:32:16 +00:00
QTest : : keyClick ( & window , insertString . at ( i ) . at ( j ) . toLatin1 ( ) ) ;
2012-01-10 01:52:43 +00:00
QVERIFY ( textEdit - > canUndo ( ) ) ;
QVERIFY ( ! textEdit - > canRedo ( ) ) ;
2011-11-14 01:03:05 +00:00
}
2012-01-10 01:52:43 +00:00
QCOMPARE ( spy . count ( ) , 0 ) ;
2011-11-14 01:03:05 +00:00
// undo everything
2012-01-10 01:52:43 +00:00
while ( ! textEdit - > text ( ) . isEmpty ( ) ) {
QVERIFY ( textEdit - > canUndo ( ) ) ;
textEdit - > undo ( ) ;
QVERIFY ( textEdit - > canRedo ( ) ) ;
}
QCOMPARE ( spy . count ( ) , 1 ) ;
2011-11-14 01:03:05 +00:00
for ( i = 0 ; i < expectedString . size ( ) ; + + i ) {
2012-01-10 01:52:43 +00:00
QVERIFY ( textEdit - > canRedo ( ) ) ;
textEdit - > redo ( ) ;
QCOMPARE ( textEdit - > text ( ) , expectedString [ i ] ) ;
QVERIFY ( textEdit - > canUndo ( ) ) ;
2011-11-14 01:03:05 +00:00
}
2012-01-10 01:52:43 +00:00
QVERIFY ( ! textEdit - > canRedo ( ) ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
2011-11-14 01:03:05 +00:00
}
void tst_qquicktextedit : : 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
// ### Text is selected in text input
// << Qt::Key_Right
< < ( 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
// ### Text is selected in text input
< < ( Qt : : Key_Left | Qt : : ShiftModifier ) < < ( Qt : : Key_Left | Qt : : ShiftModifier ) < < ( Qt : : Key_Left | Qt : : ShiftModifier ) < < ( Qt : : Key_Left | Qt : : ShiftModifier )
// 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 " ;
2012-03-09 07:40:49 +00:00
// ### One operation in TextEdit.
2011-11-14 01:03:05 +00:00
expectedString < < " A " ;
expectedString < < " 123 " ;
QTest : : newRow ( " Inserts,moving,selection and overwriting " ) < < keys < < expectedString ;
}
2012-07-31 06:25:16 +00:00
2012-09-10 14:36:55 +00:00
bool canCopyPaste = PlatformQuirks : : isClipboardAvailable ( ) ;
2012-07-31 06:25:16 +00:00
if ( canCopyPaste ) {
KeyList keys ;
keys < < " 123 "
< < QKeySequence ( QKeySequence : : SelectStartOfLine )
< < QKeySequence ( QKeySequence : : Cut )
< < " ABC "
< < QKeySequence ( QKeySequence : : Paste ) ;
QStringList expectedString = QStringList ( )
< < " ABC123 "
< < " ABC "
< < " "
< < " 123 " ;
QTest : : newRow ( " Cut,paste " ) < < keys < < expectedString ;
}
if ( canCopyPaste ) {
KeyList keys ;
keys < < " 123 "
< < QKeySequence ( QKeySequence : : SelectStartOfLine )
< < QKeySequence ( QKeySequence : : Copy )
< < " ABC "
< < QKeySequence ( QKeySequence : : Paste ) ;
QStringList expectedString = QStringList ( )
< < " ABC123 "
< < " ABC "
< < " A "
< < " 123 " ;
QTest : : newRow ( " Copy,paste " ) < < keys < < expectedString ;
}
2011-11-14 01:03:05 +00:00
}
void tst_qquicktextedit : : undo_keypressevents ( )
{
QFETCH ( KeyList , keys ) ;
QFETCH ( QStringList , expectedString ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { focus: true } " ;
2012-02-16 04:43:03 +00:00
QQmlComponent textEditComponent ( & engine ) ;
2012-01-10 01:52:43 +00:00
textEditComponent . setData ( componentStr . toLatin1 ( ) , QUrl ( ) ) ;
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( textEditComponent . create ( ) ) ;
QVERIFY ( textEdit ! = 0 ) ;
2011-11-14 01:03:05 +00:00
2012-07-11 07:32:16 +00:00
QQuickWindow window ;
2012-08-07 01:26:37 +00:00
textEdit - > setParentItem ( window . contentItem ( ) ) ;
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
2012-07-13 01:11:31 +00:00
QVERIFY ( textEdit - > hasActiveFocus ( ) ) ;
2011-11-14 01:03:05 +00:00
2012-07-11 07:32:16 +00:00
simulateKeys ( & window , keys ) ;
2011-11-14 01:03:05 +00:00
for ( int i = 0 ; i < expectedString . size ( ) ; + + i ) {
2012-01-10 01:52:43 +00:00
QCOMPARE ( textEdit - > text ( ) , expectedString [ i ] ) ;
textEdit - > undo ( ) ;
2011-11-14 01:03:05 +00:00
}
2012-01-10 01:52:43 +00:00
QVERIFY ( textEdit - > text ( ) . isEmpty ( ) ) ;
2011-11-14 01:03:05 +00:00
}
2012-01-17 00:42:26 +00:00
void tst_qquicktextedit : : baseUrl ( )
{
QUrl localUrl ( " file:///tests/text.qml " ) ;
2013-07-15 12:58:14 +00:00
QUrl remoteUrl ( " http://www.qt-project.org/test.qml " ) ;
2012-01-17 00:42:26 +00:00
2012-02-16 04:43:03 +00:00
QQmlComponent textComponent ( & engine ) ;
2012-01-17 00:42:26 +00:00
textComponent . setData ( " import QtQuick 2.0 \n TextEdit {} " , localUrl ) ;
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( textComponent . create ( ) ) ;
QCOMPARE ( textObject - > baseUrl ( ) , localUrl ) ;
QSignalSpy spy ( textObject , SIGNAL ( baseUrlChanged ( ) ) ) ;
textObject - > setBaseUrl ( localUrl ) ;
QCOMPARE ( textObject - > baseUrl ( ) , localUrl ) ;
QCOMPARE ( spy . count ( ) , 0 ) ;
textObject - > setBaseUrl ( remoteUrl ) ;
QCOMPARE ( textObject - > baseUrl ( ) , remoteUrl ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
textObject - > resetBaseUrl ( ) ;
QCOMPARE ( textObject - > baseUrl ( ) , localUrl ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
}
2012-01-16 06:40:13 +00:00
void tst_qquicktextedit : : embeddedImages_data ( )
{
QTest : : addColumn < QUrl > ( " qmlfile " ) ;
QTest : : addColumn < QString > ( " error " ) ;
QTest : : newRow ( " local " ) < < testFileUrl ( " embeddedImagesLocal.qml " ) < < " " ;
QTest : : newRow ( " local-error " ) < < testFileUrl ( " embeddedImagesLocalError.qml " )
< < testFileUrl ( " embeddedImagesLocalError.qml " ) . toString ( ) + " :3:1: QML TextEdit: Cannot open: " + testFileUrl ( " http/notexists.png " ) . toString ( ) ;
2012-01-17 00:42:26 +00:00
QTest : : newRow ( " local " ) < < testFileUrl ( " embeddedImagesLocalRelative.qml " ) < < " " ;
2012-01-16 06:40:13 +00:00
QTest : : newRow ( " remote " ) < < testFileUrl ( " embeddedImagesRemote.qml " ) < < " " ;
QTest : : newRow ( " remote-error " ) < < testFileUrl ( " embeddedImagesRemoteError.qml " )
< < testFileUrl ( " embeddedImagesRemoteError.qml " ) . toString ( ) + " :3:1: QML TextEdit: Error downloading http://127.0.0.1:42332/notexists.png - server replied: Not found " ;
2012-01-17 00:42:26 +00:00
QTest : : newRow ( " remote " ) < < testFileUrl ( " embeddedImagesRemoteRelative.qml " ) < < " " ;
2012-01-16 06:40:13 +00:00
}
void tst_qquicktextedit : : embeddedImages ( )
{
QFETCH ( QUrl , qmlfile ) ;
QFETCH ( QString , error ) ;
2014-03-20 22:21:49 +00:00
TestHTTPServer server ;
QVERIFY2 ( server . listen ( SERVER_PORT ) , qPrintable ( server . errorString ( ) ) ) ;
2012-01-16 06:40:13 +00:00
server . serveDirectory ( testFile ( " http " ) ) ;
if ( ! error . isEmpty ( ) )
QTest : : ignoreMessage ( QtWarningMsg , error . toLatin1 ( ) ) ;
2012-02-16 04:43:03 +00:00
QQmlComponent textComponent ( & engine , qmlfile ) ;
2012-01-16 06:40:13 +00:00
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( textComponent . create ( ) ) ;
QVERIFY ( textObject ! = 0 ) ;
QTRY_COMPARE ( QQuickTextEditPrivate : : get ( textObject ) - > document - > resourcesLoading ( ) , 0 ) ;
QPixmap pm ( testFile ( " http/exists.png " ) ) ;
if ( error . isEmpty ( ) ) {
QCOMPARE ( textObject - > width ( ) , double ( pm . width ( ) ) ) ;
QCOMPARE ( textObject - > height ( ) , double ( pm . height ( ) ) ) ;
} else {
QVERIFY ( 16 ! = pm . width ( ) ) ; // check test is effective
QCOMPARE ( textObject - > width ( ) , 16.0 ) ; // default size of QTextDocument broken image icon
QCOMPARE ( textObject - > height ( ) , 16.0 ) ;
}
delete textObject ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : emptytags_QTBUG_22058 ( )
2011-10-20 05:48:29 +00:00
{
2012-07-11 07:32:16 +00:00
QQuickView window ( testFileUrl ( " qtbug-22058.qml " ) ) ;
QVERIFY ( window . rootObject ( ) ! = 0 ) ;
2011-10-20 05:48:29 +00:00
2012-07-11 07:32:16 +00:00
window . show ( ) ;
2012-10-19 16:05:01 +00:00
window . requestActivate ( ) ;
2012-07-11 07:32:16 +00:00
QTest : : qWaitForWindowActive ( & window ) ;
QQuickTextEdit * input = qobject_cast < QQuickTextEdit * > ( qvariant_cast < QObject * > ( window . rootObject ( ) - > property ( " inputField " ) ) ) ;
2011-10-20 05:48:29 +00:00
QVERIFY ( input - > hasActiveFocus ( ) ) ;
QInputMethodEvent event ( " " , QList < QInputMethodEvent : : Attribute > ( ) ) ;
event . setCommitString ( " <b>Bold< " ) ;
QGuiApplication : : sendEvent ( input , & event ) ;
QCOMPARE ( input - > text ( ) , QString ( " <b>Bold< " ) ) ;
event . setCommitString ( " > " ) ;
QGuiApplication : : sendEvent ( input , & event ) ;
QCOMPARE ( input - > text ( ) , QString ( " <b>Bold<> " ) ) ;
}
2014-05-12 16:09:08 +00:00
void tst_qquicktextedit : : cursorRectangle_QTBUG_38947 ( )
{
QQuickView window ( testFileUrl ( " qtbug-38947.qml " ) ) ;
window . show ( ) ;
window . requestActivate ( ) ;
QTest : : qWaitForWindowExposed ( & window ) ;
2014-05-17 10:42:43 +00:00
QQuickTextEdit * edit = window . rootObject ( ) - > findChild < QQuickTextEdit * > ( " textedit " ) ;
2014-05-12 16:09:08 +00:00
QVERIFY ( edit ) ;
QPoint from = edit - > positionToRectangle ( 0 ) . center ( ) . toPoint ( ) ;
QTest : : mousePress ( & window , Qt : : LeftButton , Qt : : NoModifier , from ) ;
QSignalSpy spy ( edit , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
QVERIFY ( spy . isValid ( ) ) ;
2014-05-17 10:42:43 +00:00
for ( int i = 1 ; i < edit - > length ( ) - 1 ; + + i ) {
2014-05-12 16:09:08 +00:00
QRectF rect = edit - > positionToRectangle ( i ) ;
QTest : : mouseMove ( & window , rect . center ( ) . toPoint ( ) ) ;
QCOMPARE ( edit - > cursorRectangle ( ) , rect ) ;
QCOMPARE ( spy . count ( ) , i ) ;
}
QPoint to = edit - > positionToRectangle ( edit - > length ( ) - 1 ) . center ( ) . toPoint ( ) ;
QTest : : mouseRelease ( & window , Qt : : LeftButton , Qt : : NoModifier , to ) ;
}
2014-11-17 11:36:30 +00:00
void tst_qquicktextedit : : textCached_QTBUG_41583 ( )
{
QQmlComponent component ( & engine ) ;
component . setData ( " import QtQuick 2.0 \n TextEdit { property int margin: 10; text: \" TextEdit \" ; textMargin: margin; property bool empty: !text; } " , QUrl ( ) ) ;
QQuickTextEdit * textedit = qobject_cast < QQuickTextEdit * > ( component . create ( ) ) ;
QVERIFY ( textedit ) ;
QCOMPARE ( textedit - > textMargin ( ) , qreal ( 10.0 ) ) ;
QCOMPARE ( textedit - > text ( ) , QString ( " TextEdit " ) ) ;
QVERIFY ( ! textedit - > property ( " empty " ) . toBool ( ) ) ;
}
2011-10-14 08:51:42 +00:00
QTEST_MAIN ( tst_qquicktextedit )
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
# include "tst_qquicktextedit.moc"