summaryrefslogtreecommitdiffstats
path: root/tests/auto/other/toolsupport/tst_toolsupport.cpp
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2014-09-16 09:30:56 +0200
committerhjk <hjk121@nokiamail.com>2014-10-24 07:18:44 +0200
commit497f0af1f71417964bc9b744fbaef83f8f0a2345 (patch)
tree138bb15b4c6a217938c31b1d8d1bb6def778e897 /tests/auto/other/toolsupport/tst_toolsupport.cpp
parent55be75c9696d38951afcf16ee8198bb86a7f2f38 (diff)
Add some tools specific consistency tests
This upstreams parts of Qt Creator's tst_offset test to serve as an early warning system by testing private implementation details that are used in Qt Creator's data structure "pretty printing" facility. While the tested implementation details can be changed without breaking binary or source compatibility, downstream tools like Qt Creator depend on them. If this test breaks, you are kindly asked to coordinate with the downstream stakeholders to avoid tool breakage. Change-Id: I1286efcec9bef105f80c2163a4f66f5c43f3a218 Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
Diffstat (limited to 'tests/auto/other/toolsupport/tst_toolsupport.cpp')
-rw-r--r--tests/auto/other/toolsupport/tst_toolsupport.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/tests/auto/other/toolsupport/tst_toolsupport.cpp b/tests/auto/other/toolsupport/tst_toolsupport.cpp
new file mode 100644
index 0000000000..1b5aa1b247
--- /dev/null
+++ b/tests/auto/other/toolsupport/tst_toolsupport.cpp
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include <QtTest>
+
+// Don't do this at home. This is test code, not production.
+#define protected public
+#define private public
+
+#include <private/qdatetime_p.h>
+#include <private/qfile_p.h>
+#include <private/qfileinfo_p.h>
+#include <private/qobject_p.h>
+#include <qobject.h>
+
+#if defined(Q_CC_GNU) || defined(Q_CC_MSVC)
+#define RUN_MEMBER_OFFSET_TEST 1
+#else
+#define RUN_MEMBER_OFFSET_TEST 0
+#endif
+
+#if RUN_MEMBER_OFFSET_TEST
+template <typename T, typename K>
+size_t pmm_to_offsetof(T K:: *pmm)
+{
+#ifdef Q_CC_MSVC
+ // Even on 64 bit MSVC uses 4 byte offsets.
+ quint32 ret;
+#else
+ size_t ret;
+#endif
+ Q_STATIC_ASSERT(sizeof(ret) == sizeof(pmm));
+ memcpy(&ret, &pmm, sizeof(ret));
+ return ret;
+}
+#endif
+
+class tst_toolsupport : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void offsets();
+ void offsets_data();
+};
+
+void tst_toolsupport::offsets()
+{
+ QFETCH(size_t, actual);
+ QFETCH(int, expected32);
+ QFETCH(int, expected64);
+ size_t expect = sizeof(void *) == 4 ? expected32 : expected64;
+ QCOMPARE(actual, expect);
+}
+
+void tst_toolsupport::offsets_data()
+{
+ QTest::addColumn<size_t>("actual");
+ QTest::addColumn<int>("expected32");
+ QTest::addColumn<int>("expected64");
+
+ {
+ QTestData &data = QTest::newRow("sizeof(QObjectData)")
+ << sizeof(QObjectData);
+ data << 28 << 48; // vptr + 3 ptr + 2 int + ptr
+ }
+
+#if RUN_MEMBER_OFFSET_TEST
+ {
+ QTestData &data = QTest::newRow("QObjectPrivate::extraData")
+ << pmm_to_offsetof(&QObjectPrivate::extraData);
+ data << 28 << 48; // sizeof(QObjectData)
+ }
+
+ {
+ QTestData &data = QTest::newRow("QFileInfoPrivate::fileEntry")
+ << pmm_to_offsetof(&QFileInfoPrivate::fileEntry);
+ data << 4 << 8;
+ }
+
+ {
+ QTestData &data = QTest::newRow("QFileSystemEntry::filePath")
+ << pmm_to_offsetof(&QFileSystemEntry::m_filePath);
+ data << 0 << 0;
+ }
+
+ {
+#ifdef Q_OS_WIN
+ QTest::newRow("QDateTimePrivate::m_msecs")
+ << pmm_to_offsetof(&QDateTimePrivate::m_msecs) << 8 << 8;
+ QTest::newRow("QDateTimePrivate::m_spec")
+ << pmm_to_offsetof(&QDateTimePrivate::m_spec) << 16 << 16;
+ QTest::newRow("QDateTimePrivate::m_offsetFromUtc")
+ << pmm_to_offsetof(&QDateTimePrivate::m_offsetFromUtc) << 20 << 20;
+ QTest::newRow("QDateTimePrivate::m_timeZone")
+ << pmm_to_offsetof(&QDateTimePrivate::m_timeZone) << 24 << 24;
+ QTest::newRow("QDateTimePrivate::m_status")
+ << pmm_to_offsetof(&QDateTimePrivate::m_status) << 28 << 32;
+#else
+ QTest::newRow("QDateTimePrivate::m_msecs")
+ << pmm_to_offsetof(&QDateTimePrivate::m_msecs) << 4 << 8;
+ QTest::newRow("QDateTimePrivate::m_spec")
+ << pmm_to_offsetof(&QDateTimePrivate::m_spec) << 12 << 16;
+ QTest::newRow("QDateTimePrivate::m_offsetFromUtc")
+ << pmm_to_offsetof(&QDateTimePrivate::m_offsetFromUtc) << 16 << 20;
+ QTest::newRow("QDateTimePrivate::m_timeZone")
+ << pmm_to_offsetof(&QDateTimePrivate::m_timeZone) << 20 << 24;
+ QTest::newRow("QDateTimePrivate::m_status")
+ << pmm_to_offsetof(&QDateTimePrivate::m_status) << 24 << 32;
+#endif
+ }
+#endif // RUN_MEMBER_OFFSET_TEST
+}
+
+
+QTEST_APPLESS_MAIN(tst_toolsupport);
+
+#include "tst_toolsupport.moc"
+