2011-04-27 12:13:26 +00:00
/****************************************************************************
* *
* * Copyright ( C ) 2011 Nokia Corporation and / or its subsidiary ( - ies ) .
* * All rights reserved .
* * Contact : Nokia Corporation ( qt - info @ nokia . com )
* *
* * This file is part of the test suite of the Qt Toolkit .
* *
* * $ QT_BEGIN_LICENSE : LGPL $
* * GNU Lesser General Public License Usage
2011-07-07 12:52:03 +00:00
* * This file may be used under the terms of the GNU Lesser General Public
* * License version 2.1 as published by the Free Software Foundation and
* * appearing in the file LICENSE . LGPL included in the packaging of this
* * file . Please review the following information to ensure the GNU Lesser
* * General Public License version 2.1 requirements will be met :
* * http : //www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
2011-04-27 12:13:26 +00:00
* *
* * In addition , as a special exception , Nokia gives you certain additional
2011-07-07 12:52:03 +00:00
* * rights . These rights are described in the Nokia Qt LGPL Exception
2011-04-27 12:13:26 +00:00
* * version 1.1 , included in the file LGPL_EXCEPTION . txt in this package .
* *
2011-07-07 12:52:03 +00:00
* * GNU General Public License Usage
* * Alternatively , this file may be used under the terms of the GNU General
* * Public License version 3.0 as published by the Free Software Foundation
* * and appearing in the file LICENSE . GPL included in the packaging of this
* * file . Please review the following information to ensure the GNU General
* * Public License version 3.0 requirements will be met :
* * http : //www.gnu.org/copyleft/gpl.html.
2011-04-27 12:13:26 +00:00
* *
2011-07-07 12:52:03 +00:00
* * Other Usage
* * Alternatively , this file may be used in accordance with the terms and
* * conditions contained in a signed written agreement between you and Nokia .
2011-04-27 12:13:26 +00:00
* *
* *
* *
* *
* *
* * $ QT_END_LICENSE $
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <qtest.h>
# include <QtTest/QSignalSpy>
# include "../shared/testhttpserver.h"
# include <math.h>
# include <QFile>
# include <QTextDocument>
# include <QtDeclarative/qdeclarativeengine.h>
# include <QtDeclarative/qdeclarativecontext.h>
# include <QtDeclarative/qdeclarativeexpression.h>
# include <QtDeclarative/qdeclarativecomponent.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>
2011-06-01 07:45:55 +00:00
# include <private/qsgdistancefieldglyphcache_p.h>
2011-04-27 12:13:26 +00:00
# include <QFontMetrics>
2011-10-14 08:51:42 +00:00
# include <QQuickView>
2011-04-27 12:13:26 +00:00
# include <QDir>
# include <QStyle>
# include <QInputContext>
2011-09-28 13:56:36 +00:00
# include <QInputPanel>
2011-04-27 12:13:26 +00:00
# include <QClipboard>
# include <QMimeData>
# include <private/qtextcontrol_p.h>
2011-10-12 03:46:02 +00:00
# include "../shared/util.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
2011-09-27 05:53:46 +00:00
# define QTBUG_21691
# define QTBUG_21691_MESSAGE "QTBUG-21691: The test needs to be rewritten to not use QInputContext"
2011-10-14 08:51:42 +00:00
Q_DECLARE_METATYPE ( QQuickTextEdit : : SelectionMode )
2011-06-01 07:45:55 +00:00
DEFINE_BOOL_CONFIG_OPTION ( qmlDisableDistanceField , QML_DISABLE_DISTANCEFIELD )
2011-04-27 12:13:26 +00:00
QString createExpectedFileIfNotFound ( const QString & filebasename , const QImage & actual )
{
// XXX This will be replaced by some clever persistent platform image store.
2011-10-12 03:46:02 +00:00
QString persistent_dir = TESTDATA ( " " ) ;
2011-04-27 12:13:26 +00:00
QString arch = " unknown-architecture " ; // QTest needs to help with this.
QString expectfile = persistent_dir + QDir : : separator ( ) + filebasename + " - " + arch + " .png " ;
if ( ! QFile : : exists ( expectfile ) ) {
actual . save ( expectfile ) ;
qWarning ( ) < < " created " < < expectfile ;
}
return expectfile ;
}
2011-10-14 08:51:42 +00:00
class tst_qquicktextedit : public QObject
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 :
2011-05-16 03:49:56 +00:00
void initTestCase ( ) ;
void cleanupTestCase ( ) ;
2011-04-27 12:13:26 +00:00
void text ( ) ;
void width ( ) ;
void wrap ( ) ;
void textFormat ( ) ;
void alignments ( ) ;
void alignments_data ( ) ;
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 ( ) ;
void vAlign ( ) ;
void font ( ) ;
void color ( ) ;
void textMargin ( ) ;
void persistentSelection ( ) ;
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 ( ) ;
void inputMethodHints ( ) ;
void positionAt ( ) ;
void cursorDelegate ( ) ;
void cursorVisible ( ) ;
void delegateLoading_data ( ) ;
void delegateLoading ( ) ;
void navigation ( ) ;
void readOnly ( ) ;
void copyAndPaste ( ) ;
void canPaste ( ) ;
void canPasteEmpty ( ) ;
void textInput ( ) ;
2011-09-28 13:56:36 +00:00
void openInputPanel ( ) ;
2011-04-27 12:13:26 +00:00
void geometrySignals ( ) ;
void pastingRichText_QTBUG_14003 ( ) ;
void implicitSize_data ( ) ;
void implicitSize ( ) ;
void testQtQuick11Attributes ( ) ;
void testQtQuick11Attributes_data ( ) ;
2011-11-09 00:40:58 +00:00
void preeditCursorRectangle ( ) ;
2011-04-27 12:13:26 +00:00
void inputMethodComposing ( ) ;
void cursorRectangleSize ( ) ;
2011-10-20 05:48:29 +00:00
void emptytags_QTBUG_22058 ( ) ;
2011-04-27 12:13:26 +00:00
private :
2011-10-14 08:51:42 +00:00
void simulateKey ( QQuickView * , 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 ;
QDeclarativeEngine engine ;
} ;
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : initTestCase ( )
2011-05-16 03:49:56 +00:00
{
}
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : cleanupTestCase ( )
2011-05-16 03:49:56 +00:00
{
}
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
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : text ( )
2011-04-27 12:13:26 +00:00
{
{
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ( " " ) ) ;
}
for ( int i = 0 ; i < standard . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + standard . at ( i ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ) ) ;
}
for ( int i = 0 ; i < richText . size ( ) ; i + + )
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + richText . at ( i ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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-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
{
QDeclarativeComponent texteditComponent ( & engine ) ;
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 + + )
{
QFont f ;
2011-06-01 07:45:55 +00:00
qreal metricWidth = 0.0 ;
if ( requiresUnhintedMetrics ) {
QString s = standard . at ( i ) ;
s . replace ( QLatin1Char ( ' \n ' ) , QChar : : LineSeparator ) ;
QTextLayout layout ( s ) ;
layout . setFlags ( Qt : : TextExpandTabs | Qt : : TextShowMnemonic ) ;
{
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
}
layout . beginLayout ( ) ;
forever {
QTextLine line = layout . createLine ( ) ;
if ( ! line . isValid ( ) )
break ;
}
layout . endLayout ( ) ;
metricWidth = ceil ( layout . boundingRect ( ) . width ( ) ) ;
} else {
QFontMetricsF fm ( f ) ;
metricWidth = fm . size ( Qt : : TextExpandTabs | Qt : : TextShowMnemonic , standard . at ( i ) ) . width ( ) ;
metricWidth = ceil ( metricWidth ) ;
}
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + standard . at ( i ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ( ) , qreal ( metricWidth ) ) ;
}
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
int documentWidth = ceil ( document . idealWidth ( ) ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + richText . at ( i ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ( ) , qreal ( documentWidth ) ) ;
}
}
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
{
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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. ) ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : textFormat ( )
2011-04-27 12:13:26 +00:00
{
{
QDeclarativeComponent textComponent ( & engine ) ;
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
}
{
QDeclarativeComponent textComponent ( & engine ) ;
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
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : alignments_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < int > ( " hAlign " ) ;
QTest : : addColumn < int > ( " vAlign " ) ;
QTest : : addColumn < QString > ( " expectfile " ) ;
QTest : : newRow ( " LT " ) < < int ( Qt : : AlignLeft ) < < int ( Qt : : AlignTop ) < < " alignments_lt " ;
QTest : : newRow ( " RT " ) < < int ( Qt : : AlignRight ) < < int ( Qt : : AlignTop ) < < " alignments_rt " ;
QTest : : newRow ( " CT " ) < < int ( Qt : : AlignHCenter ) < < int ( Qt : : AlignTop ) < < " alignments_ct " ;
QTest : : newRow ( " LB " ) < < int ( Qt : : AlignLeft ) < < int ( Qt : : AlignBottom ) < < " alignments_lb " ;
QTest : : newRow ( " RB " ) < < int ( Qt : : AlignRight ) < < int ( Qt : : AlignBottom ) < < " alignments_rb " ;
QTest : : newRow ( " CB " ) < < int ( Qt : : AlignHCenter ) < < int ( Qt : : AlignBottom ) < < " alignments_cb " ;
QTest : : newRow ( " LC " ) < < int ( Qt : : AlignLeft ) < < int ( Qt : : AlignVCenter ) < < " alignments_lc " ;
QTest : : newRow ( " RC " ) < < int ( Qt : : AlignRight ) < < int ( Qt : : AlignVCenter ) < < " alignments_rc " ;
QTest : : newRow ( " CC " ) < < int ( Qt : : AlignHCenter ) < < int ( Qt : : AlignVCenter ) < < " alignments_cc " ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : alignments ( )
2011-04-27 12:13:26 +00:00
{
2011-10-19 03:24:34 +00:00
QSKIP ( " Image comparison of text is almost guaranteed to fail during development " ) ;
2011-10-06 00:10:24 +00:00
2011-04-27 12:13:26 +00:00
QFETCH ( int , hAlign ) ;
QFETCH ( int , vAlign ) ;
QFETCH ( QString , expectfile ) ;
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " alignments.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QObject * ob = canvas . rootObject ( ) ;
QVERIFY ( ob ! = 0 ) ;
ob - > setProperty ( " horizontalAlignment " , hAlign ) ;
ob - > setProperty ( " verticalAlignment " , vAlign ) ;
QTRY_COMPARE ( ob - > property ( " running " ) . toBool ( ) , false ) ;
2011-06-22 03:04:30 +00:00
QImage actual = canvas . grabFrameBuffer ( ) ;
2011-04-27 12:13:26 +00:00
expectfile = createExpectedFileIfNotFound ( expectfile , actual ) ;
QImage expect ( expectfile ) ;
QCOMPARE ( actual , expect ) ;
}
//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 ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " horizontalAlignment_RightToLeft.qml " ) ) ) ;
QQuickTextEdit * textEdit = canvas . rootObject ( ) - > findChild < QQuickTextEdit * > ( " text " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit ! = 0 ) ;
canvas . show ( ) ;
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 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
// explicitly left aligned
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
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < canvas . width ( ) / 2 ) ;
// explicitly right aligned
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
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
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 ( ) ) ;
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
// 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 ( ) ) ;
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < canvas . width ( ) / 2 ) ;
// 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 ( ) ) ;
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
textEdit - > setText ( textString ) ;
// explicitly center aligned
2011-10-14 08:51:42 +00:00
textEdit - > setHAlign ( QQuickTextEdit : : AlignHCenter ) ;
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignHCenter ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
// 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 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
// 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 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
// 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 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < canvas . width ( ) / 2 ) ;
// 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 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
// 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 ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < canvas . width ( ) / 2 ) ;
2011-09-22 15:31:52 +00:00
canvas . requestActivateWindow ( ) ;
2011-05-20 04:22:39 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-05-20 04:22:39 +00:00
textEdit - > setText ( QString ( ) ) ;
2011-11-09 05:09:12 +00:00
{ QInputMethodEvent ev ( rtlText , QList < QInputMethodEvent : : Attribute > ( ) ) ; QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & ev ) ; }
2011-10-14 08:51:42 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QQuickTextEdit : : AlignRight ) ;
2011-11-09 05:09:12 +00:00
{ QInputMethodEvent ev ( " Hello world! " , QList < QInputMethodEvent : : Attribute > ( ) ) ; QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & 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.
{ QInputMethodEvent ev ; QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & ev ) ; }
2011-04-27 12:13:26 +00:00
# ifndef Q_OS_MAC // QTBUG-18040
// empty text with implicit alignment follows the system locale-based
2011-09-27 05:53:46 +00:00
// keyboard input direction from QGuiApplication::keyboardInputDirection
2011-04-27 12:13:26 +00:00
textEdit - > setText ( " " ) ;
2011-09-27 05:53:46 +00:00
QCOMPARE ( textEdit - > hAlign ( ) , QGuiApplication : : keyboardInputDirection ( ) = = Qt : : LeftToRight ?
2011-10-14 08:51:42 +00:00
QQuickTextEdit : : AlignLeft : QQuickTextEdit : : AlignRight ) ;
2011-09-27 05:53:46 +00:00
if ( QGuiApplication : : keyboardInputDirection ( ) = = Qt : : LeftToRight )
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) < canvas . width ( ) / 2 ) ;
else
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
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
QVERIFY ( textEdit - > positionToRectangle ( 0 ) . x ( ) > canvas . width ( ) / 2 ) ;
# endif
# ifndef Q_OS_MAC // QTBUG-18040
// alignment of TextEdit with no text set to it
QString componentStr = " import QtQuick 2.0 \n TextEdit {} " ;
QDeclarativeComponent textComponent ( & engine ) ;
textComponent . setData ( componentStr . toLatin1 ( ) , QUrl : : fromLocalFile ( " " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textObject = qobject_cast < QQuickTextEdit * > ( textComponent . create ( ) ) ;
2011-09-27 05:53:46 +00:00
QCOMPARE ( textObject - > hAlign ( ) , QGuiApplication : : keyboardInputDirection ( ) = = Qt : : LeftToRight ?
2011-10-14 08:51:42 +00:00
QQuickTextEdit : : AlignLeft : QQuickTextEdit : : AlignRight ) ;
2011-04-27 12:13:26 +00:00
delete textObject ;
# endif
}
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 ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ) + " \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 ) ) ;
}
}
}
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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-10-14 08:51:42 +00:00
QQuickTextEditPrivate * textEditPrivate = static_cast < QQuickTextEditPrivate * > ( QQuickItemPrivate : : get ( textEditObject ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ) ;
QVERIFY ( textEditPrivate ) ;
QVERIFY ( textEditPrivate - > control ) ;
QPalette pal = textEditPrivate - > control - > palette ( ) ;
QCOMPARE ( textEditPrivate - > color , QColor ( " black " ) ) ;
QCOMPARE ( textEditPrivate - > color , pal . color ( QPalette : : Text ) ) ;
}
//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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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
{
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { persistentSelection: true; text: \" Hello World \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 - > persistentSelection ( ) , true ) ;
}
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { persistentSelection: false; text: \" Hello World \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 - > persistentSelection ( ) , false ) ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : focusOnPress ( )
2011-04-27 12:13:26 +00:00
{
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { activeFocusOnPress: true; text: \" Hello World \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 - > focusOnPress ( ) , true ) ;
}
{
QString componentStr = " import QtQuick 2.0 \n TextEdit { activeFocusOnPress: false; text: \" Hello World \" } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 - > focusOnPress ( ) , false ) ;
}
}
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 + " \" ; } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " navigation.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * input = qobject_cast < QQuickTextEdit * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
QTRY_VERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QSignalSpy spy ( input , SIGNAL ( selectionChanged ( ) ) ) ;
simulateKey ( & canvas , Qt : : Key_Right , Qt : : ShiftModifier ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( " a " ) ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( ) ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( ) ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( spy . count ( ) , 2 ) ;
simulateKey ( & canvas , Qt : : Key_Left , Qt : : ShiftModifier ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( " a " ) ) ;
QCOMPARE ( spy . count ( ) , 3 ) ;
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
QCOMPARE ( input - > selectedText ( ) , QString ( ) ) ;
QCOMPARE ( spy . count ( ) , 4 ) ;
simulateKey ( & canvas , Qt : : Key_Left ) ;
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 + " \" ; } " ;
QDeclarativeComponent textinputComponent ( & engine ) ;
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 + " \" ; } " ;
QDeclarativeComponent texteditComponent ( & engine ) ;
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 " ) ;
2011-04-27 12:13:26 +00:00
// import installed
2011-10-12 03:46:02 +00:00
QTest : : newRow ( " on " ) < < TESTDATA ( " mouseselection_true.qml " ) < < 4 < < 9 < < " 45678 " ;
QTest : : newRow ( " off " ) < < TESTDATA ( " mouseselection_false.qml " ) < < 4 < < 9 < < QString ( ) ;
QTest : : newRow ( " default " ) < < TESTDATA ( " mouseselection_default.qml " ) < < 4 < < 9 < < QString ( ) ;
QTest : : newRow ( " off word selection " ) < < TESTDATA ( " mouseselection_false_words.qml " ) < < 4 < < 9 < < QString ( ) ;
QTest : : newRow ( " on word selection (4,9) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 4 < < 9 < < " 0123456789 " ;
QTest : : newRow ( " on word selection (2,13) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 2 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
QTest : : newRow ( " on word selection (2,30) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 2 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
QTest : : newRow ( " on word selection (9,13) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 9 < < 13 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
QTest : : newRow ( " on word selection (9,30) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 9 < < 30 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
QTest : : newRow ( " on word selection (13,2) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 13 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
QTest : : newRow ( " on word selection (20,2) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 20 < < 2 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
QTest : : newRow ( " on word selection (12,9) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 12 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
QTest : : newRow ( " on word selection (30,9) " ) < < TESTDATA ( " mouseselection_true_words.qml " ) < < 30 < < 9 < < " 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
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 ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
// 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 ( ) ;
QTest : : mousePress ( & canvas , Qt : : LeftButton , 0 , p1 ) ;
2011-09-27 05:53:46 +00:00
QTest : : mouseMove ( & canvas , p2 ) ;
2011-05-09 03:57:34 +00:00
QTest : : mouseRelease ( & canvas , Qt : : LeftButton , 0 , p2 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_COMPARE ( textEditObject - > selectedText ( ) , selectedText ) ;
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 ) ;
QTest : : mouseClick ( & canvas , Qt : : LeftButton , Qt : : NoModifier , p1 ) ;
QTest : : mouseClick ( & canvas , Qt : : LeftButton , Qt : : ShiftModifier , p2 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
2011-09-27 05:53:46 +00:00
QTRY_COMPARE ( textEditObject - > selectedText ( ) , selectedText ) ;
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-10-12 03:46:02 +00:00
QString qmlfile = TESTDATA ( " mouseselection_true.qml " ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( canvas . 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 ;
QTest : : mousePress ( & canvas , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : mouseMove ( & canvas , QPoint ( x2 , y ) ) ;
2011-04-27 12:13:26 +00:00
QTest : : mouseRelease ( & canvas , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : qWait ( 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 ;
QTest : : mousePress ( & canvas , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : mouseMove ( & canvas , QPoint ( x2 , y ) ) ;
2011-04-27 12:13:26 +00:00
QTest : : mouseRelease ( & canvas , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : qWait ( 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.
}
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-10-12 03:46:02 +00:00
QTest : : newRow ( " SelectWords " ) < < TESTDATA ( " mouseselectionmode_words.qml " ) < < true ;
QTest : : newRow ( " SelectCharacters " ) < < TESTDATA ( " mouseselectionmode_characters.qml " ) < < false ;
QTest : : newRow ( " default " ) < < TESTDATA ( " mouseselectionmode_default.qml " ) < < false ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : mouseSelectionMode ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , qmlfile ) ;
QFETCH ( bool , selectWords ) ;
QString text = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & canvas , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( canvas . 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 ;
QTest : : mousePress ( & canvas , Qt : : LeftButton , 0 , QPoint ( x1 , y ) ) ;
2011-09-27 05:53:46 +00:00
QTest : : mouseMove ( & canvas , QPoint ( x2 , y ) ) ;
2011-04-27 12:13:26 +00:00
//QTest::mouseMove(canvas, QPoint(x2,y)); // doesn't work
2011-09-27 05:53:46 +00:00
// QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
// QGuiApplication::sendEvent(&canvas, &mv);
2011-04-27 12:13:26 +00:00
QTest : : mouseRelease ( & canvas , Qt : : LeftButton , 0 , QPoint ( x2 , y ) ) ;
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 ) ;
}
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : inputMethodHints ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " inputmethodhints.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = qobject_cast < QQuickTextEdit * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
QVERIFY ( textEditObject - > inputMethodHints ( ) & Qt : : ImhNoPredictiveText ) ;
textEditObject - > setInputMethodHints ( Qt : : ImhUppercaseOnly ) ;
QVERIFY ( textEditObject - > inputMethodHints ( ) & Qt : : ImhUppercaseOnly ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : positionAt ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " positionAt.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * texteditObject = qobject_cast < QQuickTextEdit * > ( canvas . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( texteditObject ! = 0 ) ;
QFontMetrics fm ( texteditObject - > font ( ) ) ;
const int y0 = fm . height ( ) / 2 ;
const int y1 = fm . height ( ) * 3 / 2 ;
int pos = texteditObject - > positionAt ( texteditObject - > width ( ) / 2 , y0 ) ;
2011-06-01 07:45:55 +00:00
int width = 0 ;
if ( ! qmlDisableDistanceField ( ) ) {
QTextLayout layout ( texteditObject - > text ( ) . left ( pos ) ) ;
{
QTextOption option ;
option . setUseDesignMetrics ( true ) ;
layout . setTextOption ( option ) ;
}
layout . beginLayout ( ) ;
QTextLine line = layout . createLine ( ) ;
layout . endLayout ( ) ;
width = ceil ( line . horizontalAdvance ( ) ) ;
} else {
width = fm . width ( texteditObject - > text ( ) . left ( pos ) ) ;
}
int diff = abs ( int ( width - texteditObject - > width ( ) / 2 ) ) ;
2011-04-27 12:13:26 +00:00
2011-09-27 05:53:46 +00:00
QEXPECT_FAIL ( " " , " QTBUG-21689 " , Abort ) ;
2011-04-27 12:13:26 +00:00
// some tollerance for different fonts.
# ifdef Q_OS_LINUX
QVERIFY ( diff < 2 ) ;
# else
QVERIFY ( diff < 5 ) ;
# endif
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 > ( ) ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : sendEvent ( & canvas , & 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 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : cursorDelegate ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " cursorTest.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEditObject = view . rootObject ( ) - > findChild < QQuickTextEdit * > ( " textEditObject " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEditObject ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QVERIFY ( textEditObject - > findChild < QQuickItem * > ( " cursorInstance " ) ) ;
2011-04-27 12:13:26 +00:00
//Test Delegate gets created
textEditObject - > setFocus ( true ) ;
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 ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
}
2011-05-09 03:57:34 +00:00
// Clear preedit text;
QInputMethodEvent event ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : sendEvent ( & view , & event ) ;
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 ( ) ;
QTest : : mouseClick ( & view , Qt : : LeftButton , 0 , point1 ) ;
2011-09-29 02:31:30 +00:00
QTest : : qWait ( 50 ) ;
QTRY_VERIFY ( textEditObject - > cursorPosition ( ) ! = 0 ) ;
2011-05-09 03:57:34 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
// Test delegate gets moved on mouse drag
textEditObject - > setCursorPosition ( 0 ) ;
const QPoint point2 = textEditObject - > positionToRectangle ( 10 ) . center ( ) . toPoint ( ) ;
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 ) ;
QTRY_COMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
2011-05-09 03:57:34 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
textEditObject - > setReadOnly ( true ) ;
textEditObject - > setCursorPosition ( 0 ) ;
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 ) ;
2011-05-09 03:57:34 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
textEditObject - > setCursorPosition ( 0 ) ;
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 ) ;
2011-05-09 03:57:34 +00:00
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
2011-04-27 12:13:26 +00:00
textEditObject - > setCursorPosition ( 0 ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . x ( ) , qRound ( delegateObject - > x ( ) ) ) ;
QCOMPARE ( textEditObject - > cursorRectangle ( ) . y ( ) , qRound ( delegateObject - > y ( ) ) ) ;
//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
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : cursorVisible ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " cursorVisible.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickTextEdit edit ;
2011-04-27 12:13:26 +00:00
QSignalSpy spy ( & edit , SIGNAL ( cursorVisibleChanged ( bool ) ) ) ;
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 ) ;
2011-10-24 03:57:12 +00:00
QQuickView alternateView ;
alternateView . show ( ) ;
alternateView . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & alternateView ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit . isCursorVisible ( ) , false ) ;
QCOMPARE ( spy . count ( ) , 6 ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-10-24 03:57:12 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit . isCursorVisible ( ) , true ) ;
QCOMPARE ( spy . count ( ) , 7 ) ;
}
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 " < < " " ;
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-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 ) ;
TestHTTPServer server ( 42332 ) ;
2011-10-12 03:46:02 +00:00
server . serveDirectory ( TESTDATA ( " httpfail " ) , TestHTTPServer : : Disconnect ) ;
server . serveDirectory ( TESTDATA ( " httpslow " ) , TestHTTPServer : : Delay ) ;
server . serveDirectory ( TESTDATA ( " http " ) ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl ( QLatin1String ( " http://localhost:42332/ " ) + qmlfile ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
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
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " navigation.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * input = qobject_cast < QQuickItem * > ( qvariant_cast < QObject * > ( canvas . rootObject ( ) - > property ( " myInput " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( input ! = 0 ) ;
QTRY_VERIFY ( input - > hasActiveFocus ( ) = = true ) ;
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
simulateKey ( & canvas , Qt : : Key_Right ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = false ) ;
simulateKey ( & canvas , Qt : : Key_Left ) ;
QVERIFY ( input - > hasActiveFocus ( ) = = true ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : copyAndPaste ( ) {
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2011-10-19 05:04:15 +00:00
# ifdef Q_OS_MAC
2011-04-27 12:13:26 +00:00
{
PasteboardRef pasteboard ;
OSStatus status = PasteboardCreate ( 0 , & pasteboard ) ;
if ( status = = noErr )
CFRelease ( pasteboard ) ;
else
2011-10-19 03:24:34 +00:00
QSKIP ( " This machine doesn't support the clipboard " ) ;
2011-04-27 12:13:26 +00:00
}
# endif
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" Hello world! \" } " ;
QDeclarativeComponent textEditComponent ( & engine ) ;
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 ( ) ) ;
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 ) ;
// select word
textEdit - > setCursorPosition ( 0 ) ;
textEdit - > selectWord ( ) ;
QCOMPARE ( textEdit - > selectedText ( ) , QString ( " Hello " ) ) ;
// 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 ) ;
# endif
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : canPaste ( ) {
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2011-09-27 05:53:46 +00:00
QGuiApplication : : clipboard ( ) - > setText ( " Some text " ) ;
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" Hello world! \" } " ;
QDeclarativeComponent textEditComponent ( & engine ) ;
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
QTextControl tc ;
QCOMPARE ( textEdit - > canPaste ( ) , tc . canPaste ( ) ) ;
# endif
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : canPasteEmpty ( ) {
2011-04-27 12:13:26 +00:00
# ifndef QT_NO_CLIPBOARD
2011-09-27 05:53:46 +00:00
QGuiApplication : : clipboard ( ) - > clear ( ) ;
2011-04-27 12:13:26 +00:00
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" Hello world! \" } " ;
QDeclarativeComponent textEditComponent ( & engine ) ;
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
QTextControl tc ;
QCOMPARE ( textEdit - > canPaste ( ) , tc . canPaste ( ) ) ;
# endif
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : readOnly ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " readOnly.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
canvas . show ( ) ;
2011-09-09 12:50:48 +00:00
canvas . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( qvariant_cast < QObject * > ( canvas . 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 + + )
2011-04-27 12:13:26 +00:00
simulateKey ( & canvas , k ) ;
simulateKey ( & canvas , Qt : : Key_Return ) ;
simulateKey ( & canvas , Qt : : Key_Space ) ;
simulateKey ( & canvas , Qt : : Key_Escape ) ;
QCOMPARE ( 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
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : simulateKey ( QQuickView * 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-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " inputMethodEvent.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-09 12:50:48 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-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 ) ;
// test that input method event is committed
QInputMethodEvent event ;
event . setCommitString ( " Hello world! " , 0 , 0 ) ;
2011-11-09 01:29:15 +00:00
QGuiApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( edit - > text ( ) , QString ( " Hello world! " ) ) ;
// 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-10-14 08:51:42 +00:00
void tst_qquicktextedit : : openInputPanel ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " openInputPanel.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-22 15:31:52 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
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 ( ) ) ;
qDebug ( ) < < & edit < < qApp - > inputPanel ( ) - > inputItem ( ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , static_cast < QObject * > ( 0 ) ) ;
2011-10-11 03:12:23 +00:00
QEXPECT_FAIL ( " " , " QTBUG-21946 " , Abort ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
// input panel should open on focus
QPoint centerPoint ( view . width ( ) / 2 , view . height ( ) / 2 ) ;
Qt : : KeyboardModifiers noModifiers = 0 ;
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : processEvents ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit - > hasActiveFocus ( ) ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , edit ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should be re-opened when pressing already focused TextEdit
qApp - > inputPanel ( ) - > hide ( ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , 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 ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should stay visible if focus is lost to another text editor
QSignalSpy inputPanelVisibilitySpy ( qApp - > inputPanel ( ) , 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 ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , qobject_cast < QObject * > ( & anotherEdit ) ) ;
QCOMPARE ( inputPanelVisibilitySpy . count ( ) , 0 ) ;
anotherEdit . setFocus ( false ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , static_cast < QObject * > ( 0 ) ) ;
QCOMPARE ( view . activeFocusItem ( ) , view . rootItem ( ) ) ;
anotherEdit . setFocus ( true ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input item should be null if focus is lost to an item that doesn't accept inputs
2011-10-14 08:51:42 +00:00
QQuickItem item ;
2011-04-27 12:13:26 +00:00
item . setParentItem ( view . rootObject ( ) ) ;
item . setFocus ( true ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > inputItem ( ) , static_cast < QObject * > ( 0 ) ) ;
QCOMPARE ( view . activeFocusItem ( ) , & item ) ;
qApp - > inputPanel ( ) - > hide ( ) ;
// input panel should not be opened if TextEdit is read only
edit - > setReadOnly ( true ) ;
edit - > setFocus ( true ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
2011-09-27 05:53:46 +00:00
QGuiApplication : : processEvents ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should not be opened if focusOnPress is set to false
2011-04-27 12:13:26 +00:00
edit - > setFocusOnPress ( false ) ;
edit - > setFocus ( false ) ;
edit - > setFocus ( true ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
QTest : : mousePress ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QTest : : mouseRelease ( & view , Qt : : LeftButton , noModifiers , centerPoint ) ;
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should open when openSoftwareInputPanel is called
2011-04-27 12:13:26 +00:00
edit - > openSoftwareInputPanel ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , true ) ;
2011-04-27 12:13:26 +00:00
2011-09-28 13:56:36 +00:00
// input panel should close when closeSoftwareInputPanel is called
2011-04-27 12:13:26 +00:00
edit - > closeSoftwareInputPanel ( ) ;
2011-09-28 13:56:36 +00:00
QCOMPARE ( qApp - > inputPanel ( ) - > visible ( ) , false ) ;
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
{
2011-10-12 03:46:02 +00:00
QDeclarativeComponent component ( & engine , TESTDATA ( " geometrySignals.qml " ) ) ;
2011-04-27 12:13:26 +00:00
QObject * o = component . create ( ) ;
QVERIFY ( o ) ;
QCOMPARE ( o - > property ( " bindingWidth " ) . toInt ( ) , 400 ) ;
QCOMPARE ( o - > property ( " bindingHeight " ) . toInt ( ) , 500 ) ;
delete o ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : pastingRichText_QTBUG_14003 ( )
2011-04-27 12:13:26 +00:00
{
# ifndef QT_NO_CLIPBOARD
QString componentStr = " import QtQuick 2.0 \n TextEdit { textFormat: TextEdit.PlainText } " ;
QDeclarativeComponent component ( & engine ) ;
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
# endif
}
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 " ) ;
QTest : : newRow ( " plain " ) < < " The quick red fox jumped over the lazy brown dog " < < " TextEdit.NoWrap " ;
QTest : : newRow ( " richtext " ) < < " <b>The quick red fox jumped over the lazy brown dog</b> " < < " TextEdit.NoWrap " ;
QTest : : newRow ( " plain_wrap " ) < < " The quick red fox jumped over the lazy brown dog " < < " TextEdit.Wrap " ;
QTest : : newRow ( " richtext_wrap " ) < < " <b>The quick red fox jumped over the lazy brown dog</b> " < < " TextEdit.Wrap " ;
}
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 ) ;
QString componentStr = " import QtQuick 2.0 \n TextEdit { text: \" " + text + " \" ; width: 50; wrapMode: " + wrap + " } " ;
QDeclarativeComponent textComponent ( & engine ) ;
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 ( ) ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : testQtQuick11Attributes ( )
2011-04-27 12:13:26 +00:00
{
QFETCH ( QString , code ) ;
QFETCH ( QString , warning ) ;
QFETCH ( QString , error ) ;
QDeclarativeEngine engine ;
QObject * obj ;
QDeclarativeComponent valid ( & engine ) ;
valid . setData ( " import QtQuick 2.0; TextEdit { " + code . toUtf8 ( ) + " } " , QUrl ( " " ) ) ;
obj = valid . create ( ) ;
QVERIFY ( obj ) ;
QVERIFY ( valid . errorString ( ) . isEmpty ( ) ) ;
delete obj ;
QDeclarativeComponent invalid ( & engine ) ;
invalid . setData ( " import QtQuick 1.0; TextEdit { " + code . toUtf8 ( ) + " } " , QUrl ( " " ) ) ;
QTest : : ignoreMessage ( QtWarningMsg , warning . toUtf8 ( ) ) ;
obj = invalid . create ( ) ;
QCOMPARE ( invalid . errorString ( ) , error ) ;
delete obj ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : testQtQuick11Attributes_data ( )
2011-04-27 12:13:26 +00:00
{
QTest : : addColumn < QString > ( " code " ) ;
QTest : : addColumn < QString > ( " warning " ) ;
QTest : : addColumn < QString > ( " error " ) ;
QTest : : newRow ( " canPaste " ) < < " property bool foo: canPaste "
< < " <Unknown File>:1: ReferenceError: Can't find variable: canPaste "
< < " " ;
QTest : : newRow ( " lineCount " ) < < " property int foo: lineCount "
< < " <Unknown File>:1: ReferenceError: Can't find variable: lineCount "
< < " " ;
QTest : : newRow ( " moveCursorSelection " ) < < " Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters) "
< < " <Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection "
< < " " ;
QTest : : newRow ( " deselect " ) < < " Component.onCompleted: deselect() "
< < " <Unknown File>:1: ReferenceError: Can't find variable: deselect "
< < " " ;
QTest : : newRow ( " onLinkActivated " ) < < " onLinkActivated: {} "
< < " QDeclarativeComponent: Component is not ready "
< < " :1 \" TextEdit.onLinkActivated \" is not available in QtQuick 1.0. \n " ;
}
2011-11-09 00:40:58 +00:00
void tst_qquicktextedit : : preeditCursorRectangle ( )
2011-04-27 12:13:26 +00:00
{
QString preeditText = " super " ;
2011-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " inputMethodEvent.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-22 15:31:52 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-05-19 06:19:44 +00:00
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
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-11-09 00:40:58 +00:00
QSignalSpy editSpy ( edit , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
QSignalSpy panelSpy ( qGuiApp - > inputPanel ( ) , SIGNAL ( cursorRectangleChanged ( ) ) ) ;
2011-05-18 07:00:49 +00:00
2011-04-27 12:13:26 +00:00
QRect currentRect ;
2011-11-09 00:40:58 +00:00
QInputMethodQueryEvent query ( Qt : : ImCursorRectangle ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
QRect previousRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
// Verify that the micro focus rect is positioned the same for position 0 as
// it would be if there was no preedit text.
2011-11-09 00:40:58 +00:00
QInputMethodEvent imEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , 0 , preeditText . length ( ) , QVariant ( ) ) ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & imEvent ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( currentRect , previousRect ) ;
2011-11-09 00:40:58 +00:00
QCOMPARE ( editSpy . count ( ) , 0 ) ;
QCOMPARE ( panelSpy . count ( ) , 0 ) ;
2011-04-27 12:13:26 +00:00
// Verify that the micro focus rect moves to the left as the cursor position
// is incremented.
for ( int i = 1 ; i < = 5 ; + + i ) {
2011-11-09 00:40:58 +00:00
QInputMethodEvent imEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( )
< < QInputMethodEvent : : Attribute ( QInputMethodEvent : : Cursor , i , preeditText . length ( ) , QVariant ( ) ) ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & imEvent ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( previousRect . left ( ) < currentRect . left ( ) ) ;
2011-11-09 00:40:58 +00:00
QVERIFY ( editSpy . count ( ) > 0 ) ; editSpy . clear ( ) ;
QVERIFY ( panelSpy . count ( ) > 0 ) ; panelSpy . clear ( ) ;
2011-04-27 12:13:26 +00:00
previousRect = currentRect ;
}
// Verify that if there is no preedit cursor then the micro focus rect is the
// same as it would be if it were positioned at the end of the preedit text.
2011-11-09 00:40:58 +00:00
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & imEvent ) ;
editSpy . clear ( ) ;
panelSpy . clear ( ) ;
{ QInputMethodEvent imEvent ( preeditText , QList < QInputMethodEvent : : Attribute > ( ) ) ;
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & imEvent ) ; }
QCoreApplication : : sendEvent ( qGuiApp - > inputPanel ( ) - > inputItem ( ) , & query ) ;
currentRect = query . value ( Qt : : ImCursorRectangle ) . toRect ( ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( currentRect , previousRect ) ;
2011-11-09 00:40:58 +00:00
QVERIFY ( editSpy . count ( ) > 0 ) ;
QVERIFY ( panelSpy . count ( ) > 0 ) ;
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-10-14 08:51:42 +00:00
QQuickView view ( QUrl : : fromLocalFile ( TESTDATA ( " inputContext.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
view . show ( ) ;
2011-09-22 15:31:52 +00:00
view . requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( & view ) ;
2011-10-06 00:10:24 +00:00
QTRY_COMPARE ( & view , qGuiApp - > focusWindow ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * edit = qobject_cast < QQuickTextEdit * > ( view . rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( edit ) ;
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 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : cursorRectangleSize ( )
2011-04-27 12:13:26 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView * canvas = new QQuickView ( QUrl : : fromLocalFile ( TESTDATA ( " CursorRect.qml " ) ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( canvas - > rootObject ( ) ! = 0 ) ;
canvas - > show ( ) ;
2011-09-22 15:31:52 +00:00
canvas - > requestActivateWindow ( ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWaitForWindowShown ( canvas ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * textEdit = qobject_cast < QQuickTextEdit * > ( canvas - > rootObject ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( textEdit ! = 0 ) ;
textEdit - > setFocus ( Qt : : OtherFocusReason ) ;
QRectF cursorRect = textEdit - > positionToRectangle ( textEdit - > cursorPosition ( ) ) ;
2011-09-28 13:56:36 +00:00
QRectF microFocusFromScene = canvas - > inputMethodQuery ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
2011-09-30 10:37:51 +00:00
QInputMethodQueryEvent event ( Qt : : ImCursorRectangle ) ;
qApp - > sendEvent ( qApp - > inputPanel ( ) - > inputItem ( ) , & event ) ;
QRectF microFocusFromApp = event . value ( Qt : : ImCursorRectangle ) . toRectF ( ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( microFocusFromScene . size ( ) , cursorRect . size ( ) ) ;
QCOMPARE ( microFocusFromApp . size ( ) , cursorRect . size ( ) ) ;
delete canvas ;
}
2011-10-14 08:51:42 +00:00
void tst_qquicktextedit : : emptytags_QTBUG_22058 ( )
2011-10-20 05:48:29 +00:00
{
2011-10-14 08:51:42 +00:00
QQuickView canvas ( QUrl : : fromLocalFile ( TESTDATA ( " qtbug-22058.qml " ) ) ) ;
2011-10-20 05:48:29 +00:00
QVERIFY ( canvas . rootObject ( ) ! = 0 ) ;
canvas . show ( ) ;
canvas . requestActivateWindow ( ) ;
QTest : : qWaitForWindowShown ( & canvas ) ;
2011-10-14 08:51:42 +00:00
QQuickTextEdit * input = qobject_cast < QQuickTextEdit * > ( qvariant_cast < QObject * > ( canvas . 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 ( " > " ) ;
QEXPECT_FAIL ( " " , " Entering empty tags into a TextEdit asserts - QTBUG-22058 " , Abort ) ;
QVERIFY ( false ) ;
QGuiApplication : : sendEvent ( input , & event ) ;
QCOMPARE ( input - > text ( ) , QString ( " <b>Bold<> " ) ) ;
}
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"