forked from qt-creator/qt-creator
Debugger: Added auto tests for QObjectChildList and QMapNode.
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
#include <QtCore/QObject>
|
#include <QtCore/QObject>
|
||||||
#include <QtCore/QProcess>
|
#include <QtCore/QProcess>
|
||||||
#include <QtCore/QFileInfo>
|
#include <QtCore/QFileInfo>
|
||||||
|
#include <QtCore/QMap>
|
||||||
#include <QtCore/QMetaMethod>
|
#include <QtCore/QMetaMethod>
|
||||||
#include <QtCore/QModelIndex>
|
#include <QtCore/QModelIndex>
|
||||||
#if QT_VERSION >= 0x040500
|
#if QT_VERSION >= 0x040500
|
||||||
@@ -152,7 +153,9 @@ private slots:
|
|||||||
void dumpQList_QString();
|
void dumpQList_QString();
|
||||||
void dumpQList_QString3();
|
void dumpQList_QString3();
|
||||||
void dumpQList_Int3();
|
void dumpQList_Int3();
|
||||||
|
void dumpQMapNode();
|
||||||
void dumpQObject();
|
void dumpQObject();
|
||||||
|
void dumpQObjectChildList();
|
||||||
void dumpQObjectMethodList();
|
void dumpQObjectMethodList();
|
||||||
void dumpQObjectPropertyList();
|
void dumpQObjectPropertyList();
|
||||||
void dumpQObjectSignal();
|
void dumpQObjectSignal();
|
||||||
@@ -188,6 +191,8 @@ private:
|
|||||||
void dumpQFileHelper(const QString &name, bool exists);
|
void dumpQFileHelper(const QString &name, bool exists);
|
||||||
void dumpQImageHelper(QImage &img);
|
void dumpQImageHelper(QImage &img);
|
||||||
void dumpQImageDataHelper(QImage &img);
|
void dumpQImageDataHelper(QImage &img);
|
||||||
|
template <typename K, typename V> void dumpQMapNodeHelper(QMap<K, V> &m);
|
||||||
|
void dumpQObjectChildListHelper(QObject &o);
|
||||||
void dumpQObjectMethodListHelper(QObject &obj);
|
void dumpQObjectMethodListHelper(QObject &obj);
|
||||||
void dumpQObjectPropertyListHelper(QObject &obj);
|
void dumpQObjectPropertyListHelper(QObject &obj);
|
||||||
void dumpQObjectSignalHelper(QObject &o, int sigNum);
|
void dumpQObjectSignalHelper(QObject &o, int sigNum);
|
||||||
@@ -916,6 +921,80 @@ void tst_Debugger::dumpQList_QString3()
|
|||||||
&s3list, NS"QList", true, "QString3");
|
&s3list, NS"QList", true, "QString3");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper functions for QMap* dumping.
|
||||||
|
template <typename T> static const char *typeToString(const T &)
|
||||||
|
{
|
||||||
|
return "<unknown type>";
|
||||||
|
}
|
||||||
|
template <typename T> const QByteArray valToString(const T &)
|
||||||
|
{
|
||||||
|
return "<unknown value>";
|
||||||
|
}
|
||||||
|
template <> const QByteArray valToString(const int &n)
|
||||||
|
{
|
||||||
|
return QByteArray().append(QString::number(n));
|
||||||
|
}
|
||||||
|
template <> const QByteArray valToString(const QString &s)
|
||||||
|
{
|
||||||
|
return QByteArray(utfToBase64(s)).append("',valueencoded='2");
|
||||||
|
}
|
||||||
|
template <> const char *typeToString(const int &)
|
||||||
|
{
|
||||||
|
return "int";
|
||||||
|
}
|
||||||
|
template <> const char *typeToString(const QString &)
|
||||||
|
{
|
||||||
|
return NS"QString";
|
||||||
|
}
|
||||||
|
template <typename T> static const char *typeToNumchild(const T &)
|
||||||
|
{
|
||||||
|
return "1";
|
||||||
|
}
|
||||||
|
template <> const char *typeToNumchild(const int &)
|
||||||
|
{
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
template <> const char *typeToNumchild(const QString &)
|
||||||
|
{
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename K, typename V>
|
||||||
|
void tst_Debugger::dumpQMapNodeHelper(QMap<K, V> &map)
|
||||||
|
{
|
||||||
|
for (typename QMap<K, V>::iterator it = map.begin(); it != map.end(); ++it) {
|
||||||
|
const K &key = it.key();
|
||||||
|
const V &val = it.value();
|
||||||
|
const char * const keyType = typeToString(key);
|
||||||
|
QByteArray expected = QByteArray("value='',numchild='2',childtype='").
|
||||||
|
append(keyType).append("',childnumchild='").append(typeToNumchild(key)).
|
||||||
|
append("',children=[{name='key',addr='").append(ptrToBa(&key)).
|
||||||
|
append("',value='").append(valToString(key)).append("'},{name='value',addr='").
|
||||||
|
append(ptrToBa(&val)).append("',value='").append(valToString(val)).
|
||||||
|
append("'}]");
|
||||||
|
QByteArray valType = QByteArray(typeToString(val));
|
||||||
|
QByteArray nodeType = keyType + QByteArray("@") + valType;
|
||||||
|
typedef QMapNode<K, V> node_t;
|
||||||
|
testDumper(expected, *reinterpret_cast<QMapData **>(&it), NS"QMapNode",
|
||||||
|
true, nodeType, "", 0, 0, sizeof(node_t), offsetof(node_t, value));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_Debugger::dumpQMapNode()
|
||||||
|
{
|
||||||
|
// Case 1: Empty Map.
|
||||||
|
QMap<int, QString> map;
|
||||||
|
dumpQMapNodeHelper(map);
|
||||||
|
|
||||||
|
// Case 2: One element.
|
||||||
|
map[3] = "String 1";
|
||||||
|
dumpQMapNodeHelper(map);
|
||||||
|
|
||||||
|
// Case 3: Two elements.
|
||||||
|
map[10] = "String 2";
|
||||||
|
dumpQMapNodeHelper(map);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_Debugger::dumpQObject()
|
void tst_Debugger::dumpQObject()
|
||||||
{
|
{
|
||||||
QObject parent;
|
QObject parent;
|
||||||
@@ -975,6 +1054,41 @@ void tst_Debugger::dumpQObject()
|
|||||||
&child, NS"QObject", false);
|
&child, NS"QObject", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_Debugger::dumpQObjectChildListHelper(QObject &o)
|
||||||
|
{
|
||||||
|
const QObjectList children = o.children();
|
||||||
|
const int size = children.size();
|
||||||
|
const QString sizeStr = QString::number(size);
|
||||||
|
QByteArray expected = QByteArray("numchild='").append(sizeStr).append("',value='<").
|
||||||
|
append(sizeStr).append(" items>',type='"NS"QObjectChildList',children=[");
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
const QObject *child = children.at(i);
|
||||||
|
expected.append("{addr='").append(ptrToBa(child)).append("',value='").
|
||||||
|
append(utfToBase64(child->objectName())).
|
||||||
|
append("',valueencoded='2',type='"NS"QObject',displayedtype='").
|
||||||
|
append(child->metaObject()->className()).append("',numchild='1'}");
|
||||||
|
if (i < size - 1)
|
||||||
|
expected.append(",");
|
||||||
|
}
|
||||||
|
expected.append("]");
|
||||||
|
testDumper(expected, &o, NS"QObjectChildList", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_Debugger::dumpQObjectChildList()
|
||||||
|
{
|
||||||
|
// Case 1: Object with no children.
|
||||||
|
QObject o;
|
||||||
|
dumpQObjectChildListHelper(o);
|
||||||
|
|
||||||
|
// Case 2: Object with one child.
|
||||||
|
QObject o2(&o);
|
||||||
|
dumpQObjectChildListHelper(o);
|
||||||
|
|
||||||
|
// Case 3: Object with two children.
|
||||||
|
QObject o3(&o);
|
||||||
|
dumpQObjectChildListHelper(o);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_Debugger::dumpQObjectMethodListHelper(QObject &obj)
|
void tst_Debugger::dumpQObjectMethodListHelper(QObject &obj)
|
||||||
{
|
{
|
||||||
const QMetaObject *mo = obj.metaObject();
|
const QMetaObject *mo = obj.metaObject();
|
||||||
|
Reference in New Issue
Block a user