Commit 0ab8f1ed authored by ck's avatar ck
Browse files

Debugger: More dumper auto tests.

Added auto tests for QFileInfo, QHashNode and QLocale dumpers.
parent 3ccb4415
......@@ -157,19 +157,6 @@ int qtGhVersion = QT_VERSION;
*/
#undef NS
#ifdef QT_NAMESPACE
# define STRINGIFY0(s) #s
# define STRINGIFY1(s) STRINGIFY0(s)
# define NS STRINGIFY1(QT_NAMESPACE) "::"
# define NSX "'" STRINGIFY1(QT_NAMESPACE) "::"
# define NSY "'"
#else
# define NS ""
# define NSX ""
# define NSY ""
#endif
#if defined(QT_BEGIN_NAMESPACE)
QT_BEGIN_NAMESPACE
#endif
......
......@@ -44,6 +44,19 @@
#include <QtCore/QObject>
#undef NS
#ifdef QT_NAMESPACE
# define STRINGIFY0(s) #s
# define STRINGIFY1(s) STRINGIFY0(s)
# define NS STRINGIFY1(QT_NAMESPACE) "::"
# define NSX "'" STRINGIFY1(QT_NAMESPACE) "::"
# define NSY "'"
#else
# define NS ""
# define NSX ""
# define NSY ""
#endif
#if defined(QT_BEGIN_NAMESPACE)
QT_BEGIN_NAMESPACE
#endif
......
......@@ -147,6 +147,7 @@ private slots:
void dumpQFile();
void dumpQFileInfo();
void dumpQHash();
void dumpQHashNode();
void dumpQImage();
void dumpQImageData();
void dumpQList_int();
......@@ -154,6 +155,7 @@ private slots:
void dumpQList_QString();
void dumpQList_QString3();
void dumpQList_Int3();
void dumpQLocale();
void dumpQMap();
void dumpQMapNode();
void dumpQObject();
......@@ -193,8 +195,10 @@ private:
void dumpQDateTimeHelper(QDateTime &d);
void dumpQDirHelper(QDir &d);
void dumpQFileHelper(const QString &name, bool exists);
template <typename K, typename V> void dumpQHashNodeHelper(QHash<K, V> &hash);
void dumpQImageHelper(QImage &img);
void dumpQImageDataHelper(QImage &img);
void dumpQLocaleHelper(QLocale &loc);
template <typename K, typename V> void dumpQMapHelper(QMap<K, V> &m);
template <typename K, typename V> void dumpQMapNodeHelper(QMap<K, V> &m);
void dumpQObjectChildListHelper(QObject &o);
......@@ -488,6 +492,13 @@ static const QByteArray generateQStringSpec(const QString& str)
append("',type='"NS"QString',numchild='0',valueencoded='2'");
}
static const QByteArray generateQCharSpec(const QChar& ch)
{
return QByteArray("value='").append(utfToBase64(QString(QLatin1String("'%1' (%2, 0x%3)")).
arg(ch).arg(ch.unicode()).arg(ch.unicode(), 0, 16))).
append("',valueencoded='2',type='"NS"QChar',numchild='0'");
}
static const QByteArray generateBoolSpec(bool b)
{
return QByteArray("value=").append(boolToVal(b)).append(",type='bool',numchild='0'");
......@@ -510,6 +521,12 @@ static const QByteArray generateIntSpec(int n)
return generateIntegerSpec(n, "int");
}
const QString createExp(const void *ptr, const QString &type, const QString &method)
{
return QString("exp='((").append(NSX).append(type).append(NSY).append("*)").
append(ptrToBa(ptr)).append(")->").append(method).append("()'");
}
// Helper functions.
#ifdef Q_CC_MSVC
......@@ -924,7 +941,6 @@ void tst_Debugger::dumpQFileInfo()
append("{name='isBundle',").append(generateBoolSpec(fi.isBundle()).append("},").
append("{name='bundleName',").append(generateQStringSpec(fi.bundleName())).append("'},").
#endif
append("{name='completeSuffix',").append(generateQStringSpec(fi.completeSuffix())).append("},").
append("{name='fileName',").append(generateQStringSpec(fi.fileName())).append("},").
append("{name='filePath',").append(generateQStringSpec(fi.filePath())).append("},").
append("{name='group',").append(generateQStringSpec(fi.group())).append("},").
......@@ -946,26 +962,15 @@ void tst_Debugger::dumpQFileInfo()
append("{name='isSymLink',").append(generateBoolSpec(fi.isSymLink())).append("},").
append("{name='isWritable',").append(generateBoolSpec(fi.isWritable())).append("},").
append("{name='created',value='").append(utfToBase64(fi.created().toString())).
append("',valueencoded='2',type='"NS"QDateTime',numchild='1'},").
#if 0
???
d.beginHash();
d.putItem("name", "created");
d.putItem("value", info.created().toString());
d.putItem("valueencoded", "2");
d.beginItem("exp");
d.put("(("NSX"QFileInfo"NSY"*)").put(d.data).put(")->created()");
d.endItem();
d.putItem("type", NS"QDateTime");
d.putItem("numchild", "1");
d.endHash();
#endif
append("]");
// testDumper(expected, &fi, NS"QFileInfo", true);
append("',valueencoded='2',").append(createExp(&fi, "QFileInfo", "created")).
append(",type='"NS"QDateTime',numchild='1'},").append("{name='lastModified',value='").
append(utfToBase64(fi.lastModified().toString())).append("',valueencoded='2',").
append(createExp(&fi, "QFileInfo", "lastModified")).
append(",type='"NS"QDateTime',numchild='1'},").
append("{name='lastRead',value='").append(utfToBase64(fi.lastRead().toString())).
append("',valueencoded='2',").append(createExp(&fi, "QFileInfo", "lastRead")).
append(",type='"NS"QDateTime',numchild='1'}]");
testDumper(expected, &fi, NS"QFileInfo", true);
}
void tst_Debugger::dumpQHash()
......@@ -977,6 +982,50 @@ void tst_Debugger::dumpQHash()
hash.insert("!", QList<int>() << 1 << 2);
}
template <typename K, typename V>
void tst_Debugger::dumpQHashNodeHelper(QHash<K, V> &hash)
{
typename QHash<K, V>::iterator it = hash.begin();
typedef QHashNode<K, V> HashNode;
HashNode *node =
reinterpret_cast<HashNode *>(reinterpret_cast<char *>(const_cast<K *>(&it.key())) -
offsetof(HashNode, key));
const K &key = it.key();
const V &val = it.value();
QByteArray expected("value='");
if (isSimpleType(val))
expected.append(valToString(val));
expected.append("',numchild='2',children=[{name='key',type='").
append(typeToString(key)).append("',addr='").append(ptrToBa(&key)).
append("'},{name='value',type='").append(typeToString(val)).
append("',addr='").append(ptrToBa(&val)).append("'}]");
testDumper(expected, node, NS"QHashNode", true,
getMapType(it.key(), it.value()), "", sizeof(it.key()), sizeof(it.value()));
}
void tst_Debugger::dumpQHashNode()
{
// Case 1: simple type -> simple type.
QHash<int, int> hash1;
hash1[2] = 3;
dumpQHashNodeHelper(hash1);
// Case 2: simple type -> composite type.
QHash<int, QString> hash2;
hash2[5] = "String 7";
dumpQHashNodeHelper(hash2);
// Case 3: composite type -> simple type
QHash<QString, int> hash3;
hash3["String 11"] = 13;
dumpQHashNodeHelper(hash3);
// Case 4: composite type -> composite type
QHash<QString, QString> hash4;
hash4["String 17"] = "String 19";
dumpQHashNodeHelper(hash4);
}
void tst_Debugger::dumpQImageHelper(QImage &img)
{
QByteArray expected = QByteArray("value='(").
......@@ -1102,6 +1151,42 @@ void tst_Debugger::dumpQList_QString3()
&s3list, NS"QList", true, "QString3");
}
void tst_Debugger::dumpQLocaleHelper(QLocale &loc)
{
QByteArray expected = QByteArray("value='").append(valToString(loc.name())).
append("',type='"NS"QLocale',numchild='8',children=[{name='country',").
append(createExp(&loc, "QLocale", "country")).append("},{name='language',").
append(createExp(&loc, "QLocale", "language")).append("},{name='measurementSystem',").
append(createExp(&loc, "QLocale", "measurementSystem")).
append("},{name='numberOptions',").append(createExp(&loc, "QLocale", "numberOptions")).
append("},{name='timeFormat_(short)',").
append(generateQStringSpec(loc.timeFormat(QLocale::ShortFormat))).
append("},{name='timeFormat_(long)',").append(generateQStringSpec(loc.timeFormat())).
append("},{name='decimalPoint',").append(generateQCharSpec(loc.decimalPoint())).
append("},{name='exponential',").append(generateQCharSpec(loc.exponential())).
append("},{name='percent',").append(generateQCharSpec(loc.percent())).
append("},{name='zeroDigit',").append(generateQCharSpec(loc.zeroDigit())).
append("},{name='groupSeparator',").append(generateQCharSpec(loc.groupSeparator())).
append("},{name='negativeSign',").append(generateQCharSpec(loc.negativeSign())).
append("}]");
testDumper(expected, &loc, NS"QLocale", true);
}
void tst_Debugger::dumpQLocale()
{
QLocale english(QLocale::English);
dumpQLocaleHelper(english);
QLocale german(QLocale::German);
dumpQLocaleHelper(german);
QLocale chinese(QLocale::Chinese);
dumpQLocaleHelper(chinese);
QLocale swahili(QLocale::Swahili);
dumpQLocaleHelper(swahili);
}
template <typename K, typename V> const QByteArray getMapType(K keyDummy, V valDummy)
{
return QByteArray(typeToString(keyDummy)) + "@" + QByteArray(typeToString(valDummy));
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment