From 149b5425d8a4fe809fcabddda09859116e29c2ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 14 Jul 2021 19:52:24 +0200 Subject: [PATCH] Add test for native interface machinery Pick-to: 6.2 Change-Id: I76acd54039dcc7c662ca7a6e859f21d75dcf4dc4 Reviewed-by: Fabian Kosmale --- tests/auto/corelib/global/CMakeLists.txt | 1 + .../global/qnativeinterface/CMakeLists.txt | 4 + .../qnativeinterface/tst_qnativeinterface.cpp | 124 ++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 tests/auto/corelib/global/qnativeinterface/CMakeLists.txt create mode 100644 tests/auto/corelib/global/qnativeinterface/tst_qnativeinterface.cpp 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 + +#include + +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 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 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::isCompatibleWith, true); + QCOMPARE(TypeInfo::isCompatibleWith, false); + QCOMPARE(TypeInfo::isCompatibleWith, false); + + QCOMPARE(TypeInfo::revision(), 10); + QCOMPARE(TypeInfo::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()); + QCOMPARE(foo.nativeInterface()->foo(), 123); +} + +QTEST_MAIN(tst_QNativeInterface) +#include "tst_qnativeinterface.moc"