Add test for native interface machinery

Pick-to: 6.2
Change-Id: I76acd54039dcc7c662ca7a6e859f21d75dcf4dc4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
Tor Arne Vestbø 2021-07-14 19:52:24 +02:00
parent 5c150862dd
commit 149b5425d8
3 changed files with 129 additions and 0 deletions

View File

@ -8,6 +8,7 @@ add_subdirectory(qglobal)
add_subdirectory(qnumeric)
add_subdirectory(qfloat16)
add_subdirectory(qkeycombination)
add_subdirectory(qnativeinterface)
add_subdirectory(qrandomgenerator)
add_subdirectory(qlogging)
add_subdirectory(qtendian)

View File

@ -0,0 +1,4 @@
qt_internal_add_test(tst_qnativeinterface
SOURCES
tst_qnativeinterface.cpp
)

View File

@ -0,0 +1,124 @@
/****************************************************************************
**
** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** 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 The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QTest>
#include <QtCore/qnativeinterface.h>
class tst_QNativeInterface: public QObject
{
Q_OBJECT
private slots:
void typeInfo() const;
void resolve() const;
void accessor() const;
};
struct InterfaceImplementation;
struct PublicClass
{
PublicClass();
QT_DECLARE_NATIVE_INTERFACE_ACCESSOR
std::unique_ptr<InterfaceImplementation> m_implementation;
};
QT_BEGIN_NAMESPACE
namespace QNativeInterface {
struct Interface
{
QT_DECLARE_NATIVE_INTERFACE(Interface, 10, PublicClass)
virtual int foo() = 0;
};
struct OtherInterface
{
QT_DECLARE_NATIVE_INTERFACE(OtherInterface, 10, PublicClass)
};
}
QT_DEFINE_NATIVE_INTERFACE(Interface);
QT_DEFINE_NATIVE_INTERFACE(OtherInterface);
QT_END_NAMESPACE
using namespace QNativeInterface;
struct InterfaceImplementation : public Interface
{
int foo() override { return 123; }
};
PublicClass::PublicClass() : m_implementation(new InterfaceImplementation) {}
template <>
void* QNativeInterface::Private::resolveInterface<PublicClass>(
PublicClass const* that, char const* name, int revision)
{
auto *implementation = that->m_implementation.get();
QT_NATIVE_INTERFACE_RETURN_IF(Interface, implementation);
QT_NATIVE_INTERFACE_RETURN_IF(OtherInterface, implementation);
return nullptr;
}
void tst_QNativeInterface::typeInfo() const
{
using namespace QNativeInterface::Private;
QCOMPARE(TypeInfo<Interface>::isCompatibleWith<PublicClass>, true);
QCOMPARE(TypeInfo<Interface>::isCompatibleWith<QObject>, false);
QCOMPARE(TypeInfo<Interface>::isCompatibleWith<int>, false);
QCOMPARE(TypeInfo<Interface>::revision(), 10);
QCOMPARE(TypeInfo<Interface>::name(), "Interface");
}
void tst_QNativeInterface::resolve() const
{
using namespace QNativeInterface::Private;
PublicClass foo;
QVERIFY(resolveInterface(&foo, "Interface", 10));
QTest::ignoreMessage(QtWarningMsg, "Native interface revision mismatch "
"(requested 5 / available 10) for interface Interface");
QCOMPARE(resolveInterface(&foo, "Interface", 5), nullptr);
QCOMPARE(resolveInterface(&foo, "NotInterface", 10), nullptr);
QCOMPARE(resolveInterface(&foo, "OtherInterface", 10), nullptr);
}
void tst_QNativeInterface::accessor() const
{
PublicClass foo;
QVERIFY(foo.nativeInterface<Interface>());
QCOMPARE(foo.nativeInterface<Interface>()->foo(), 123);
}
QTEST_MAIN(tst_QNativeInterface)
#include "tst_qnativeinterface.moc"