File indexing completed on 2025-01-19 03:42:37
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"