File indexing completed on 2024-04-14 03:54:25

0001 /*
0002  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 #include <QTest>
0008 #include <QSignalSpy>
0009 #include <QQmlEngine>
0010 #include <QQmlContext>
0011 
0012 #include "ItemBuilder.h"
0013 
0014 class TestIncubationController : public QObject, public QQmlIncubationController
0015 {
0016 public:
0017     TestIncubationController()
0018     {
0019         startTimer(16);
0020     }
0021 
0022 protected:
0023     void timerEvent(QTimerEvent *) override
0024     {
0025         incubateFor(5);
0026     }
0027 };
0028 
0029 class ItemBuilderTest : public QObject
0030 {
0031     Q_OBJECT
0032 
0033 private Q_SLOTS:
0034     void initTestCase()
0035     {
0036         m_engine = new QQmlEngine{this};
0037         m_component = new QQmlComponent{m_engine, this};
0038         m_component->setData("import QtQuick 2.15; Item { }", QUrl());
0039         m_item = new QQuickItem{};
0040     }
0041 
0042     void testBasic()
0043     {
0044         ItemBuilder builder;
0045         builder.setComponent(m_component);
0046         builder.setCount(10);
0047         builder.setIncubationMode(QQmlIncubator::IncubationMode::Synchronous);
0048 
0049         QSignalSpy beginCreateSpy{&builder, &ItemBuilder::beginCreate};
0050         QSignalSpy endCreateSpy{&builder, &ItemBuilder::endCreate};
0051         QSignalSpy finishedSpy{&builder, &ItemBuilder::finished};
0052 
0053         builder.build(m_item);
0054 
0055         QCOMPARE(beginCreateSpy.size(), 10);
0056         QCOMPARE(endCreateSpy.size(), 10);
0057         QCOMPARE(finishedSpy.size(), 1);
0058 
0059         auto items = builder.items();
0060         QCOMPARE(items.size(), 10);
0061         for (auto item : items) {
0062             QVERIFY(item);
0063             QCOMPARE(item->parentItem(), m_item);
0064         }
0065 
0066 
0067         beginCreateSpy.clear();
0068         endCreateSpy.clear();
0069         finishedSpy.clear();
0070 
0071         builder.setCount(20);
0072         QCOMPARE(builder.items().size(), 0);
0073         QVERIFY(!builder.isFinished());
0074 
0075         builder.build(m_item);
0076 
0077         QVERIFY(builder.isFinished());
0078 
0079         items = builder.items();
0080         QCOMPARE(items.size(), 20);
0081         QCOMPARE(finishedSpy.size(), 1);
0082         QCOMPARE(beginCreateSpy.size(), 20);
0083         QCOMPARE(endCreateSpy.size(), 20);
0084 
0085         for (auto item : items) {
0086             QVERIFY(item);
0087             QCOMPARE(item->parentItem(), m_item);
0088         }
0089     }
0090 
0091     void testInitialProperties()
0092     {
0093         ItemBuilder builder;
0094         builder.setComponent(m_component);
0095         builder.setCount(10);
0096         builder.setIncubationMode(QQmlIncubator::IncubationMode::Synchronous);
0097 
0098         builder.setInitialProperties({
0099             { QStringLiteral("width"), 100 },
0100             { QStringLiteral("height"), 100 }
0101         });
0102 
0103         builder.build(m_item);
0104 
0105         QVERIFY(builder.isFinished());
0106 
0107         const auto items = builder.items();
0108         QCOMPARE(items.size(), 10);
0109         for (auto item : items) {
0110             QVERIFY(item);
0111             QCOMPARE(item->parentItem(), m_item);
0112             QCOMPARE(item->width(), 100);
0113             QCOMPARE(item->height(), 100);
0114         }
0115     }
0116 
0117     void testAsync()
0118     {
0119         m_engine->setIncubationController(new TestIncubationController);
0120 
0121         ItemBuilder builder;
0122         builder.setComponent(m_component);
0123         builder.setCount(10);
0124         builder.setIncubationMode(QQmlIncubator::IncubationMode::Asynchronous);
0125 
0126         builder.setInitialProperties({
0127             { QStringLiteral("width"), 100 },
0128             { QStringLiteral("height"), 100 }
0129         });
0130 
0131         builder.build(m_item);
0132 
0133         QTRY_VERIFY_WITH_TIMEOUT(builder.isFinished(), 500);
0134 
0135         const auto items = builder.items();
0136         QCOMPARE(items.size(), 10);
0137         for (auto item : items) {
0138             QVERIFY(item);
0139             QCOMPARE(item->parentItem(), m_item);
0140             QCOMPARE(item->width(), 100);
0141             QCOMPARE(item->height(), 100);
0142         }
0143 
0144         m_engine->setIncubationController(nullptr);
0145     }
0146 
0147     void cleanupTestCase()
0148     {
0149         delete m_item;
0150         delete m_component;
0151         delete m_engine;
0152     }
0153 
0154 private:
0155     QQmlEngine *m_engine = nullptr;
0156     QQmlComponent *m_component = nullptr;
0157     QQuickItem *m_item = nullptr;
0158 };
0159 
0160 QTEST_GUILESS_MAIN(ItemBuilderTest)
0161 
0162 #include "ItemBuilderTest.moc"