File indexing completed on 2024-04-14 04:36:17
0001 /* 0002 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "testhelpers.h" 0008 0009 #include <KPublicTransport/Journey> 0010 #include <KPublicTransport/HafasMgateParser> 0011 #include <KPublicTransport/Stopover> 0012 0013 #include <QFile> 0014 #include <QJsonArray> 0015 #include <QJsonDocument> 0016 #include <QJsonObject> 0017 #include <QJsonValue> 0018 #include <QTest> 0019 #include <QTimeZone> 0020 0021 #define s(x) QStringLiteral(x) 0022 0023 using namespace KPublicTransport; 0024 0025 class HafasMgateParserTest : public QObject 0026 { 0027 Q_OBJECT 0028 private Q_SLOTS: 0029 void initTestCase() 0030 { 0031 qputenv("TZ", "UTC"); 0032 qRegisterMetaType<Disruption::Effect>(); 0033 } 0034 0035 void testParseGeneralError_data() 0036 { 0037 QTest::addColumn<QString>("input"); 0038 QTest::newRow("version") << s(SOURCE_DIR "/data/hafas/error-invalid-version.json"); 0039 QTest::newRow("parse-clientId") << s(SOURCE_DIR "/data/hafas/error-parse-clientId.json"); 0040 QTest::newRow("parse-stbFilterEquiv") << s(SOURCE_DIR "/data/hafas/error-parse-stbFilterEquiv.json"); 0041 QTest::newRow("parse-empty") << s(SOURCE_DIR "/data/hafas/error-parse-empty.json"); 0042 } 0043 0044 void testParseGeneralError() 0045 { 0046 QFETCH(QString, input); 0047 0048 { 0049 HafasMgateParser p; 0050 p.parseLocations(Test::readFile(input)); 0051 QCOMPARE(p.error(), Reply::UnknownError); 0052 QVERIFY(!p.errorMessage().isEmpty()); 0053 } 0054 0055 { 0056 HafasMgateParser p; 0057 p.parseDepartures(Test::readFile(input)); 0058 QCOMPARE(p.error(), Reply::UnknownError); 0059 QVERIFY(!p.errorMessage().isEmpty()); 0060 } 0061 0062 { 0063 HafasMgateParser p; 0064 p.parseJourneys(Test::readFile(input)); 0065 QCOMPARE(p.error(), Reply::UnknownError); 0066 QVERIFY(!p.errorMessage().isEmpty()); 0067 } 0068 } 0069 0070 void testParseDepartureError() 0071 { 0072 HafasMgateParser p; 0073 const auto res = p.parseDepartures(Test::readFile(s(SOURCE_DIR "/data/hafas/stationboard-error-response.json"))); 0074 QVERIFY(res.empty()); 0075 QCOMPARE(p.error(), Reply::NotFoundError); 0076 QVERIFY(!p.errorMessage().isEmpty()); 0077 } 0078 0079 void parseDateTime_data() 0080 { 0081 QTest::addColumn<QString>("date"); 0082 QTest::addColumn<QString>("time"); 0083 QTest::addColumn<QJsonValue>("tzOffset"); 0084 QTest::addColumn<QDateTime>("dt"); 0085 0086 QTest::newRow("empty") << QString() << QString() << QJsonValue() << QDateTime(); 0087 QTest::newRow("same day") << s("20190105") << s("142100") << QJsonValue() << QDateTime({2019, 1, 5}, {14, 21}); 0088 QTest::newRow("next day") << s("20190105") << s("01142100") << QJsonValue() << QDateTime({2019, 1, 6}, {14, 21}); 0089 QTest::newRow("same day offset") << s("20190105") << s("142100") << QJsonValue(120) << QDateTime({2019, 1, 5}, {14, 21}, QTimeZone::fromSecondsAheadOfUtc(7200)); 0090 QTest::newRow("next day offset") << s("20190105") << s("01142100") << QJsonValue(-120) << QDateTime({2019, 1, 6}, {14, 21}, QTimeZone::fromSecondsAheadOfUtc(-7200)); 0091 } 0092 0093 void parseDateTime() 0094 { 0095 QFETCH(QString, date); 0096 QFETCH(QString, time); 0097 QFETCH(QJsonValue, tzOffset); 0098 QFETCH(QDateTime, dt); 0099 QCOMPARE(HafasMgateParser::parseDateTime(date, QJsonValue(time), tzOffset), dt); 0100 } 0101 0102 void testParseDepartures_data() 0103 { 0104 QTest::addColumn<QString>("inFileName"); 0105 QTest::addColumn<QString>("refFileName"); 0106 0107 QTest::newRow("de-nw-avv-canceled-departures") 0108 << s(SOURCE_DIR "/data/hafas/canceled-departures.in.json") 0109 << s(SOURCE_DIR "/data/hafas/canceled-departures.out.json"); 0110 } 0111 0112 void testParseDepartures() 0113 { 0114 QFETCH(QString, inFileName); 0115 QFETCH(QString, refFileName); 0116 0117 HafasMgateParser p; 0118 p.setLocationIdentifierTypes(QStringLiteral("unit-test")); 0119 const auto res = p.parseDepartures(Test::readFile(inFileName)); 0120 const auto jsonRes = Stopover::toJson(res); 0121 0122 const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array(); 0123 0124 if (jsonRes != ref) { 0125 qDebug().noquote() << QJsonDocument(jsonRes).toJson(); 0126 } 0127 QVERIFY(!jsonRes.empty()); 0128 QCOMPARE(jsonRes, ref); 0129 } 0130 0131 void testParseJourneys_data() 0132 { 0133 QTest::addColumn<QString>("inFileName"); 0134 QTest::addColumn<QString>("refFileName"); 0135 0136 QTest::newRow("de-db-canceled-with-path") 0137 << s(SOURCE_DIR "/data/hafas/canceled-journey-with-path.in.json") 0138 << s(SOURCE_DIR "/data/hafas/canceled-journey-with-path.out.json"); 0139 QTest::newRow("de-bvg-alternative-load-messages") 0140 << s(SOURCE_DIR "/data/hafas/journey-bvg-load-messages.in.json") 0141 << s(SOURCE_DIR "/data/hafas/journey-bvg-load-messages.out.json"); 0142 QTest::newRow("de-vsn-alternative-platform-data") 0143 << s(SOURCE_DIR "/data/hafas/journey-vsn-alternative-platform-data.in.json") 0144 << s(SOURCE_DIR "/data/hafas/journey-vsn-alternative-platform-data.out.json"); 0145 } 0146 0147 void testParseJourneys() 0148 { 0149 QFETCH(QString, inFileName); 0150 QFETCH(QString, refFileName); 0151 0152 HafasMgateParser p; 0153 p.setLocationIdentifierTypes(QStringLiteral("unit-test")); 0154 const auto res = p.parseJourneys(Test::readFile(inFileName)); 0155 const auto jsonRes = Journey::toJson(res); 0156 0157 const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array(); 0158 0159 QVERIFY(!jsonRes.empty()); 0160 QVERIFY(Test::compareJson(refFileName, jsonRes, ref)); 0161 } 0162 }; 0163 0164 QTEST_GUILESS_MAIN(HafasMgateParserTest) 0165 0166 #include "hafasmgateparsertest.moc"