diff options
Diffstat (limited to 'tests/auto/gui/kernel/qinputmethod/tst_qinputmethod.cpp')
-rw-r--r-- | tests/auto/gui/kernel/qinputmethod/tst_qinputmethod.cpp | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/tests/auto/gui/kernel/qinputmethod/tst_qinputmethod.cpp b/tests/auto/gui/kernel/qinputmethod/tst_qinputmethod.cpp new file mode 100644 index 0000000000..c10d954489 --- /dev/null +++ b/tests/auto/gui/kernel/qinputmethod/tst_qinputmethod.cpp @@ -0,0 +1,342 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <private/qguiapplication_p.h> +#include <private/qinputmethod_p.h> +#include <qplatforminputcontext_qpa.h> + +class PlatformInputContext : public QPlatformInputContext +{ +public: + PlatformInputContext() : + m_animating(false), + m_visible(false), + m_updateCallCount(0), + m_resetCallCount(0), + m_commitCallCount(0), + m_localeCallCount(0), + m_inputDirectionCallCount(0), + m_lastQueries(Qt::ImhNone), + m_action(QInputMethod::Click), + m_cursorPosition(0), + m_lastEventType(QEvent::None) + {} + + virtual QRectF keyboardRect() const { return m_keyboardRect; } + virtual bool isAnimating() const { return m_animating; } + virtual void reset() { m_resetCallCount++; } + virtual void commit() { m_commitCallCount++; } + + virtual void update(Qt::InputMethodQueries queries) + { + m_updateCallCount++; + m_lastQueries = queries; + } + virtual void invokeAction(QInputMethod::Action action, int cursorPosition) + { + m_action = action; + m_cursorPosition = cursorPosition; + } + virtual bool filterEvent(const QEvent *event) + { + m_lastEventType = event->type(); return false; + } + virtual void showInputPanel() + { + m_visible = true; + } + virtual void hideInputPanel() + { + m_visible = false; + } + virtual bool isInputPanelVisible() const + { + return m_visible; + } + virtual QLocale locale() const + { + m_localeCallCount++; + return QLocale::c(); + } + virtual Qt::LayoutDirection inputDirection() const + { + m_inputDirectionCallCount++; + return Qt::LeftToRight; + } + + bool m_animating; + bool m_visible; + int m_updateCallCount; + int m_resetCallCount; + int m_commitCallCount; + mutable int m_localeCallCount; + mutable int m_inputDirectionCallCount; + Qt::InputMethodQueries m_lastQueries; + QInputMethod::Action m_action; + int m_cursorPosition; + int m_lastEventType; + QRectF m_keyboardRect; +}; + +class InputItem : public QObject +{ + Q_OBJECT +public: + bool event(QEvent *event) + { + if (event->type() == QEvent::InputMethodQuery) { + QInputMethodQueryEvent *query = static_cast<QInputMethodQueryEvent *>(event); + if (query->queries() & Qt::ImCursorRectangle) + query->setValue(Qt::ImCursorRectangle, QRectF(1, 2, 3, 4)); + if (query->queries() & Qt::ImPreferredLanguage) + query->setValue(Qt::ImPreferredLanguage, QString("English")); + m_lastQueries = query->queries(); + query->accept(); + return true; + } + return false; + } + Qt::InputMethodQueries m_lastQueries; +}; + +class tst_qinputmethod : public QObject +{ + Q_OBJECT +public: + tst_qinputmethod() {} + virtual ~tst_qinputmethod() {} +private slots: + void initTestCase(); + void visible(); + void animating(); + void keyboarRectangle(); + void inputItem(); + void inputItemTransform(); + void cursorRectangle(); + void invokeAction(); + void reset(); + void commit(); + void update(); + void query(); + void inputDirection(); +private: + InputItem m_inputItem; + PlatformInputContext m_platformInputContext; +}; + +void tst_qinputmethod::initTestCase() +{ + QInputMethodPrivate *inputMethodPrivate = QInputMethodPrivate::get(qApp->inputMethod()); + inputMethodPrivate->testContext = &m_platformInputContext; +} + +void tst_qinputmethod::visible() +{ + QCOMPARE(qApp->inputMethod()->visible(), false); + qApp->inputMethod()->show(); + QCOMPARE(qApp->inputMethod()->visible(), true); + + qApp->inputMethod()->hide(); + QCOMPARE(qApp->inputMethod()->visible(), false); + + qApp->inputMethod()->setVisible(true); + QCOMPARE(qApp->inputMethod()->visible(), true); + + qApp->inputMethod()->setVisible(false); + QCOMPARE(qApp->inputMethod()->visible(), false); +} + +void tst_qinputmethod::animating() +{ + QCOMPARE(qApp->inputMethod()->isAnimating(), false); + + m_platformInputContext.m_animating = true; + QCOMPARE(qApp->inputMethod()->isAnimating(), true); + + m_platformInputContext.m_animating = false; + QCOMPARE(qApp->inputMethod()->isAnimating(), false); + + QSignalSpy spy(qApp->inputMethod(), SIGNAL(animatingChanged())); + m_platformInputContext.emitAnimatingChanged(); + QCOMPARE(spy.count(), 1); +} + +void tst_qinputmethod::keyboarRectangle() +{ + QCOMPARE(qApp->inputMethod()->keyboardRectangle(), QRectF()); + + m_platformInputContext.m_keyboardRect = QRectF(10, 20, 30, 40); + QCOMPARE(qApp->inputMethod()->keyboardRectangle(), QRectF(10, 20, 30, 40)); + + QSignalSpy spy(qApp->inputMethod(), SIGNAL(keyboardRectangleChanged())); + m_platformInputContext.emitKeyboardRectChanged(); + QCOMPARE(spy.count(), 1); +} + +void tst_qinputmethod::inputItem() +{ + QVERIFY(!qApp->inputMethod()->inputItem()); + QSignalSpy spy(qApp->inputMethod(), SIGNAL(inputItemChanged())); + + qApp->inputMethod()->setInputItem(&m_inputItem); + + QCOMPARE(qApp->inputMethod()->inputItem(), &m_inputItem); + QCOMPARE(spy.count(), 1); + + // reset + qApp->inputMethod()->setInputItem(0); +} + +void tst_qinputmethod::inputItemTransform() +{ + QCOMPARE(qApp->inputMethod()->inputItemTransform(), QTransform()); + QSignalSpy spy(qApp->inputMethod(), SIGNAL(cursorRectangleChanged())); + + QTransform transform; + transform.translate(10, 10); + transform.scale(2, 2); + transform.shear(2, 2); + qApp->inputMethod()->setInputItemTransform(transform); + + QCOMPARE(qApp->inputMethod()->inputItemTransform(), transform); + QCOMPARE(spy.count(), 1); + + // reset + qApp->inputMethod()->setInputItemTransform(QTransform()); +} + +void tst_qinputmethod::cursorRectangle() +{ + QCOMPARE(qApp->inputMethod()->cursorRectangle(), QRectF()); + + QTransform transform; + transform.translate(10, 10); + transform.scale(2, 2); + transform.shear(2, 2); + qApp->inputMethod()->setInputItemTransform(transform); + qApp->inputMethod()->setInputItem(&m_inputItem); + + QCOMPARE(qApp->inputMethod()->cursorRectangle(), transform.mapRect(QRectF(1, 2, 3, 4))); + + // reset + qApp->inputMethod()->setInputItem(0); + qApp->inputMethod()->setInputItemTransform(QTransform()); +} + +void tst_qinputmethod::invokeAction() +{ + QCOMPARE(m_platformInputContext.m_action, QInputMethod::Click); + QCOMPARE(m_platformInputContext.m_cursorPosition, 0); + + qApp->inputMethod()->invokeAction(QInputMethod::ContextMenu, 5); + QCOMPARE(m_platformInputContext.m_action, QInputMethod::ContextMenu); + QCOMPARE(m_platformInputContext.m_cursorPosition, 5); +} + +void tst_qinputmethod::reset() +{ + QCOMPARE(m_platformInputContext.m_resetCallCount, 0); + + qApp->inputMethod()->reset(); + QCOMPARE(m_platformInputContext.m_resetCallCount, 1); + + qApp->inputMethod()->reset(); + QCOMPARE(m_platformInputContext.m_resetCallCount, 2); +} + +void tst_qinputmethod::commit() +{ + QCOMPARE(m_platformInputContext.m_commitCallCount, 0); + + qApp->inputMethod()->commit(); + QCOMPARE(m_platformInputContext.m_commitCallCount, 1); + + qApp->inputMethod()->commit(); + QCOMPARE(m_platformInputContext.m_commitCallCount, 2); +} + +void tst_qinputmethod::update() +{ + qApp->inputMethod()->setInputItem(&m_inputItem); + QCOMPARE(m_platformInputContext.m_updateCallCount, 0); + QCOMPARE(int(m_platformInputContext.m_lastQueries), int(Qt::ImhNone)); + + qApp->inputMethod()->update(Qt::ImQueryInput); + QCOMPARE(m_platformInputContext.m_updateCallCount, 1); + QCOMPARE(int(m_platformInputContext.m_lastQueries), int(Qt::ImQueryInput)); + + qApp->inputMethod()->update(Qt::ImQueryAll); + QCOMPARE(m_platformInputContext.m_updateCallCount, 2); + QCOMPARE(int(m_platformInputContext.m_lastQueries), int(Qt::ImQueryAll)); + + QCOMPARE(qApp->inputMethod()->keyboardRectangle(), QRectF(10, 20, 30, 40)); + + // reset + qApp->inputMethod()->setInputItem(0); +} + +void tst_qinputmethod::query() +{ + QInputMethodQueryEvent query(Qt::InputMethodQueries(Qt::ImPreferredLanguage | Qt::ImCursorRectangle)); + QGuiApplication::sendEvent(&m_inputItem, &query); + + QString language = query.value(Qt::ImPreferredLanguage).toString(); + QCOMPARE(language, QString("English")); + + QRect cursorRectangle = query.value(Qt::ImCursorRectangle).toRect(); + QCOMPARE(cursorRectangle, QRect(1,2,3,4)); +} + +void tst_qinputmethod::inputDirection() +{ + QCOMPARE(m_platformInputContext.m_inputDirectionCallCount, 0); + qApp->inputMethod()->inputDirection(); + QCOMPARE(m_platformInputContext.m_inputDirectionCallCount, 1); + + QCOMPARE(m_platformInputContext.m_localeCallCount, 0); + qApp->inputMethod()->locale(); + QCOMPARE(m_platformInputContext.m_localeCallCount, 1); +} + +QTEST_MAIN(tst_qinputmethod) +#include "tst_qinputmethod.moc" |