summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@digia.com>2013-04-23 13:09:38 +0200
committerTim Jenssen <tim.jenssen@digia.com>2013-04-23 16:02:05 +0200
commit2d832326bd1b6257849b23a86527c12a19d120b9 (patch)
treecb7eb3542df34ef37f3ac6138816e417942ec90f
parent1ee847c0dd56fcfbe2d93d64120789083c7a5bcf (diff)
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 <karsten.heimrich@digia.com>
-rw-r--r--src/libs/installer/messageboxhandler.cpp74
-rw-r--r--tests/auto/installer/installer.pro3
-rw-r--r--tests/auto/installer/messageboxhandler/messageboxhandler.pro5
-rw-r--r--tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp108
4 files changed, 131 insertions, 59 deletions
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 <QScriptEngine>
#include <QScriptValue>
+#include <QMetaEnum>
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<int>(QMessageBox::Yes)));
- messageBox.setProperty(QLatin1String("Open"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Open)));
- messageBox.setProperty(QLatin1String("Save"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Save)));
- messageBox.setProperty(QLatin1String("Cancel"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Cancel)));
- messageBox.setProperty(QLatin1String("Close"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Close)));
- messageBox.setProperty(QLatin1String("Discard"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Discard)));
- messageBox.setProperty(QLatin1String("Apply"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Apply)));
- messageBox.setProperty(QLatin1String("Reset"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Reset)));
- messageBox.setProperty(QLatin1String("RestoreDefaults"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::RestoreDefaults)));
- messageBox.setProperty(QLatin1String("Help"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Help)));
- messageBox.setProperty(QLatin1String("SaveAll"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::SaveAll)));
- messageBox.setProperty(QLatin1String("Yes"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Yes)));
- messageBox.setProperty(QLatin1String("YesToAll"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::YesToAll)));
- messageBox.setProperty(QLatin1String("No"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::No)));
- messageBox.setProperty(QLatin1String("NoToAll"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::NoToAll)));
- messageBox.setProperty(QLatin1String("Abort"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Abort)));
- messageBox.setProperty(QLatin1String("Retry"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Retry)));
- messageBox.setProperty(QLatin1String("Ignore"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Ignore)));
- messageBox.setProperty(QLatin1String("NoButton"),
- scriptEngine->newVariant(static_cast<int>(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 <typename T>
-static QList<T> reversed(const QList<T> &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<T> 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<T> 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 <QTest>
+#include <QMetaEnum>
+#include <QScriptEngine>
+#include <QDebug>
+
+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<QMessageBox::StandardButton>(enumValue),
+ metaEnum.valueToKey(metaEnum.value(i)));
+ m_maxStandardButtons += enumValue;
+ if (enumValue == QMessageBox::LastButton)
+ break;
+ }
+ QInstaller::registerMessageBox(&m_scriptEngine);
+ }
+
+ void testScriptButtonValues()
+ {
+ QMapIterator<QMessageBox::StandardButton, QString> 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<QMessageBox::StandardButton>(evaluatedValue), i.key());
+ }
+ }
+
+ void testDefaultAction()
+ {
+ int standardButtons = QMessageBox::FirstButton;
+ QList<QMessageBox::Button> 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<QMessageBox::StandardButton>(
+ messageBoxHandler->critical(testidentifier, testTitle, testMessage,
+ static_cast<QMessageBox::StandardButton>(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<QMessageBox::StandardButton, QString> m_standardButtonValueMap;
+ int m_maxStandardButtons;
+ QScriptEngine m_scriptEngine;
+};
+
+QTEST_MAIN(tst_MessageBoxHandler)
+
+#include "tst_messageboxhandler.moc"