File indexing completed on 2024-04-14 04:36:19

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "testhelpers.h"
0008 
0009 #include "../src/onboard/onboardstatusmanager_p.h"
0010 #include "../src/onboard/backend/restonboardbackend_p.h"
0011 
0012 #include <KPublicTransport/Journey>
0013 #include <KPublicTransport/Stopover>
0014 #include <KPublicTransport/OnboardStatus>
0015 
0016 #include <QFile>
0017 #include <QJsonArray>
0018 #include <QJsonDocument>
0019 #include <QJsonObject>
0020 #include <QNetworkRequest>
0021 #include <QTest>
0022 
0023 #define s(x) QStringLiteral(x)
0024 
0025 using namespace KPublicTransport;
0026 
0027 class OnboardStatusTest : public QObject
0028 {
0029     Q_OBJECT
0030 private Q_SLOTS:
0031     void initTestCase()
0032     {
0033         qputenv("TZ", "UTC");
0034     }
0035 
0036     void testFrontend()
0037     {
0038         OnboardStatus status;
0039         QVERIFY(status.status() != OnboardStatus::Onboard);
0040 #ifndef Q_OS_ANDROID
0041         QVERIFY(status.status() != OnboardStatus::LocationServiceNotEnabled);
0042         QVERIFY(status.status() != OnboardStatus::MissingPermissions);
0043 #endif
0044         QVERIFY(!status.hasPosition());
0045     }
0046 
0047     void testScriptedPositionParsers_data()
0048     {
0049         QTest::addColumn<QString>("backendId");
0050         QTest::addColumn<QString>("inputFile");
0051         QTest::addColumn<float>("lat");
0052         QTest::addColumn<float>("lon");
0053         QTest::addColumn<float>("speed");
0054         QTest::addColumn<float>("heading");
0055         QTest::addColumn<float>("altitude");
0056 
0057         QTest::newRow("cd-railjet") << s("ceskedrahy") << s("cd-railjet.json") << 52.527308f << 13.367355f << 42.0f << NAN << 14.4f;
0058         QTest::newRow("db-ice") << s("deutschebahn-ice") << s("db-ice.json") << 52.3937f << 10.0929f << 199.0f << NAN << NAN;
0059         QTest::newRow("flixbus") << s("flixbus") << s("flixbus.json") << 53.153505f << 8.274373f << 26.777f << NAN << NAN;
0060         QTest::newRow("sncf-inoui") << s("sncf-tgv") << s("sncf-inoui.json") << 48.064258333f << 7.33914f << 105.379f << 212.5f << 205.47f;
0061         QTest::newRow("thalys") << s("icomera-omboard") << s("thalys.json") << 50.948208f << 6.885135f << 163.512f << 259.72f << 54.7f;
0062         QTest::newRow("oebb-railnet") << s("oebb") << s("oebb-railnet.json") << 47.4719f << 19.022648f << NAN << NAN << NAN;
0063         QTest::newRow("oebb-railnetregio") << s("oebb") << s("oebb-railnetregio.json") << 48.1459f << 16.4267f << 37.325f  << NAN << NAN;
0064 
0065         QTest::newRow("ana") << s("panasonic-inflight-v1") << s("../onboard-journey/ana.in.json") << 39.3520f << 141.077f << 801.916f << 191.0f << 9753.91f;
0066         QTest::newRow("united-panasonic") << s("panasonic-inflight-v1") << s("../onboard-journey/united-panasonic.in.json") << 41.5150f << 2.069f << 872.292f << 169.0f << 10668.6f;
0067         QTest::newRow("cathay-pacific") << s("panasonic-inflight-v2") << s("../onboard-journey/cathay-pacific.in.json") << 23.198333f << 118.836667f << 755.616f << 231.0f << 12187.7f;
0068         QTest::newRow("aegean") << s("aegean") << s("aegean.json") << 47.96723323f << 11.781437752f << 1007.0f << 137.0f << 7328.0f;
0069         QTest::newRow("eurowings") << s("lufthansa") << s("../onboard-journey/eurowings.in.json") << 51.58527374267578f << 12.357730865478516f << 637.087f << -137.6375f << 9018.42f;
0070         QTest::newRow("lufthansa") << s("lufthansa") << s("../onboard-journey/lufthansa.in.json") << 51.9423f << 12.4496f << 718.576f << -120.785f << 6491.63f;
0071     }
0072 
0073     void testScriptedPositionParsers()
0074     {
0075         QFETCH(QString, backendId);
0076         QFETCH(QString, inputFile);
0077         QFETCH(float, lat);
0078         QFETCH(float, lon);
0079         QFETCH(float, speed);
0080         QFETCH(float, heading);
0081         QFETCH(float, altitude);
0082 
0083         auto backend = OnboardStatusManager::createBackend(backendId);
0084         QVERIFY(backend);
0085         auto restApi = qobject_cast<const RestOnboardBackend*>(backend.get());
0086         QVERIFY(restApi);
0087         QVERIFY(restApi->createPositionRequest().url().isValid());
0088 
0089         QFile f(QLatin1String(SOURCE_DIR) + QLatin1String("/data/onboard-position/") + inputFile);
0090         QVERIFY(f.open(QFile::ReadOnly));
0091         const auto inputDoc = QJsonDocument::fromJson(f.readAll());
0092 
0093         PositionData pos;
0094         if (inputDoc.isArray()) {
0095             pos = restApi->parsePositionData(inputDoc.array());
0096         } else {
0097             pos = restApi->parsePositionData(inputDoc.object());
0098         }
0099         QCOMPARE(pos.latitude, lat);
0100         QCOMPARE(pos.longitude, lon);
0101         QCOMPARE(pos.speed, speed);
0102         QCOMPARE(pos.heading, heading);
0103         QCOMPARE(pos.altitude, altitude);
0104     }
0105 
0106     void testScriptedJourneyParsers_data()
0107     {
0108         QTest::addColumn<QString>("backendId");
0109         QTest::addColumn<QString>("testFile");
0110 
0111         QTest::newRow("cd-railjet") << s("ceskedrahy") << s("cd-railjet");
0112         QTest::newRow("db-ice") << s("deutschebahn-ice") << s("db-ice");
0113         QTest::newRow("db-ice-canceled-stops") << s("deutschebahn-ice") << s("db-ice-canceled-stops");
0114         QTest::newRow("db-zugportal") << s("deutschebahn-zugportal") << s("db-zugportal");
0115         QTest::newRow("db-zugportal-canceled") << s("deutschebahn-zugportal") << s("db-zugportal-canceled");
0116         QTest::newRow("sncf-inoui") << s("sncf-tgv") << s("sncf-inoui");
0117         QTest::newRow("sbb") << s("sbb") << s("sbb");
0118         QTest::newRow("oebb-railnet") << s("oebb") << s("oebb-railnet");
0119 
0120         QTest::newRow("ana") << s("panasonic-inflight-v1") << s("ana");
0121         QTest::newRow("unite-panasonic") << s("panasonic-inflight-v1") << s("united-panasonic");
0122         QTest::newRow("cathay-pacific") << s("panasonic-inflight-v2") << s("cathay-pacific");
0123         QTest::newRow("eurowings") << s("lufthansa") << s("eurowings");
0124         QTest::newRow("lufthansa") << s("lufthansa") << s("lufthansa");
0125         QTest::newRow("united") << s("united") << s("united");
0126     }
0127 
0128     void testScriptedJourneyParsers()
0129     {
0130         QFETCH(QString, backendId);
0131         QFETCH(QString, testFile);
0132 
0133         auto backend = OnboardStatusManager::createBackend(backendId);
0134         QVERIFY(backend);
0135         auto restApi = qobject_cast<const RestOnboardBackend*>(backend.get());
0136         QVERIFY(restApi);
0137         QVERIFY(restApi->createJourneyRequest().url().isValid());
0138 
0139         QFile inputFile(QLatin1String(SOURCE_DIR) + QLatin1String("/data/onboard-journey/") + testFile + QLatin1String(".in.json"));
0140         QVERIFY(inputFile.open(QFile::ReadOnly));
0141 
0142         const auto inputDoc = QJsonDocument::fromJson(inputFile.readAll());
0143         Journey jny;
0144         if (inputDoc.isArray()) {
0145             jny = restApi->parseJourneyData(inputDoc.array());
0146         } else {
0147             jny = restApi->parseJourneyData(inputDoc.object());
0148         }
0149 
0150         const auto jsonRes = Journey::toJson(jny);
0151 
0152         const QString refFileName = QLatin1String(SOURCE_DIR) + QLatin1String("/data/onboard-journey/") + testFile + QLatin1String(".out.json");
0153         const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).object();
0154         QVERIFY(Test::compareJson(refFileName, jsonRes, ref));
0155     }
0156 
0157     void testScriptedSupport_data()
0158     {
0159         QTest::addColumn<QString>("backendId");
0160         QTest::addColumn<bool>("supportsPosition");
0161         QTest::addColumn<bool>("supportsJourney");
0162 
0163         QTest::newRow("cd-railjet") << s("ceskedrahy") << true << true;
0164         QTest::newRow("db-ice") << s("deutschebahn-ice") << true << true;
0165         QTest::newRow("db-zugportal") << s("deutschebahn-zugportal") << false << true;
0166         QTest::newRow("sncf-inoui") << s("sncf-tgv") << true << true;
0167         QTest::newRow("sbb") << s("sbb") << true << true;
0168         QTest::newRow("thalys") << s("icomera-omboard") << true << false;
0169 
0170         QTest::newRow("ana") << s("panasonic-inflight-v1") << true << true;
0171         QTest::newRow("united") << s("panasonic-inflight-v1") << true << true;
0172         QTest::newRow("cathay-pacific") << s("panasonic-inflight-v2") << true << true;
0173         QTest::newRow("aegean") << s("aegean") << true << false;
0174         QTest::newRow("eurowings") << s("eurowings") << true << true;
0175     }
0176 
0177     void testScriptedSupport()
0178     {
0179         QFETCH(QString, backendId);
0180         QFETCH(bool, supportsPosition);
0181         QFETCH(bool, supportsJourney);
0182 
0183         auto backend = OnboardStatusManager::createBackend(backendId);
0184         QVERIFY(backend);
0185         auto restApi = qobject_cast<const RestOnboardBackend*>(backend.get());
0186         QVERIFY(restApi);
0187 
0188         QCOMPARE(restApi->supportsPosition(), supportsPosition);
0189         QCOMPARE(restApi->supportsJourney(), supportsJourney);
0190     }
0191 };
0192 
0193 QTEST_GUILESS_MAIN(OnboardStatusTest)
0194 
0195 #include "onboardstatustest.moc"