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>
This commit is contained in:
parent
55be75c969
commit
497f0af1f7
@ -24,6 +24,7 @@ SUBDIRS=\
|
||||
qprocess_and_guieventloop \
|
||||
qtokenautomaton \
|
||||
windowsmobile \
|
||||
toolsupport \
|
||||
|
||||
!qtHaveModule(widgets): SUBDIRS -= \
|
||||
baselineexample \
|
||||
|
4
tests/auto/other/toolsupport/toolsupport.pro
Normal file
4
tests/auto/other/toolsupport/toolsupport.pro
Normal file
@ -0,0 +1,4 @@
|
||||
CONFIG += testcase parallel_test
|
||||
TARGET = tst_toolsupport
|
||||
QT = testlib core-private
|
||||
SOURCES = $$PWD/tst_toolsupport.cpp
|
145
tests/auto/other/toolsupport/tst_toolsupport.cpp
Normal file
145
tests/auto/other/toolsupport/tst_toolsupport.cpp
Normal file
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user