From 2d832326bd1b6257849b23a86527c12a19d120b9 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 23 Apr 2013 13:09:38 +0200 Subject: fix messageboxhandler with help of new autotests - fix setDefaultAction (use std::reverse directly) - fix missing Ok MessageBox value in script context Change-Id: I82fa5a06d83b6c8659c60a3e56a1d4bd91e70c14 Reviewed-by: Karsten Heimrich --- src/libs/installer/messageboxhandler.cpp | 74 +++----------- tests/auto/installer/installer.pro | 3 +- .../messageboxhandler/messageboxhandler.pro | 5 + .../messageboxhandler/tst_messageboxhandler.cpp | 108 +++++++++++++++++++++ 4 files changed, 131 insertions(+), 59 deletions(-) create mode 100644 tests/auto/installer/messageboxhandler/messageboxhandler.pro create mode 100644 tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp diff --git a/src/libs/installer/messageboxhandler.cpp b/src/libs/installer/messageboxhandler.cpp index 832a96e85..2ae4c351d 100644 --- a/src/libs/installer/messageboxhandler.cpp +++ b/src/libs/installer/messageboxhandler.cpp @@ -49,49 +49,26 @@ #include #include +#include QScriptValue QInstaller::registerMessageBox(QScriptEngine *scriptEngine) { // register QMessageBox::StandardButton enum in the script connection QScriptValue messageBox = scriptEngine->newQObject(MessageBoxHandler::instance()); - messageBox.setProperty(QLatin1String("Ok"), - scriptEngine->newVariant(static_cast(QMessageBox::Yes))); - messageBox.setProperty(QLatin1String("Open"), - scriptEngine->newVariant(static_cast(QMessageBox::Open))); - messageBox.setProperty(QLatin1String("Save"), - scriptEngine->newVariant(static_cast(QMessageBox::Save))); - messageBox.setProperty(QLatin1String("Cancel"), - scriptEngine->newVariant(static_cast(QMessageBox::Cancel))); - messageBox.setProperty(QLatin1String("Close"), - scriptEngine->newVariant(static_cast(QMessageBox::Close))); - messageBox.setProperty(QLatin1String("Discard"), - scriptEngine->newVariant(static_cast(QMessageBox::Discard))); - messageBox.setProperty(QLatin1String("Apply"), - scriptEngine->newVariant(static_cast(QMessageBox::Apply))); - messageBox.setProperty(QLatin1String("Reset"), - scriptEngine->newVariant(static_cast(QMessageBox::Reset))); - messageBox.setProperty(QLatin1String("RestoreDefaults"), - scriptEngine->newVariant(static_cast(QMessageBox::RestoreDefaults))); - messageBox.setProperty(QLatin1String("Help"), - scriptEngine->newVariant(static_cast(QMessageBox::Help))); - messageBox.setProperty(QLatin1String("SaveAll"), - scriptEngine->newVariant(static_cast(QMessageBox::SaveAll))); - messageBox.setProperty(QLatin1String("Yes"), - scriptEngine->newVariant(static_cast(QMessageBox::Yes))); - messageBox.setProperty(QLatin1String("YesToAll"), - scriptEngine->newVariant(static_cast(QMessageBox::YesToAll))); - messageBox.setProperty(QLatin1String("No"), - scriptEngine->newVariant(static_cast(QMessageBox::No))); - messageBox.setProperty(QLatin1String("NoToAll"), - scriptEngine->newVariant(static_cast(QMessageBox::NoToAll))); - messageBox.setProperty(QLatin1String("Abort"), - scriptEngine->newVariant(static_cast(QMessageBox::Abort))); - messageBox.setProperty(QLatin1String("Retry"), - scriptEngine->newVariant(static_cast(QMessageBox::Retry))); - messageBox.setProperty(QLatin1String("Ignore"), - scriptEngine->newVariant(static_cast(QMessageBox::Ignore))); - messageBox.setProperty(QLatin1String("NoButton"), - scriptEngine->newVariant(static_cast(QMessageBox::NoButton))); + + const QMetaObject &messageBoxMetaObject = QMessageBox::staticMetaObject; + int index = messageBoxMetaObject.indexOfEnumerator("StandardButtons"); + + QMetaEnum metaEnum = messageBoxMetaObject.enumerator(index); + for (int i = 0; i < metaEnum.keyCount(); i++) { + int enumValue = metaEnum.value(i); + if (enumValue < QMessageBox::FirstButton) + continue; + messageBox.setProperty(QString::fromLatin1(metaEnum.valueToKey(metaEnum.value(i))), + scriptEngine->newVariant(enumValue)); + if (enumValue == QMessageBox::LastButton) + break; + } scriptEngine->globalObject().setProperty(QLatin1String("QMessageBox"), messageBox); return messageBox; @@ -99,25 +76,6 @@ QScriptValue QInstaller::registerMessageBox(QScriptEngine *scriptEngine) using namespace QInstaller; -template -static QList reversed(const QList &list) -{ - qFatal("This seems to be broken, check this!!!!"); - // TODO: Figure out what should happen here. See setDefaultAction(...). -#if 1 - // Note: This does not what the function name implies??? - QList res = list; - qCopyBackward(list.begin(), list.end(), res.end()); - return res; -#else - // Note: This does what the function name implies, but we need to check if this is what we want. - QList res = list; - std::reverse(res.begin(), res.end()); - return res; -#endif -} - - // -- MessageBoxHandler MessageBoxHandler *MessageBoxHandler::m_instance = 0; @@ -178,7 +136,7 @@ void MessageBoxHandler::setDefaultAction(DefaultAction defaultAction) if (m_defaultAction == Reject) { // If we want to reject everything, we need the lowest button. For example, if Cancel is existing it // could use Cancel, but if Close is existing it will use Close. - m_buttonOrder = reversed(m_buttonOrder); + std::reverse(m_buttonOrder.begin(), m_buttonOrder.end()); } } diff --git a/tests/auto/installer/installer.pro b/tests/auto/installer/installer.pro index 67a454db7..e8d31a23e 100644 --- a/tests/auto/installer/installer.pro +++ b/tests/auto/installer/installer.pro @@ -4,4 +4,5 @@ SUBDIRS += \ settings \ repository \ componentmodel \ - fakestopprocessforupdateoperation + fakestopprocessforupdateoperation \ + messageboxhandler diff --git a/tests/auto/installer/messageboxhandler/messageboxhandler.pro b/tests/auto/installer/messageboxhandler/messageboxhandler.pro new file mode 100644 index 000000000..4736205c6 --- /dev/null +++ b/tests/auto/installer/messageboxhandler/messageboxhandler.pro @@ -0,0 +1,5 @@ +include(../../qttest.pri) + +QT += script + +SOURCES += tst_messageboxhandler.cpp diff --git a/tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp b/tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp new file mode 100644 index 000000000..4b12507d3 --- /dev/null +++ b/tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp @@ -0,0 +1,108 @@ +#include "messageboxhandler.h" +#include "qinstallerglobal.h" + +#include +#include +#include +#include + +using namespace QInstaller; + +namespace QTest { + template<> + char *toString(const QMessageBox::StandardButton &button) + { + QString buttonAsString(QString::number(button)); + return qstrdup(buttonAsString.toLatin1().data()); + } +} + +class tst_MessageBoxHandler : public QObject +{ + Q_OBJECT +public: +private slots: + void initTestCase() + { + m_maxStandardButtons = 0; + + const QMetaObject &messageBoxMetaObject = QMessageBox::staticMetaObject; + int index = messageBoxMetaObject.indexOfEnumerator("StandardButtons"); + + QMetaEnum metaEnum = messageBoxMetaObject.enumerator(index); + for (int i = 0; i < metaEnum.keyCount(); i++) { + int enumValue = metaEnum.value(i); + if (enumValue < QMessageBox::FirstButton) + continue; + m_standardButtonValueMap.insert(static_cast(enumValue), + metaEnum.valueToKey(metaEnum.value(i))); + m_maxStandardButtons += enumValue; + if (enumValue == QMessageBox::LastButton) + break; + } + QInstaller::registerMessageBox(&m_scriptEngine); + } + + void testScriptButtonValues() + { + QMapIterator i(m_standardButtonValueMap); + while (i.hasNext()) { + i.next(); + QString scriptString = QString::fromLatin1("QMessageBox.%1").arg(i.value()); + QScriptValue scriptValue(m_scriptEngine.evaluate(scriptString)); + + QVERIFY2(!scriptValue.isUndefined(), qPrintable( + QString::fromLatin1("It seems that %1 is undefined.").arg(scriptString))); + + qint32 evaluatedValue = scriptValue.toInt32(); + QVERIFY2(!m_scriptEngine.hasUncaughtException(), qPrintable( + QInstaller::uncaughtExceptionString(&m_scriptEngine))); + + QCOMPARE(static_cast(evaluatedValue), i.key()); + } + } + + void testDefaultAction() + { + int standardButtons = QMessageBox::FirstButton; + QList orderedButtons = MessageBoxHandler::orderedButtons(); + MessageBoxHandler *messageBoxHandler = MessageBoxHandler::instance(); + + messageBoxHandler->setDefaultAction(MessageBoxHandler::Reject); + QString testidentifier(QLatin1String("TestError")); + QString testTitle(QLatin1String("A test error")); + QString testMessage(QLatin1String("This is a test error message.")); + + const char *ignoreMessage("\"created critical message box TestError: 'A test error', This is a test error message.\" "); + do { + standardButtons += QMessageBox::FirstButton; + + QTest::ignoreMessage(QtDebugMsg, ignoreMessage); + const QMessageBox::StandardButton returnButton = static_cast( + messageBoxHandler->critical(testidentifier, testTitle, testMessage, + static_cast(standardButtons))); + + QMessageBox::StandardButton wantedButton = QMessageBox::NoButton; + // find the last button which is the wanted reject button in the current + // standardButtons combination + foreach (QMessageBox::StandardButton button, orderedButtons) { + if (standardButtons & button) + wantedButton = button; + } + + QVERIFY2(wantedButton != QMessageBox::NoButton, "Could not find a wantedButton."); + QCOMPARE(returnButton, wantedButton); + + } while (standardButtons < m_maxStandardButtons); + + } + +private: + QMap m_standardButtonValueMap; + int m_maxStandardButtons; + QScriptEngine m_scriptEngine; +}; + +QTEST_MAIN(tst_MessageBoxHandler) + +#include "tst_messageboxhandler.moc" -- cgit v1.2.3