// Copyright (C) 2017 Ford Motor Company // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include #include "rep_model_merged.h" class ModelreplicaTest : public QObject { Q_OBJECT public: ModelreplicaTest() = default; private Q_SLOTS: void basicFunctions(); void basicFunctions_data(); void nullModel(); void nestedSortFilterProxyModel_data() { basicFunctions_data(); } void nestedSortFilterProxyModel(); void sortFilterProxyModel_data(); void sortFilterProxyModel(); }; void ModelreplicaTest::basicFunctions_data() { QTest::addColumn("templated"); QTest::newRow("non-templated enableRemoting") << false; QTest::newRow("templated enableRemoting") << true; } void ModelreplicaTest::basicFunctions() { QFETCH(bool, templated); QRemoteObjectRegistryHost host(QUrl("tcp://localhost:5550")); auto model = new QStringListModel(); model->setStringList(QStringList() << "Track1" << "Track2" << "Track3"); MediaSimpleSource source; source.setTracks(model); if (templated) host.enableRemoting(&source); else host.enableRemoting(&source); auto model2 = new QStringListModel(); model2->setStringList(QStringList() << "Track4" << "Track5"); OtherMediaSimpleSource source2; source2.setTracks(model2); host.enableRemoting(&source2); QRemoteObjectNode client(QUrl("tcp://localhost:5550")); const QScopedPointer replica(client.acquire()); QSignalSpy tracksSpy(replica->tracks(), &QAbstractItemModelReplica::initialized); QVERIFY(replica->waitForSource(300)); QVERIFY(tracksSpy.wait()); // Rep file only uses display role QCOMPARE(QList{Qt::DisplayRole}, replica->tracks()->availableRoles()); QCOMPARE(model->rowCount(), replica->tracks()->rowCount()); for (int i = 0; i < replica->tracks()->rowCount(); i++) { // We haven't received any data yet QCOMPARE(QVariant(), replica->tracks()->data(replica->tracks()->index(i, 0))); } // Wait for data to be fetch and confirm QTest::qWait(100); QCOMPARE(model->rowCount(), replica->tracks()->rowCount()); for (int i = 0; i < replica->tracks()->rowCount(); i++) { QTRY_COMPARE(model->data(model->index(i), Qt::DisplayRole), replica->tracks()->data(replica->tracks()->index(i, 0))); } // ensure the tracks objects are distinct const QScopedPointer otherReplica(client.acquire()); QSignalSpy otherTracksSpy(otherReplica->tracks(), &QAbstractItemModelReplica::initialized); QVERIFY(otherReplica->waitForSource(300)); QVERIFY(otherTracksSpy.wait()); QCOMPARE(otherReplica->tracks()->availableRoles().size(), 2); } void ModelreplicaTest::nullModel() { QRemoteObjectRegistryHost host(QUrl("tcp://localhost:5550")); MediaSimpleSource source; host.enableRemoting(&source); QRemoteObjectNode client(QUrl("tcp://localhost:5550")); const QScopedPointer replica(client.acquire()); QVERIFY(replica->waitForSource(300)); auto model = new QStringListModel(this); model->setStringList(QStringList() << "Track1" << "Track2" << "Track3"); source.setTracks(model); QTRY_VERIFY(replica->tracks()); QTRY_COMPARE(replica->tracks()->rowCount(), 3); QTRY_COMPARE(replica->tracks()->data(replica->tracks()->index(0, 0)), "Track1"); model = new QStringListModel(this); model->setStringList(QStringList() << "New Track1" << "New Track2" << "New Track3" << "New Track4"); source.setTracks(model); QTRY_COMPARE(replica->tracks()->rowCount(), 4); QTRY_COMPARE(replica->tracks()->data(replica->tracks()->index(3, 0)), "New Track4"); } void ModelreplicaTest::nestedSortFilterProxyModel() { QFETCH(bool, templated); QRemoteObjectRegistryHost host(QUrl("tcp://localhost:5550")); auto model = new QStringListModel(this); model->setStringList(QStringList() << "CCC" << "AAA" << "BBB"); auto proxyModel = new QSortFilterProxyModel(this); proxyModel->setSourceModel(model); MediaSimpleSource source; source.setTracks(proxyModel); if (templated) host.enableRemoting(&source); else host.enableRemoting(&source); QRemoteObjectNode client(QUrl("tcp://localhost:5550")); const QScopedPointer replica(client.acquire()); QSignalSpy tracksSpy(replica->tracks(), &QAbstractItemModelReplica::initialized); QVERIFY(replica->waitForSource(300)); QVERIFY(tracksSpy.wait()); // Rep file only uses display role QCOMPARE(QVector{Qt::DisplayRole}, replica->tracks()->availableRoles()); QCOMPARE(proxyModel->rowCount(), replica->tracks()->rowCount()); for (int i = 0; i < replica->tracks()->rowCount(); i++) { // We haven't received any data yet QCOMPARE(QVariant(), replica->tracks()->data(replica->tracks()->index(i, 0))); } // Wait for data to be fetch and confirm QCOMPARE(proxyModel->rowCount(), replica->tracks()->rowCount()); for (int i = 0; i < replica->tracks()->rowCount(); i++) QTRY_COMPARE(proxyModel->data(proxyModel->index(i, 0), Qt::DisplayRole), replica->tracks()->data(replica->tracks()->index(i, 0))); proxyModel->sort(0, Qt::AscendingOrder); QCOMPARE(proxyModel->rowCount(), replica->tracks()->rowCount()); for (int i = 0; i < replica->tracks()->rowCount(); i++) QTRY_COMPARE(proxyModel->data(proxyModel->index(i, 0), Qt::DisplayRole), replica->tracks()->data(replica->tracks()->index(i, 0))); } void ModelreplicaTest::sortFilterProxyModel_data() { QTest::addColumn("prefetch"); QTest::newRow("size only") << false; QTest::newRow("prefetch") << true; } void ModelreplicaTest::sortFilterProxyModel() { QFETCH(bool, prefetch); QRemoteObjectRegistryHost host(QUrl("tcp://localhost:5550")); auto model = new QStringListModel(this); model->setStringList(QStringList() << "CCC" << "AAA" << "BBB"); auto proxyModel = new QSortFilterProxyModel(this); proxyModel->setSourceModel(model); QList roles = { Qt::DisplayRole }; host.enableRemoting(proxyModel, "test", roles); auto fetchMode = prefetch ? QtRemoteObjects::PrefetchData : QtRemoteObjects::FetchRootSize; QRemoteObjectNode client(QUrl("tcp://localhost:5550")); QScopedPointer replica(client.acquireModel("test", fetchMode)); QSignalSpy initSpy(replica.get(), &QAbstractItemModelReplica::initialized); QVERIFY(initSpy.wait()); QCOMPARE(roles, replica->availableRoles()); // Wait for data to be fetch and confirm QCOMPARE(proxyModel->rowCount(), replica->rowCount()); for (int i = 0; i < replica->rowCount(); i++) QTRY_COMPARE(proxyModel->data(proxyModel->index(i, 0), Qt::DisplayRole), replica->data(replica->index(i, 0))); proxyModel->sort(0, Qt::AscendingOrder); QCOMPARE(proxyModel->rowCount(), replica->rowCount()); for (int i = 0; i < replica->rowCount(); i++) QTRY_COMPARE(proxyModel->data(proxyModel->index(i, 0), Qt::DisplayRole), replica->data(replica->index(i, 0))); } QTEST_MAIN(ModelreplicaTest) #include "tst_modelreplicatest.moc"