From 26165d348df9fef2196c27120dbdc0f22a260096 Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Fri, 25 Oct 2013 13:35:31 +0200
Subject: [PATCH] Debugger: Allow more fine-grained debugger specific tests

This is now (additionally) on a per-entry level, resulting
in less duplication.

Change-Id: Ia93547396384fe5b421c4b601b52476a23cdfa89
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 tests/auto/debugger/tst_dumpers.cpp | 189 +++++++++++++++-------------
 1 file changed, 100 insertions(+), 89 deletions(-)

diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp
index 7b08bb3514c..4c7965e3918 100644
--- a/tests/auto/debugger/tst_dumpers.cpp
+++ b/tests/auto/debugger/tst_dumpers.cpp
@@ -157,6 +157,9 @@ static QString toHex(const QString &str)
 }
 
 
+struct GdbOnly {};
+struct LldbOnly {};
+
 struct Context
 {
     Context() : qtVersion(0) {}
@@ -305,7 +308,22 @@ struct Type
     QByteArray type;
 };
 
-struct Check
+enum DebuggerEngine
+{
+    DumpTestGdbEngine,
+    DumpTestCdbEngine,
+    DumpTestLldbEngine
+};
+
+struct CheckBase
+{
+    CheckBase() : useLldb(true), useGdb(true) {}
+
+    mutable bool useLldb;
+    mutable bool useGdb;
+};
+
+struct Check : CheckBase
 {
     Check() {}
 
@@ -320,6 +338,30 @@ struct Check
           expectedValue(value), expectedType(type)
     {}
 
+    bool matchesEngine(DebuggerEngine engine) const
+    {
+        return (engine == DumpTestLldbEngine && useLldb)
+            || (engine == DumpTestGdbEngine && useGdb);
+    }
+
+    const Check &setForLldbOnly() const
+    {
+        clearUsed();
+        useLldb = true;
+        return *this;
+    }
+
+    const Check &setForGdbOnly() const
+    {
+        clearUsed();
+        useGdb = true;
+        return *this;
+    }
+
+    void clearUsed() const
+    {
+        useLldb = useGdb = false;
+    }
     QByteArray iname;
     Name expectedName;
     Value expectedValue;
@@ -381,9 +423,6 @@ struct MacLibCppProfile : public Profile
     {}
 };
 
-struct GdbOnly {};
-struct LldbOnly {};
-
 struct GdbVersion
 {
     // Minimum and maximum are inclusive.
@@ -454,7 +493,7 @@ public:
 
     const Data &operator%(const Check &check) const
     {
-        checks.insert("local." + check.iname, check);
+        checks.append(check);
         return *this;
     }
 
@@ -532,7 +571,7 @@ public:
     mutable QByteArray profileExtra;
     mutable QByteArray includes;
     mutable QByteArray code;
-    mutable QMap<QByteArray, Check> checks; // IName -> Action
+    mutable QList<Check> checks;
 };
 
 struct TempStuff
@@ -549,13 +588,6 @@ struct TempStuff
     QString buildPath;
 };
 
-enum DebuggerEngine
-{
-    DumpTestGdbEngine,
-    DumpTestCdbEngine,
-    DumpTestLldbEngine
-};
-
 Q_DECLARE_METATYPE(Data)
 
 class tst_Dumpers : public QObject
@@ -997,26 +1029,36 @@ void tst_Dumpers::dumper()
     bool ok = true;
     foreach (const WatchData &item, list) {
         seenINames.insert(item.iname);
-        if (data.checks.contains(item.iname)) {
-            Check check = data.checks.take(item.iname);
-            if (!check.expectedName.matches(item.name.toLatin1(), context)) {
-                qDebug() << "INAME        : " << item.iname;
-                qDebug() << "NAME ACTUAL  : " << item.name.toLatin1();
-                qDebug() << "NAME EXPECTED: " << check.expectedName.name;
-                ok = false;
-            }
-            if (!check.expectedValue.matches(item.value, context)) {
-                qDebug() << "INAME         : " << item.iname;
-                qDebug() << "VALUE ACTUAL  : " << item.value << toHex(item.value);
-                qDebug() << "VALUE EXPECTED: "
-                    << check.expectedValue.value << toHex(check.expectedValue.value);
-                ok = false;
-            }
-            if (!check.expectedType.matches(item.type, context)) {
-                qDebug() << "INAME        : " << item.iname;
-                qDebug() << "TYPE ACTUAL  : " << item.type;
-                qDebug() << "TYPE EXPECTED: " << check.expectedType.type;
-                ok = false;
+        //qDebug() << "NUM CHECKS" << data.checks.size();
+        for (int i = data.checks.size(); --i >= 0; ) {
+            Check check = data.checks.at(i);
+            //qDebug() << "CHECKS" << i << check.iname;
+            if ("local." + check.iname == item.iname) {
+                data.checks.removeAt(i);
+                if (check.matchesEngine(m_debuggerEngine)) {
+                    //qDebug() << "USING MATCHING TEST FOR " << item.iname;
+                    if (!check.expectedName.matches(item.name.toLatin1(), context)) {
+                        qDebug() << "INAME        : " << item.iname;
+                        qDebug() << "NAME ACTUAL  : " << item.name.toLatin1();
+                        qDebug() << "NAME EXPECTED: " << check.expectedName.name;
+                        ok = false;
+                    }
+                    if (!check.expectedValue.matches(item.value, context)) {
+                        qDebug() << "INAME         : " << item.iname;
+                        qDebug() << "VALUE ACTUAL  : " << item.value << toHex(item.value);
+                        qDebug() << "VALUE EXPECTED: "
+                            << check.expectedValue.value << toHex(check.expectedValue.value);
+                        ok = false;
+                    }
+                    if (!check.expectedType.matches(item.type, context)) {
+                        qDebug() << "INAME        : " << item.iname;
+                        qDebug() << "TYPE ACTUAL  : " << item.type;
+                        qDebug() << "TYPE EXPECTED: " << check.expectedType.type;
+                        ok = false;
+                    }
+                } else {
+                    qDebug() << "SKIPPING NON-MATCHING TEST FOR " << item.iname;
+                }
             }
         }
     }
@@ -2190,7 +2232,7 @@ void tst_Dumpers::dumper_data()
                     "QString dummy;\n"
                     "QPoint s0, s;\n"
                     "s = QPoint(100, 200);\n"
-                    "unused(&s0, &s);\n")
+                    "unused(&s0, &s, &dummy);\n")
                % CoreProfile()
                % Check("s0", "(0, 0)", "@QPoint")
                % Check("s", "(100, 200)", "@QPoint");
@@ -2200,7 +2242,8 @@ void tst_Dumpers::dumper_data()
                     "#include <QString> // Dummy for namespace\n",
                     "QString dummy;\n"
                     "QPointF s0, s;\n"
-                    "s = QPointF(100.5, 200.5);\n")
+                    "s = QPointF(100.5, 200.5);\n"
+                    "unused(&s0, &s, &dummy);\n")
                % CoreProfile()
                % Check("s0", "(0.0, 0.0)", "@QPointF")
                % Check("s", "(100.5, 200.5)", "@QPointF");
@@ -2210,8 +2253,9 @@ void tst_Dumpers::dumper_data()
                     "#include <QString> // Dummy for namespace\n",
                     "QString dummy;\n"
                     "QRect rect0, rect;\n"
-                    "rect = QRect(100, 100, 200, 200);\n")
-               % Check("rect", "0x0+0+0", "@QRect")
+                    "rect = QRect(100, 100, 200, 200);\n"
+                    "unused(&rect0, &rect, &dummy);\n")
+               % Check("rect0", "0x0+0+0", "@QRect")
                % Check("rect", "200x200+100+100", "@QRect");
 
     QTest::newRow("QRectF")
@@ -2219,8 +2263,9 @@ void tst_Dumpers::dumper_data()
                     "#include <QString> // Dummy for namespace\n",
                     "QString dummy;\n"
                     "QRectF rect0, rect;\n"
-                    "rect = QRectF(100.25, 100.25, 200.5, 200.5);\n")
-               % Check("rect", "0x0+0+0", "@QRectF")
+                    "rect = QRectF(100.25, 100.25, 200.5, 200.5);\n"
+                    "unused(&rect0, &rect, &dummy);\n")
+               % Check("rect0", "0.0x0.0+0.0+0.0", "@QRectF")
                % Check("rect", "200.5x200.5+100.25+100.25", "@QRectF");
 
     QTest::newRow("QSize")
@@ -2228,7 +2273,8 @@ void tst_Dumpers::dumper_data()
                     "#include <QString> // Dummy for namespace\n",
                     "QString dummy;\n"
                     "QSize s0, s;\n"
-                    "s = QSize(100, 200);\n")
+                    "s = QSize(100, 200);\n"
+                    "unused(&s0, &s, &dummy);\n")
                % CoreProfile()
                % Check("s0", "(-1, -1)", "@QSize")
                % Check("s", "(100, 200)", "@QSize");
@@ -2238,7 +2284,8 @@ void tst_Dumpers::dumper_data()
                     "#include <QString> // Dummy for namespace\n",
                     "QString dummy;\n"
                     "QSizeF s0, s;\n"
-                    "s = QSizeF(100.5, 200.5);\n")
+                    "s = QSizeF(100.5, 200.5);\n"
+                    "unused(&s0, &s, &dummy);\n")
                % CoreProfile()
                % Check("s0", "(-1.0, -1.0)", "@QSizeF")
                % Check("s", "(100.5, 200.5)", "@QSizeF");
@@ -2474,27 +2521,17 @@ void tst_Dumpers::dumper_data()
                % Check("c", "(1.000000, 2.000000)", "std::complex<double>")
                % CheckType("c.real", "double");
 
-    QTest::newRow("CComplexGdb")
+    QTest::newRow("CComplex")
             << Data("#include <complex.h>\n",
                     "// Doesn't work when compiled as C++.\n"
                     "double complex a = 0;\n"
                     "double _Complex b = 0;\n"
                     "unused(&a, &b);\n")
                % ForceC()
-               % GdbOnly()
-               % Check("a", "0 + 0 * I", "complex double")
-               % Check("b", "0 + 0 * I", "complex double");
-
-    QTest::newRow("CComplexLldb")
-            << Data("#include <complex.h>\n",
-                    "// Doesn't work when compiled as C++.\n"
-                    "double complex a = 0;\n"
-                    "double _Complex b = 0;\n"
-                    "unused(&a, &b);\n")
-               % ForceC()
-               % LldbOnly()
-               % Check("a", "0 + 0i", "_Complex double")
-               % Check("b", "0 + 0i", "_Complex double");
+               % Check("a", "0 + 0 * I", "complex double").setForGdbOnly()
+               % Check("b", "0 + 0 * I", "complex double").setForGdbOnly()
+               % Check("a", "0 + 0i", "_Complex double").setForLldbOnly()
+               % Check("b", "0 + 0i", "_Complex double").setForLldbOnly();
 
     QTest::newRow("StdDequeInt")
             << Data("#include <deque>\n",
@@ -3974,30 +4011,7 @@ void tst_Dumpers::dumper_data()
                % Check("foo.9", "[9]", "", "Foo");
 
 
-    QTest::newRow("BitfieldsGdb")
-            << Data("struct S\n"
-                    "{\n"
-                    "    S() : x(0), y(0), c(0), b(0), f(0), d(0), i(0) {}\n"
-                    "    unsigned int x : 1;\n"
-                    "    unsigned int y : 1;\n"
-                    "    bool c : 1;\n"
-                    "    bool b;\n"
-                    "    float f;\n"
-                    "    double d;\n"
-                    "    int i;\n"
-                    "} s;\n"
-                    "unused(&s);\n")
-               % GdbOnly()
-               % Check("s", "", "S")
-               % Check("s.b", "false", "bool")
-               % Check("s.c", "false", "bool")
-               % Check("s.d", "0", "double")
-               % Check("s.f", "0", "float")
-               % Check("s.i", "0", "int")
-               % Check("s.x", "0", "unsigned int")
-               % Check("s.y", "0", "unsigned int");
-
-    QTest::newRow("BitfieldsLldb")
+    QTest::newRow("Bitfields")
             << Data("struct S\n"
                     "{\n"
                     "    S() : x(0), y(0), c(0), b(0), f(0), d(0), i(0) {}\n"
@@ -4010,15 +4024,17 @@ void tst_Dumpers::dumper_data()
                     "    int i;\n"
                     "} s;\n"
                     "unused(&s);\n")
-               % LldbOnly()
                % Check("s", "", "S")
                % Check("s.b", "false", "bool")
-               % Check("s.c", "false", "bool:1")
+               % Check("s.c", "false", "bool:1").setForLldbOnly()
+               % Check("s.c", "false", "bool").setForGdbOnly()
                % Check("s.d", "0", "double")
                % Check("s.f", "0", "float")
                % Check("s.i", "0", "int")
-               % Check("s.x", "0", "unsigned int:1")
-               % Check("s.y", "0", "unsigned int:1");
+               % Check("s.x", "0", "unsigned int:1").setForLldbOnly()
+               % Check("s.x", "0", "unsigned int").setForGdbOnly()
+               % Check("s.y", "0", "unsigned int:1").setForLldbOnly()
+               % Check("s.y", "0", "unsigned int").setForGdbOnly();
 
 
     QTest::newRow("Function")
@@ -4036,14 +4052,9 @@ void tst_Dumpers::dumper_data()
                     "Function func(\"x\", \"sin(x)\", 0, 1);\n"
                     "func.max = 10;\n"
                     "func.f = \"cos(x)\";\n"
-                    "func.max = 4;\n"
-                    "func.max = 5;\n"
-                    "func.max = 6;\n"
                     "func.max = 7;\n")
                % CoreProfile()
                % Check("func", "", "Function")
-               % Check("func.f", "sin(x)", "@QByteArray")
-               % Check("func.max", "1", "double")
                % Check("func.min", "0", "double")
                % Check("func.var", "\"x\"", "@QByteArray")
                % Check("func", "", "Function")
-- 
GitLab