summaryrefslogtreecommitdiffstats
path: root/tests/arthur/common/qbaselinetest.cpp
diff options
context:
space:
mode:
authoraavit <qt-info@nokia.com>2011-01-07 15:47:04 (GMT)
committeraavit <qt-info@nokia.com>2011-01-07 15:47:04 (GMT)
commit33379f4a8b27ee37321c4e51f0d2f75f0eedd854 (patch)
treed75d19f53f8db4c1bae8f439ca0eb1c14748417c /tests/arthur/common/qbaselinetest.cpp
parentba2f8a1f7da6b40a095cad43e4b737dc1306b0cc (diff)
downloadQt-33379f4a8b27ee37321c4e51f0d2f75f0eedd854.zip
Qt-33379f4a8b27ee37321c4e51f0d2f75f0eedd854.tar.gz
Qt-33379f4a8b27ee37321c4e51f0d2f75f0eedd854.tar.bz2
Added api for efficient data driven baseline testing
Diffstat (limited to 'tests/arthur/common/qbaselinetest.cpp')
-rw-r--r--tests/arthur/common/qbaselinetest.cpp133
1 files changed, 101 insertions, 32 deletions
diff --git a/tests/arthur/common/qbaselinetest.cpp b/tests/arthur/common/qbaselinetest.cpp
index e95b510..79241d5 100644
--- a/tests/arthur/common/qbaselinetest.cpp
+++ b/tests/arthur/common/qbaselinetest.cpp
@@ -44,56 +44,45 @@
namespace QBaselineTest {
+BaselineProtocol proto;
bool connected = false;
bool triedConnecting = false;
-BaselineProtocol proto;
-
-bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArray *msg, bool *error)
-{
- QByteArray itemName;
- bool hasName = qstrlen(name);
- const char *tag = QTest::currentDataTag();
- if (qstrlen(tag)) {
- itemName = tag;
- if (hasName)
- itemName.append('_').append(name);
- } else {
- itemName = hasName ? name : "default_name";
- }
+QByteArray curFunction;
+ImageItemList itemList;
+bool gotBaselines;
- *msg = "Baseline check of image '" + itemName + "': ";
+bool connect(QByteArray *msg, bool *error)
+{
if (!triedConnecting) {
triedConnecting = true;
if (!proto.connect(QTest::testObject()->metaObject()->className())) {
*msg += "Failed to connect to baseline server: " + proto.errorMessage().toLatin1();
*error = true;
- return true;
+ return false;
}
connected = true;
}
if (!connected) {
*msg = "Not connected to baseline server.";
*error = true;
- return true;
+ return false;
}
+ return true;
+}
- ImageItem item;
- item.itemName = QLatin1String(itemName);
- item.itemChecksum = checksum;
- item.testFunction = QLatin1String(QTest::currentTestFunction());
- ImageItemList list;
- list.append(item);
- if (!proto.requestBaselineChecksums(QLatin1String(QTest::currentTestFunction()), &list) || list.isEmpty()) {
- *msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
- *error = true;
- return true;
- }
+
+bool compareItem(const ImageItem &baseline, const QImage &img, QByteArray *msg, bool *error)
+{
+ ImageItem item = baseline;
item.image = img;
+ item.imageChecksums.clear();
item.imageChecksums.prepend(ImageItem::computeChecksum(img));
QByteArray srvMsg;
- switch (list.at(0).status) {
+ switch (baseline.status) {
+ case ImageItem::Ok:
+ break;
case ImageItem::IgnoreItem :
qDebug() << msg->constData() << "Ignored, blacklisted on server.";
return true;
@@ -105,8 +94,6 @@ bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArra
qDebug() << msg->constData() << "Baseline not found on server. Uploading of new baseline failed:" << srvMsg;
return true;
break;
- case ImageItem::Ok:
- break;
default:
qWarning() << "Unexpected reply from baseline server.";
return true;
@@ -114,11 +101,93 @@ bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArra
}
*error = false;
// The actual comparison of the given image with the baseline:
- if (list.at(0).imageChecksums.contains(item.imageChecksums.at(0)))
+ if (baseline.imageChecksums.contains(item.imageChecksums.at(0)))
return true;
proto.submitMismatch(item, &srvMsg);
*msg += "Mismatch. See report:\n " + srvMsg;
return false;
}
+bool checkImage(const QImage &img, const char *name, quint16 checksum, QByteArray *msg, bool *error)
+{
+ if (!connected && !connect(msg, error))
+ return true;
+
+ QByteArray itemName;
+ bool hasName = qstrlen(name);
+ const char *tag = QTest::currentDataTag();
+ if (qstrlen(tag)) {
+ itemName = tag;
+ if (hasName)
+ itemName.append('_').append(name);
+ } else {
+ itemName = hasName ? name : "default_name";
+ }
+
+ *msg = "Baseline check of image '" + itemName + "': ";
+
+
+ ImageItem item;
+ item.itemName = QString::fromLatin1(itemName);
+ item.itemChecksum = checksum;
+ item.testFunction = QString::fromLatin1(QTest::currentTestFunction());
+ ImageItemList list;
+ list.append(item);
+ if (!proto.requestBaselineChecksums(QLatin1String(QTest::currentTestFunction()), &list) || list.isEmpty()) {
+ *msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
+ *error = true;
+ return true;
+ }
+
+ return compareItem(list.at(0), img, msg, error);
+}
+
+
+QTestData &newRow(const char *dataTag, quint16 checksum)
+{
+ if (QTest::currentTestFunction() != curFunction) {
+ curFunction = QTest::currentTestFunction();
+ itemList.clear();
+ gotBaselines = false;
+ }
+ ImageItem item;
+ item.itemName = QString::fromLatin1(dataTag);
+ item.itemChecksum = checksum;
+ item.testFunction = QString::fromLatin1(QTest::currentTestFunction());
+ itemList.append(item);
+
+ return QTest::newRow(dataTag);
+}
+
+
+bool testImage(const QImage& img, QByteArray *msg, bool *error)
+{
+ if (!connected && !connect(msg, error))
+ return true;
+
+ if (QTest::currentTestFunction() != curFunction || itemList.isEmpty()) {
+ qWarning() << "Usage error: QBASELINE_TEST used without corresponding QBaselineTest::newRow()";
+ return true;
+ }
+
+ if (!gotBaselines) {
+ if (!proto.requestBaselineChecksums(QString::fromLatin1(QTest::currentTestFunction()), &itemList) || itemList.isEmpty()) {
+ *msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
+ *error = true;
+ return true;
+ }
+ gotBaselines = true;
+ }
+
+ QString curTag = QString::fromLatin1(QTest::currentDataTag());
+ ImageItemList::const_iterator it = itemList.constBegin();
+ while (it != itemList.constEnd() && it->itemName != curTag)
+ ++it;
+ if (it == itemList.constEnd()) {
+ qWarning() << "Usage error: QBASELINE_TEST used without corresponding QBaselineTest::newRow() for row" << curTag;
+ return true;
+ }
+ return compareItem(*it, img, msg, error);
+}
+
}