File indexing completed on 2024-04-21 04:41:09

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <KPublicTransport/Manager>
0008 #include <KPublicTransport/Stopover>
0009 #include <KPublicTransport/VehicleLayoutQueryModel>
0010 
0011 #include <QAbstractItemModelTester>
0012 #include <QFile>
0013 #include <QJsonDocument>
0014 #include <QJsonObject>
0015 #include <QSignalSpy>
0016 #include <QTest>
0017 
0018 using namespace KPublicTransport;
0019 
0020 class VehicleLayoutQueryModelTest : public QObject
0021 {
0022     Q_OBJECT
0023 private:
0024     QByteArray readFile(const QString &fn)
0025     {
0026         QFile f(fn);
0027         f.open(QFile::ReadOnly);
0028         return f.readAll();
0029     }
0030 
0031 private Q_SLOTS:
0032     void testCoachPositionInterpolation()
0033     {
0034         Manager ptMgr;
0035 
0036         VehicleLayoutQueryModel model;
0037         QAbstractItemModelTester modelTest(&model);
0038         model.setManager(&ptMgr);
0039         QSignalSpy resetSpy(&model, &QAbstractItemModel::modelReset);
0040 
0041         const auto inVec = Vehicle::fromJson(QJsonDocument::fromJson(readFile(QStringLiteral(SOURCE_DIR "/data/hafas/rem-I-JF-sbb-ic-train-formation-bern-vehicle.json"))).object());
0042         QCOMPARE(inVec.sections().size(), 10);
0043         QVERIFY(!inVec.hasPlatformPositions());
0044         QVERIFY(inVec.hasPlatformSectionNames());
0045         const auto inPlat = Platform::fromJson(QJsonDocument::fromJson(readFile(QStringLiteral(SOURCE_DIR "/data/hafas/rem-I-XP-sbb-platform-bern.json"))).object());
0046         QVERIFY(!inPlat.sections().empty());
0047 
0048         Stopover s;
0049         s.setVehicleLayout(inVec);
0050         s.setPlatformLayout(inPlat);
0051         s.setScheduledDepartureTime(QDateTime::currentDateTime());
0052         Line line;
0053         line.setName(QStringLiteral("IC 8"));
0054         Route route;
0055         route.setLine(line);
0056         s.setRoute(route);
0057 
0058         VehicleLayoutRequest req(s);
0059         QVERIFY(req.isValid());
0060         model.setRequest(req);
0061         QVERIFY(resetSpy.wait(10)); // query is started, initial requested data is set
0062         QCOMPARE(model.rowCount(), 10);
0063         resetSpy.clear();
0064         QVERIFY(resetSpy.wait(10)); // query finished, interpolation is triggered
0065         QCOMPARE(model.rowCount(), 10);
0066 
0067         for (int i = 0; i < model.rowCount(); ++i) {
0068             const auto idx = model.index(i, 0);
0069             const auto sec = idx.data(VehicleLayoutQueryModel::VehicleSectionRole).value<VehicleSection>();
0070             QVERIFY(sec.hasPlatformPosition());
0071             QCOMPARE(sec.name(), inVec.sections()[i].name());
0072         }
0073     }
0074 };
0075 
0076 QTEST_GUILESS_MAIN(VehicleLayoutQueryModelTest)
0077 
0078 #include "vehiclelayoutquerymodeltest.moc"