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"