diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-07-14 19:52:24 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-07-16 00:24:22 +0000 |
commit | 751ec5f2ffe87a52702f025756b74bd7e5ac0e07 (patch) | |
tree | 53240070120395d6af4fe03b6ee10e82948c983e | |
parent | 8ca94924a497bc8f2fefbbdaa009b42b354261a4 (diff) |
Add test for native interface machinery
Change-Id: I76acd54039dcc7c662ca7a6e859f21d75dcf4dc4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit 149b5425d8a4fe809fcabddda09859116e29c2ff)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
3 files changed, 129 insertions, 0 deletions
diff --git a/tests/auto/corelib/global/CMakeLists.txt b/tests/auto/corelib/global/CMakeLists.txt index 8ba71543c2..080276dbd7 100644 --- a/tests/auto/corelib/global/CMakeLists.txt +++ b/tests/auto/corelib/global/CMakeLists.txt @@ -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) diff --git a/tests/auto/corelib/global/qnativeinterface/CMakeLists.txt b/tests/auto/corelib/global/qnativeinterface/CMakeLists.txt new file mode 100644 index 0000000000..639c7c3ec7 --- /dev/null +++ b/tests/auto/corelib/global/qnativeinterface/CMakeLists.txt @@ -0,0 +1,4 @@ +qt_internal_add_test(tst_qnativeinterface + SOURCES + tst_qnativeinterface.cpp +) diff --git a/tests/auto/corelib/global/qnativeinterface/tst_qnativeinterface.cpp b/tests/auto/corelib/global/qnativeinterface/tst_qnativeinterface.cpp new file mode 100644 index 0000000000..0da3108817 --- /dev/null +++ b/tests/auto/corelib/global/qnativeinterface/tst_qnativeinterface.cpp @@ -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" |