File indexing completed on 2024-05-12 05:13:47

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "testhelper.h"
0008 
0009 #include "timelinedelegatecontroller.h"
0010 #include "applicationcontroller.h"
0011 #include "livedatamanager.h"
0012 #include "reservationmanager.h"
0013 #include "transfermanager.h"
0014 
0015 #include <KItinerary/Reservation>
0016 #include <KItinerary/TrainTrip>
0017 
0018 #include <KPublicTransport/Journey>
0019 #include <KPublicTransport/JourneyRequest>
0020 
0021 #include <QJsonDocument>
0022 #include <QJsonObject>
0023 #include <QJSValue>
0024 #include <QUrl>
0025 #include <QQmlEngine>
0026 #include <QtTest/qtest.h>
0027 #include <QSignalSpy>
0028 #include <QStandardPaths>
0029 #include <QTimeZone>
0030 
0031 using namespace KItinerary;
0032 
0033 class TimelineDelegateControllerTest : public QObject
0034 {
0035     Q_OBJECT
0036 private:
0037     QByteArray readFile(const QString &fn)
0038     {
0039         QFile f(fn);
0040         f.open(QFile::ReadOnly);
0041         return f.readAll();
0042     }
0043 
0044 private Q_SLOTS:
0045     void initTestCase()
0046     {
0047         qputenv("TZ", "UTC");
0048         QStandardPaths::setTestModeEnabled(true);
0049     }
0050 
0051     void testEmptyController()
0052     {
0053         TimelineDelegateController controller;
0054         QCOMPARE(controller.isCurrent(), false);
0055         QCOMPARE(controller.progress(), 0.0f);
0056         QCOMPARE(controller.effectiveEndTime(), QDateTime());
0057         QCOMPARE(controller.isLocationChange(), false);
0058         QCOMPARE(controller.isPublicTransport(), false);
0059         QVERIFY(!controller.journeyRequestFull().isValid());
0060         QVERIFY(!controller.journeyRequestOne().isValid());
0061         QCOMPARE(controller.isCanceled(), false);
0062 
0063         controller.setBatchId(QStringLiteral("foo"));
0064         QCOMPARE(controller.isCurrent(), false);
0065         QCOMPARE(controller.progress(), 0.0f);
0066         QCOMPARE(controller.effectiveEndTime(), QDateTime());
0067         QCOMPARE(controller.isLocationChange(), false);
0068         QCOMPARE(controller.isPublicTransport(), false);
0069         QCOMPARE(controller.isCanceled(), false);
0070 
0071         ReservationManager mgr;
0072         controller.setReservationManager(&mgr);
0073         QCOMPARE(controller.isCurrent(), false);
0074         QCOMPARE(controller.progress(), 0.0f);
0075         QCOMPARE(controller.effectiveEndTime(), QDateTime());
0076         QCOMPARE(controller.isLocationChange(), false);
0077         QCOMPARE(controller.isPublicTransport(), false);
0078         QCOMPARE(controller.isCanceled(), false);
0079         QCOMPARE(controller.documentIds(), QStringList());
0080     }
0081 
0082     void testProgress()
0083     {
0084         ReservationManager mgr;
0085         Test::clearAll(&mgr);
0086 
0087         TrainTrip trip;
0088         trip.setTrainNumber(QStringLiteral("TGV 1235"));
0089         trip.setDepartureTime(QDateTime::currentDateTime().addDays(-1));
0090         TrainReservation res;
0091         res.setReservationNumber(QStringLiteral("XXX007"));
0092         res.setReservationFor(trip);
0093 
0094         TimelineDelegateController controller;
0095         QSignalSpy currentSpy(&controller, &TimelineDelegateController::currentChanged);
0096         controller.setReservationManager(&mgr);
0097 
0098         mgr.addReservation(res);
0099         QCOMPARE(mgr.batches().size(), 1);
0100         const auto batchId = mgr.batches().at(0);
0101 
0102         controller.setBatchId(batchId);
0103         QCOMPARE(controller.isCurrent(), false);
0104         QCOMPARE(controller.progress(), 0.0f);
0105         QCOMPARE(controller.isLocationChange(), true);
0106         QCOMPARE(controller.isPublicTransport(), true);
0107         QCOMPARE(controller.isCanceled(), false);
0108 
0109         trip.setArrivalTime(QDateTime::currentDateTime().addDays(1));
0110         res.setReservationFor(trip);
0111         mgr.updateReservation(batchId, res);
0112 
0113         QCOMPARE(controller.isCurrent(), true);
0114         QCOMPARE(controller.progress(), 0.5f);
0115         QCOMPARE(controller.effectiveEndTime(), trip.arrivalTime());
0116         QCOMPARE(currentSpy.size(), 1);
0117     }
0118 
0119     void testPreviousLocation()
0120     {
0121         ReservationManager mgr;
0122         Test::clearAll(&mgr);
0123 
0124         TimelineDelegateController controller;
0125         controller.setReservationManager(&mgr);
0126 
0127         {
0128             TrainTrip trip;
0129             trip.setTrainNumber(QStringLiteral("TGV 1235"));
0130             trip.setDepartureTime(QDateTime::currentDateTime().addDays(2));
0131             TrainReservation res;
0132             res.setReservationNumber(QStringLiteral("XXX007"));
0133             res.setReservationFor(trip);
0134             mgr.addReservation(res);
0135         }
0136 
0137         QCOMPARE(mgr.batches().size(), 1);
0138         const auto batchId = mgr.batches().at(0);
0139 
0140         controller.setBatchId(batchId);
0141         QCOMPARE(controller.previousLocation(), QVariant());
0142 
0143         TrainStation arrStation;
0144         arrStation.setName(QStringLiteral("My Station"));
0145         TrainTrip prevTrip;
0146         prevTrip.setTrainNumber(QStringLiteral("ICE 1234"));
0147         prevTrip.setDepartureTime(QDateTime::currentDateTime().addDays(1));
0148         prevTrip.setArrivalTime(QDateTime::currentDateTime().addDays(1));
0149         prevTrip.setArrivalStation(arrStation);
0150         TrainReservation prevRes;
0151         prevRes.setReservationNumber(QStringLiteral("XXX007"));
0152         prevRes.setReservationFor(prevTrip);
0153 
0154         QSignalSpy changeSpy(&controller, &TimelineDelegateController::previousLocationChanged);
0155         mgr.addReservation(prevRes);
0156 
0157         QCOMPARE(changeSpy.size(), 1);
0158         QVERIFY(!controller.previousLocation().isNull());
0159         QCOMPARE(controller.previousLocation().value<TrainStation>().name(), QLatin1StringView("My Station"));
0160     }
0161 
0162     void testJourneyRequest()
0163     {
0164         ReservationManager mgr;
0165         PkPassManager pkPassMgr;
0166         Test::clearAll(&mgr);
0167         LiveDataManager ldm;
0168         ldm.setPkPassManager(&pkPassMgr);
0169         auto ctrl = Test::makeAppController();
0170         ctrl->setReservationManager(&mgr);
0171         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/randa2017.json")));
0172 
0173         TimelineDelegateController controller;
0174         controller.setReservationManager(&mgr);
0175         controller.setBatchId(mgr.batches().at(0)); // flight
0176         controller.setLiveDataManager(&ldm);
0177         QVERIFY(!controller.journeyRequestFull().isValid());
0178         QVERIFY(!controller.journeyRequestOne().isValid());
0179 
0180         controller.setBatchId(mgr.batches().at(1)); // first train segment
0181         QCOMPARE(controller.isLocationChange(), true);
0182         QCOMPARE(controller.isPublicTransport(), true);
0183 
0184         auto jnyReq = controller.journeyRequestFull();
0185         QCOMPARE(jnyReq.isValid(), true);
0186         QCOMPARE(jnyReq.from().name(), QStringLiteral("Zürich Flughafen"));
0187         QCOMPARE(jnyReq.to().name(), QLatin1StringView("Randa"));
0188         jnyReq = controller.journeyRequestOne();
0189         QCOMPARE(jnyReq.isValid(), true);
0190         QCOMPARE(jnyReq.from().name(), QStringLiteral("Zürich Flughafen"));
0191         QCOMPARE(jnyReq.to().name(), QLatin1StringView("Visp"));
0192 
0193         controller.setBatchId(mgr.batches().at(2)); // second train segment
0194         jnyReq = controller.journeyRequestFull();
0195         QCOMPARE(jnyReq.isValid(), true);
0196         QCOMPARE(jnyReq.from().name(), QLatin1StringView("Visp"));
0197         QCOMPARE(jnyReq.to().name(), QLatin1StringView("Randa"));
0198         jnyReq = controller.journeyRequestOne();
0199         QCOMPARE(jnyReq.isValid(), true);
0200         QCOMPARE(jnyReq.from().name(), QLatin1StringView("Visp"));
0201         QCOMPARE(jnyReq.to().name(), QLatin1StringView("Randa"));
0202     }
0203 
0204     void testApplyJourney()
0205     {
0206         ReservationManager mgr;
0207         PkPassManager pkPassMgr;
0208         Test::clearAll(&mgr);
0209         LiveData::clearStorage();
0210         LiveDataManager ldm;
0211         ldm.setPkPassManager(&pkPassMgr);
0212         ldm.setReservationManager(&mgr);
0213         auto ctrl = Test::makeAppController();
0214         ctrl->setReservationManager(&mgr);
0215         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/randa2017.json")));
0216 
0217         TimelineDelegateController controller;
0218         controller.setReservationManager(&mgr);
0219         controller.setLiveDataManager(&ldm);
0220         controller.setBatchId(mgr.batches().at(mgr.batches().size() - 3)); // begin of the return train trip
0221         QCOMPARE(controller.isPublicTransport(), true);
0222         const auto batchCount = mgr.batches().size();
0223 
0224         QSignalSpy addSpy(&mgr, &ReservationManager::batchAdded);
0225         QSignalSpy updateSpy(&mgr, &ReservationManager::batchChanged);
0226         QSignalSpy rmSpy(&mgr, &ReservationManager::batchRemoved);
0227 
0228         // apply alternative with 3 segments to test segment insertion
0229         const auto jny3 = KPublicTransport::Journey::fromJson(QJsonDocument::fromJson(readFile(QLatin1StringView(SOURCE_DIR "/data/publictransport/randa-zrh-3-sections.json"))).object());
0230         controller.applyJourney(QVariant::fromValue(jny3), true);
0231         QCOMPARE(mgr.batches().size(), batchCount + 1);
0232         QCOMPARE(addSpy.size(), 3);
0233         QCOMPARE(updateSpy.size(), 0); // as we move beyond other elements, we get add/remove rather than updated here
0234         QCOMPARE(rmSpy.size(), 2);
0235         QCOMPARE(LiveData::listAll().size(), 3);
0236 
0237         // apply alternative with 2 segments to test segment removal
0238         controller.setBatchId(mgr.batches().at(mgr.batches().size() - 3)); // begin of the new 3 segment train trip
0239         addSpy.clear();
0240         updateSpy.clear();
0241         rmSpy.clear();
0242         const auto jny2 = KPublicTransport::Journey::fromJson(QJsonDocument::fromJson(readFile(QLatin1StringView(SOURCE_DIR "/data/publictransport/randa-zrh-2-sections.json"))).object());
0243         controller.applyJourney(QVariant::fromValue(jny2), true);
0244         QCOMPARE(mgr.batches().size(), batchCount);
0245         QCOMPARE(addSpy.size(), 2);
0246         QCOMPARE(updateSpy.size(), 0);
0247         QCOMPARE(rmSpy.size(), 3);
0248         QCOMPARE(LiveData::listAll().size(), 2);
0249     }
0250 
0251     void testCancel()
0252     {
0253         ReservationManager mgr;
0254         Test::clearAll(&mgr);
0255         auto ctrl = Test::makeAppController();
0256         ctrl->setReservationManager(&mgr);
0257         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/timeline/flight-cancelation.json")));
0258 
0259         TimelineDelegateController controller;
0260         controller.setReservationManager(&mgr);
0261         controller.setBatchId(mgr.batches().at(0));
0262         QCOMPARE(controller.isCanceled(), true);
0263         QCOMPARE(controller.connectionWarning(), false);
0264     }
0265 
0266     void testMapArgs()
0267     {
0268         ReservationManager mgr;
0269         PkPassManager pkPassMgr;
0270         Test::clearAll(&mgr);
0271         LiveData::clearStorage();
0272         LiveDataManager ldm;
0273         ldm.setPkPassManager(&pkPassMgr);
0274         ldm.setReservationManager(&mgr);
0275         TransferManager trfMgr;
0276         auto ctrl = Test::makeAppController();
0277         ctrl->setReservationManager(&mgr);
0278         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/randa2017.json")));
0279 
0280         TimelineDelegateController controller;
0281         controller.setReservationManager(&mgr);
0282         controller.setLiveDataManager(&ldm);
0283         controller.setTransferManager(&trfMgr);
0284 
0285         QQmlEngine engine;
0286         QQmlEngine::setObjectOwnership(&controller, QQmlEngine::CppOwnership);
0287         engine.newQObject(&controller);
0288 
0289         // workaround for pre-KF5I18nLocaleData code for region lookups still in use on the CI
0290         const auto isRegion = [](const QString &region, QLatin1StringView ref) {
0291             if (region.size() == 2) {
0292                 return ref.startsWith(region);
0293             }
0294             return region == ref;
0295         };
0296 
0297         controller.setBatchId(mgr.batches().at(0)); // flight
0298         auto args = controller.departureMapArguments().toVariant().toMap();
0299         QCOMPARE(args.value(QLatin1StringView("departureGateName")).toString(), QLatin1StringView("A10"));
0300         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 10}, {6, 45}, QTimeZone("Europe/Berlin")));
0301         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Berlin Tegel"));
0302         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("DE-BE")));
0303         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Berlin"));
0304 
0305         args = controller.arrivalMapArguments().toVariant().toMap();
0306         // arrivalGate property doesn't exist
0307         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {8, 15}, QTimeZone("Europe/Zurich")));
0308         QCOMPARE(args.value(QLatin1StringView("departurePlatformMode")).toInt(), 1);
0309         QCOMPARE(args.value(QLatin1StringView("departurePlatformName")).toString(), QLatin1StringView("3"));
0310         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 10}, {11, 40}, QTimeZone("Europe/Zurich")));
0311         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QStringLiteral("Zürich"));
0312         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-ZH")));
0313         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Zurich"));
0314 
0315         controller.setBatchId(mgr.batches().at(1)); // first train leg
0316         args = controller.departureMapArguments().toVariant().toMap();
0317         // arrivalGate property doesn't exist
0318         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {8, 15}, QTimeZone("Europe/Zurich")));
0319         QCOMPARE(args.value(QLatin1StringView("departurePlatformMode")).toInt(), 1);
0320         QCOMPARE(args.value(QLatin1StringView("departurePlatformName")).toString(), QLatin1StringView("3"));
0321         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 10}, {11, 40}, QTimeZone("Europe/Zurich")));
0322         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QStringLiteral("Zürich Flughafen"));
0323         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-ZH")));
0324         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Zurich"));
0325 
0326         args = controller.arrivalMapArguments().toVariant().toMap();
0327         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformMode")).toInt(), 1);
0328         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformName")).toString(), QLatin1StringView("7"));
0329         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {14, 2}, QTimeZone("Europe/Zurich")));
0330         QCOMPARE(args.value(QLatin1StringView("departurePlatformMode")).toInt(), 1);
0331         QCOMPARE(args.value(QLatin1StringView("departurePlatformName")).toString(), QLatin1StringView("3"));
0332         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 10}, {14, 8}, QTimeZone("Europe/Zurich")));
0333         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Visp"));
0334         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-VS")));
0335         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Zurich"));
0336 
0337         controller.setBatchId(mgr.batches().at(2)); // final train leg
0338         args = controller.departureMapArguments().toVariant().toMap();
0339         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformMode")).toInt(), 1);
0340         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformName")).toString(), QLatin1StringView("7"));
0341         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {14, 2}, QTimeZone("Europe/Zurich")));
0342         QCOMPARE(args.value(QLatin1StringView("departurePlatformMode")).toInt(), 1);
0343         QCOMPARE(args.value(QLatin1StringView("departurePlatformName")).toString(), QLatin1StringView("3"));
0344         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 10}, {14, 8}, QTimeZone("Europe/Zurich")));
0345         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Visp"));
0346         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-VS")));
0347         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Zurich"));
0348 
0349         args = controller.arrivalMapArguments().toVariant().toMap();
0350         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformMode")).toInt(), 1);
0351         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformName")).toString(), QString());
0352         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {14, 53}, QTimeZone("Europe/Zurich")));
0353         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Randa"));
0354         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-VS")));
0355         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Zurich"));
0356 
0357         controller.setBatchId(mgr.batches().at(3)); // event
0358         args = controller.mapArguments().toVariant().toMap();
0359         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Haus Randa"));
0360         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-VS")));
0361         auto coord = args.value(QLatin1StringView("coordinate")).value<QPointF>();
0362         QVERIFY(!coord.isNull());
0363         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {14, 53}, QTimeZone("Europe/Zurich")));
0364         QVERIFY(!args.value(QLatin1StringView("endTime")).toDateTime().isValid());
0365 
0366         controller.setBatchId(mgr.batches().at(4)); // accommodation
0367         args = controller.mapArguments().toVariant().toMap();
0368         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Haus Randa"));
0369         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-VS")));
0370         coord = args.value(QLatin1StringView("coordinate")).value<QPointF>();
0371         QVERIFY(!coord.isNull());
0372         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {14, 53}, QTimeZone("Europe/Zurich")));
0373         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 15}, {14, 54}, QTimeZone("Europe/Zurich")));
0374 
0375         controller.setBatchId(mgr.batches().at(7)); // food
0376         args = controller.mapArguments().toVariant().toMap();
0377         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Raclette"));
0378         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-VS")));
0379         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 14}, {0, 0}, QTimeZone("Europe/Zurich")));
0380         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 15}, {0, 0}, QTimeZone("Europe/Zurich")));
0381 
0382         controller.setBatchId(mgr.batches().at(9)); // final return leg
0383         args = controller.arrivalMapArguments().toVariant().toMap();
0384         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformMode")).toInt(), 1);
0385         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformName")).toString(), QLatin1StringView("2"));
0386         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 15}, {18, 16}, QTimeZone("Europe/Zurich")));
0387         QCOMPARE(args.value(QLatin1StringView("departureGateName")).toString(), QLatin1StringView("52"));
0388         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 15}, {20, 50}, QTimeZone("Europe/Zurich")));
0389         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QStringLiteral("Zürich Flughafen"));
0390         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-ZH")));
0391         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Zurich"));
0392         coord = args.value(QLatin1StringView("coordinate")).value<QPointF>();
0393         QVERIFY(!coord.isNull());
0394 
0395         controller.setBatchId(mgr.batches().at(10)); // return flight
0396         args = controller.departureMapArguments().toVariant().toMap();
0397         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformMode")).toInt(), 1);
0398         QCOMPARE(args.value(QLatin1StringView("arrivalPlatformName")).toString(), QLatin1StringView("2"));
0399         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 15}, {18, 16}, QTimeZone("Europe/Zurich")));
0400         QCOMPARE(args.value(QLatin1StringView("departureGateName")).toString(), QLatin1StringView("52"));
0401         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 15}, {20, 50}, QTimeZone("Europe/Zurich")));
0402         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QStringLiteral("Zürich"));
0403         QVERIFY(isRegion(args.value(QLatin1StringView("region")).toString(), QLatin1StringView("CH-ZH")));
0404         QCOMPARE(args.value(QLatin1StringView("timeZone")), QLatin1StringView("Europe/Zurich"));
0405 
0406         // single static element, see 44ed4fbe96d45a60b33e2bf784196489197d7dcc
0407         Test::clearAll(&mgr);
0408         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/haus-randa-v1.json")));
0409         QCOMPARE(mgr.batches().size(), 1);
0410         controller.setBatchId(mgr.batches().at(0));
0411         args = controller.mapArguments().toVariant().toMap();
0412         QCOMPARE(args.value(QLatin1StringView("placeName")).toString(), QLatin1StringView("Haus Randa"));
0413         QCOMPARE(args.value(QLatin1StringView("beginTime")).toDateTime(), QDateTime({2017, 9, 10}, {0, 0}, QTimeZone("Europe/Zurich")));
0414         QCOMPARE(args.value(QLatin1StringView("endTime")).toDateTime(), QDateTime({2017, 9, 16}, {0, 0}, QTimeZone("Europe/Zurich")));
0415     }
0416 };
0417 
0418 QTEST_GUILESS_MAIN(TimelineDelegateControllerTest)
0419 
0420 #include "timelinedelegatecontrollertest.moc"