From 80614c8a26140bbb98533d72a7d1696c197c5de6 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Mon, 12 Dec 2011 12:46:48 +1000 Subject: [PATCH] Fix test failures in QtQuick 1 TextEdit and TextInput. Port various fixes for incompatibilites from the QtQuick 2 item tests. Task-number: QTBUG-21017 Change-Id: I0234fa2623c57138a132558ff4f48602675c3784 Reviewed-by: Michael Brasser --- .../tst_qdeclarativetextedit.cpp | 27 +++++++----- .../tst_qdeclarativetextinput.cpp | 45 +++++++++++--------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/tests/auto/qtquick1/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/qtquick1/qdeclarativetextedit/tst_qdeclarativetextedit.cpp index 54b8567..5ed1fb5 100644 --- a/tests/auto/qtquick1/qdeclarativetextedit/tst_qdeclarativetextedit.cpp +++ b/tests/auto/qtquick1/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -1623,20 +1623,23 @@ void tst_qdeclarativetextedit::positionAt() QDeclarative1TextEdit *texteditObject = qobject_cast(canvas->rootObject()); QVERIFY(texteditObject != 0); - QFontMetrics fm(texteditObject->font()); - const int y0 = fm.height() / 2; - const int y1 = fm.height() * 3 / 2; + QTextLayout layout(texteditObject->text()); + layout.setFont(texteditObject->font()); + + layout.beginLayout(); + QTextLine line = layout.createLine(); + layout.endLayout(); + + const int y0 = line.height() / 2; + const int y1 = line.height() * 3 / 2; int pos = texteditObject->positionAt(texteditObject->width()/2, y0); - int diff = abs(int(fm.width(texteditObject->text().left(pos))-texteditObject->width()/2)); - - QEXPECT_FAIL("", "QTBUG-21016 fails", Continue); - // some tolerance for different fonts. -#ifdef Q_OS_LINUX - QVERIFY(diff < 2); -#else - QVERIFY(diff < 5); -#endif + + int widthBegin = floor(line.cursorToX(pos - 1)); + int widthEnd = ceil(line.cursorToX(pos + 1)); + + QVERIFY(widthBegin <= texteditObject->width() / 2); + QVERIFY(widthEnd >= texteditObject->width() / 2); const qreal x0 = texteditObject->positionToRectangle(pos).x(); const qreal x1 = texteditObject->positionToRectangle(pos + 1).x(); diff --git a/tests/auto/qtquick1/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/qtquick1/qdeclarativetextinput/tst_qdeclarativetextinput.cpp index 0409bd8..a7c1616 100644 --- a/tests/auto/qtquick1/qdeclarativetextinput/tst_qdeclarativetextinput.cpp +++ b/tests/auto/qtquick1/qdeclarativetextinput/tst_qdeclarativetextinput.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -1318,6 +1319,10 @@ void tst_qdeclarativetextinput::horizontalAlignment_RightToLeft() { QInputMethodEvent ev("Hello world!", QList()); QApplication::sendEvent(canvas, &ev); } QCOMPARE(textInput->hAlign(), QDeclarative1TextInput::AlignLeft); + // Clear pre-edit text. TextInput should maybe do this itself on setText, but that may be + // redundant as an actual input method may take care of it. + { QInputMethodEvent ev; QApplication::sendEvent(canvas, &ev); } + #ifndef Q_OS_MAC // QTBUG-18040 // empty text with implicit alignment follows the system locale-based // keyboard input direction from QApplication::keyboardInputDirection @@ -1360,17 +1365,21 @@ void tst_qdeclarativetextinput::positionAt() QVERIFY(textinputObject != 0); // Check autoscrolled... - QFontMetrics fm(textinputObject->font()); int pos = textinputObject->positionAt(textinputObject->width()/2); - int diff = abs(int(fm.width(textinputObject->text()) - (fm.width(textinputObject->text().left(pos))+textinputObject->width()/2))); - // some tollerance for different fonts. -#ifdef Q_OS_LINUX - QVERIFY(diff < 2); -#else - QVERIFY(diff < 5); -#endif + QTextLayout layout(textinputObject->text()); + layout.setFont(textinputObject->font()); + layout.beginLayout(); + QTextLine line = layout.createLine(); + layout.endLayout(); + + int textLeftWidthBegin = qFloor(line.cursorToX(pos - 1)); + int textLeftWidthEnd = qCeil(line.cursorToX(pos + 1)); + int textWidth = floor(line.horizontalAdvance()); + + QVERIFY(textLeftWidthBegin <= textWidth - textinputObject->width() / 2); + QVERIFY(textLeftWidthEnd >= textWidth - textinputObject->width() / 2); int x = textinputObject->positionToRectangle(pos + 1).x() - 1; QCOMPARE(textinputObject->positionAt(x, QDeclarative1TextInput::CursorBetweenCharacters), pos + 1); @@ -1379,15 +1388,12 @@ void tst_qdeclarativetextinput::positionAt() // Check without autoscroll... textinputObject->setAutoScroll(false); pos = textinputObject->positionAt(textinputObject->width()/2); - diff = abs(int(fm.width(textinputObject->text().left(pos))-textinputObject->width()/2)); - QEXPECT_FAIL("", "QTBUG-21017 fails", Continue); - // some tolerance for different fonts. -#ifdef Q_OS_LINUX - QVERIFY(diff < 2); -#else - QVERIFY(diff < 5); -#endif + textLeftWidthBegin = qFloor(line.cursorToX(pos - 1)); + textLeftWidthEnd = qCeil(line.cursorToX(pos + 1)); + + QVERIFY(textLeftWidthBegin <= textinputObject->width() / 2); + QVERIFY(textLeftWidthEnd >= textinputObject->width() / 2); x = textinputObject->positionToRectangle(pos + 1).x() - 1; QCOMPARE(textinputObject->positionAt(x, QDeclarative1TextInput::CursorBetweenCharacters), pos + 1); @@ -2472,12 +2478,12 @@ void tst_qdeclarativetextinput::setHAlignClearCache() view.show(); QApplication::setActiveWindow(&view); QTest::qWaitForWindowShown(&view); - QEXPECT_FAIL("", "QTBUG-21017 fails", Abort); - QTRY_COMPARE(input.nbPaint, 1); + QTRY_VERIFY(input.nbPaint >= 1); + input.nbPaint = 0; input.setHAlign(QDeclarative1TextInput::AlignRight); QApplication::processEvents(); //Changing the alignment should trigger a repaint - QCOMPARE(input.nbPaint, 2); + QTRY_VERIFY(input.nbPaint >= 1); } void tst_qdeclarativetextinput::focusOutClearSelection() @@ -2581,7 +2587,6 @@ void tst_qdeclarativetextinput::preeditAutoScroll() // test the text is scrolled so the preedit is visible. ic->sendPreeditText(preeditText.mid(0, 3), 1); - QEXPECT_FAIL("", "QTBUG-21017 fails", Abort); QVERIFY(input.positionAt(0) != 0); QVERIFY(input.cursorRectangle().left() < input.boundingRect().width()); QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); -- 1.7.2.5