Revision control
Copy as Markdown
// Copyright (C) 2017 Ford Motor Company
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QString>
#include <QtTest>
#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<bool>("templated");
QTest::newRow("non-templated enableRemoting") << false;
QTest::newRow("templated enableRemoting") << true;
}
void ModelreplicaTest::basicFunctions()
{
QFETCH(bool, templated);
auto model = new QStringListModel();
model->setStringList(QStringList() << "Track1" << "Track2" << "Track3");
MediaSimpleSource source;
source.setTracks(model);
if (templated)
host.enableRemoting<MediaSourceAPI>(&source);
else
host.enableRemoting(&source);
auto model2 = new QStringListModel();
model2->setStringList(QStringList() << "Track4" << "Track5");
OtherMediaSimpleSource source2;
source2.setTracks(model2);
host.enableRemoting(&source2);
const QScopedPointer<MediaReplica> replica(client.acquire<MediaReplica>());
QSignalSpy tracksSpy(replica->tracks(), &QAbstractItemModelReplica::initialized);
QVERIFY(replica->waitForSource(300));
QVERIFY(tracksSpy.wait());
// Rep file only uses display role
QCOMPARE(QList<int>{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<OtherMediaReplica> otherReplica(client.acquire<OtherMediaReplica>());
QSignalSpy otherTracksSpy(otherReplica->tracks(), &QAbstractItemModelReplica::initialized);
QVERIFY(otherReplica->waitForSource(300));
QVERIFY(otherTracksSpy.wait());
QCOMPARE(otherReplica->tracks()->availableRoles().size(), 2);
}
void ModelreplicaTest::nullModel()
{
MediaSimpleSource source;
host.enableRemoting(&source);
const QScopedPointer<MediaReplica> replica(client.acquire<MediaReplica>());
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);
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<MediaSourceAPI>(&source);
else
host.enableRemoting(&source);
const QScopedPointer<MediaReplica> replica(client.acquire<MediaReplica>());
QSignalSpy tracksSpy(replica->tracks(), &QAbstractItemModelReplica::initialized);
QVERIFY(replica->waitForSource(300));
QVERIFY(tracksSpy.wait());
// Rep file only uses display role
QCOMPARE(QVector<int>{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<bool>("prefetch");
QTest::newRow("size only") << false;
QTest::newRow("prefetch") << true;
}
void ModelreplicaTest::sortFilterProxyModel()
{
QFETCH(bool, prefetch);
auto model = new QStringListModel(this);
model->setStringList(QStringList() << "CCC" << "AAA" << "BBB");
auto proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
QList<int> roles = { Qt::DisplayRole };
host.enableRemoting(proxyModel, "test", roles);
auto fetchMode = prefetch ? QtRemoteObjects::PrefetchData : QtRemoteObjects::FetchRootSize;
QScopedPointer<QAbstractItemModelReplica> 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"