Improve output on test failures
authorJoão Abecasis <joao.abecasis@nokia.com>
Thu, 22 Mar 2012 00:28:30 +0000 (01:28 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 28 Mar 2012 07:36:52 +0000 (09:36 +0200)
This adds checks to ensure Q_ALIGNOF is returning the desired alignment
for explicitly-aligned types.

The alignment check is now inlined in the test inside QCOMPARE so we get
slightly more informative errors:

FAIL!  : tst_Collections::alignment() Compared values are not the same
   Actual   (quintptr(&it.value()) % Value::PreferredAlignment): 64
   Expected (quintptr(0)): 0
   Loc: [tst_collections.cpp(3384)]

In this case, this is enough to notice "non-native" alignments are being
requested. Having test parameters otherwise hidden in template arguments
doesn't help the situation.

Change-Id: I05267fd25b71f183cfb98fb5b0a7dfd6c28da816
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
tests/auto/other/collections/tst_collections.cpp

index d4d70b5..a9cef63 100644 (file)
@@ -3318,30 +3318,28 @@ class Q_DECL_ALIGN(4) Aligned4
     char i;
 public:
     Aligned4(int i = 0) : i(i) {}
-    bool checkAligned() const
-    {
-        return (quintptr(this) & 3) == 0;
-    }
+
+    enum { PreferredAlignment = 4 };
 
     inline bool operator==(const Aligned4 &other) const { return i == other.i; }
     inline bool operator<(const Aligned4 &other) const { return i < other.i; }
     friend inline int qHash(const Aligned4 &a) { return qHash(a.i); }
 };
+Q_STATIC_ASSERT(Q_ALIGNOF(Aligned4) % 4 == 0);
 
 class Q_DECL_ALIGN(128) Aligned128
 {
     char i;
 public:
     Aligned128(int i = 0) : i(i) {}
-    bool checkAligned() const
-    {
-        return (quintptr(this) & 127) == 0;
-    }
+
+    enum { PreferredAlignment = 128 };
 
     inline bool operator==(const Aligned128 &other) const { return i == other.i; }
     inline bool operator<(const Aligned128 &other) const { return i < other.i; }
     friend inline int qHash(const Aligned128 &a) { return qHash(a.i); }
 };
+Q_STATIC_ASSERT(Q_ALIGNOF(Aligned128) % 128 == 0);
 
 template<typename C>
 void testVectorAlignment()
@@ -3349,13 +3347,13 @@ void testVectorAlignment()
     typedef typename C::value_type Aligned;
     C container;
     container.append(Aligned());
-    QVERIFY(container[0].checkAligned());
+    QCOMPARE(quintptr(&container[0]) % Aligned::PreferredAlignment, quintptr(0));
 
     for (int i = 0; i < 200; ++i)
         container.append(Aligned());
     
     for (int i = 0; i < container.size(); ++i)
-        QVERIFY(container.at(i).checkAligned());
+        QCOMPARE(quintptr(&container.at(i)) % Aligned::PreferredAlignment, quintptr(0));
 }
 
 template<typename C>
@@ -3364,13 +3362,13 @@ void testContiguousCacheAlignment()
     typedef typename C::value_type Aligned;
     C container(150);
     container.append(Aligned());
-    QVERIFY(container[container.firstIndex()].checkAligned());
+    QCOMPARE(quintptr(&container[container.firstIndex()]) % Aligned::PreferredAlignment, quintptr(0));
 
     for (int i = 0; i < 200; ++i)
         container.append(Aligned());
 
     for (int i = container.firstIndex(); i < container.lastIndex(); ++i)
-        QVERIFY(container.at(i).checkAligned());
+        QCOMPARE(quintptr(&container.at(i)) % Aligned::PreferredAlignment, quintptr(0));
 }
 
 template<typename C>
@@ -3382,8 +3380,8 @@ void testAssociativeContainerAlignment()
     container.insert(Key(), Value());
 
     typename C::const_iterator it = container.constBegin();
-    QVERIFY(it.key().checkAligned());
-    QVERIFY(it.value().checkAligned());
+    QCOMPARE(quintptr(&it.key()) % Key::PreferredAlignment, quintptr(0));
+    QCOMPARE(quintptr(&it.value()) % Value::PreferredAlignment, quintptr(0));
 
     // add some more elements
     for (int i = 0; i < 200; ++i)
@@ -3391,8 +3389,8 @@ void testAssociativeContainerAlignment()
 
     it = container.constBegin();
     for ( ; it != container.constEnd(); ++it) {
-        QVERIFY(it.key().checkAligned());
-        QVERIFY(it.value().checkAligned());
+        QCOMPARE(quintptr(&it.key()) % Key::PreferredAlignment, quintptr(0));
+        QCOMPARE(quintptr(&it.value()) % Value::PreferredAlignment, quintptr(0));
     }
 }