// Copyright (C) 2021 David Redondo // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include #include #include #include #include #include #include #include #include "mockcompositor.h" #include "coreprotocol.h" using namespace MockCompositor; class TestExtension : public QWaylandClientExtensionTemplate, public QtWayland::test_interface { public: TestExtension() : QWaylandClientExtensionTemplate(1) { } ~TestExtension() { if (object()) { release(); } } void initialize() { QWaylandClientExtension::initialize(); } }; class TestGlobal : public Global, public QtWaylandServer::test_interface { Q_OBJECT public: explicit TestGlobal(CoreCompositor *compositor) : QtWaylandServer::test_interface(compositor->m_display, 1) { } }; class tst_clientextension : public QObject, private CoreCompositor { Q_OBJECT private: QtWaylandClient::QWaylandDisplay *display() { return static_cast( QGuiApplicationPrivate::platformIntegration()) ->display(); } private slots: void cleanup() { display()->flushRequests(); dispatch(); exec([this] { removeAll(); }); QTRY_COMPARE(display()->globals().size(), 0); } void createWithoutGlobal(); void createWithGlobalAutomatic(); void createWithGlobalManual(); void globalBecomesAvailable(); void globalRemoved(); }; void tst_clientextension::createWithoutGlobal() { TestExtension extension; QSignalSpy spy(&extension, &QWaylandClientExtension::activeChanged); QVERIFY(spy.isValid()); QVERIFY(!extension.isActive()); QCOMPARE(spy.count(), 0); extension.initialize(); QVERIFY(!extension.isActive()); QCOMPARE(spy.count(), 0); } void tst_clientextension::createWithGlobalAutomatic() { exec([this] { add(); }); QTRY_COMPARE(display()->globals().size(), 1); TestExtension extension; QSignalSpy spy(&extension, &QWaylandClientExtension::activeChanged); QVERIFY(spy.isValid()); QTRY_VERIFY(extension.isActive()); QCOMPARE(spy.count(), 1); } void tst_clientextension::createWithGlobalManual() { exec([this] { add(); }); QTRY_COMPARE(display()->globals().size(), 1); // Wait for the display to have the global TestExtension extension; QSignalSpy spy(&extension, &QWaylandClientExtension::activeChanged); QVERIFY(spy.isValid()); extension.initialize(); QVERIFY(extension.isActive()); QCOMPARE(spy.count(), 1); } void tst_clientextension::globalBecomesAvailable() { TestExtension extension; QSignalSpy spy(&extension, &QWaylandClientExtension::activeChanged); QVERIFY(spy.isValid()); exec([this] { add(); }); QTRY_VERIFY(extension.isActive()); QCOMPARE(spy.count(), 1); } void tst_clientextension::globalRemoved() { exec([this] { add(); }); TestExtension extension; QTRY_VERIFY(extension.isActive()); QSignalSpy spy(&extension, &QWaylandClientExtension::activeChanged); QVERIFY(spy.isValid()); QCOMPOSITOR_TRY_COMPARE(get()->resourceMap().size(), 1); exec([this] { removeAll(); }); QTRY_VERIFY(!extension.isActive()); QCOMPARE(spy.count(), 1); } QCOMPOSITOR_TEST_MAIN(tst_clientextension) #include "tst_clientextension.moc"