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

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "testhelpers.h"
0008 #include "backends/opentripplannerparser.h"
0009 
0010 #include <KPublicTransport/Journey>
0011 #include <KPublicTransport/Location>
0012 #include <KPublicTransport/RentalVehicle>
0013 #include <KPublicTransport/Stopover>
0014 
0015 #include <QFile>
0016 #include <QJsonArray>
0017 #include <QJsonDocument>
0018 #include <QJsonObject>
0019 #include <QJsonValue>
0020 #include <QTest>
0021 #include <QTimeZone>
0022 
0023 #define s(x) QStringLiteral(x)
0024 
0025 using namespace KPublicTransport;
0026 
0027 using RentalVehicleNetworkMap = QHash<QString, RentalVehicleNetwork>;
0028 
0029 class OtpParserTest : public QObject
0030 {
0031     Q_OBJECT
0032 private Q_SLOTS:
0033     void initTestCase()
0034     {
0035         qputenv("TZ", "UTC");
0036         QLocale::setDefault(QLocale(QLocale::Swedish, QLocale::Finland));
0037         qRegisterMetaType<Disruption::Effect>();
0038         qRegisterMetaType<RentalVehicle>();
0039     }
0040 
0041     void testParseLocationByCoordinate_data()
0042     {
0043         QTest::addColumn<QString>("inFileName");
0044         QTest::addColumn<QString>("refFileName");
0045         QTest::addColumn<RentalVehicleNetworkMap>("networks");
0046 
0047         QTest::newRow("fi-digitransit-location")
0048             << s(SOURCE_DIR "/data/otp/fi-digitransit-location-by-coordinate.in.json")
0049             << s(SOURCE_DIR "/data/otp/fi-digitransit-location-by-coordinate.out.json")
0050             << RentalVehicleNetworkMap();
0051 
0052         RentalVehicleNetworkMap networks;
0053         networks.insert(s("car-sharing"), {});
0054         networks.insert(s("taxi"), {});
0055         RentalVehicleNetwork n;
0056         n.setName(s("RegioRad"));
0057         n.setVehicleTypes(RentalVehicle::Bicycle);
0058         networks.insert(s("regiorad"), n);
0059         QTest::newRow("de-stadtnavi-rental-vehicle-locations")
0060             << s(SOURCE_DIR "/data/otp/de-stadtnavi-rental-vehicle-locations.in.json")
0061             << s(SOURCE_DIR "/data/otp/de-stadtnavi-rental-vehicle-locations.out.json")
0062             << networks;
0063     }
0064 
0065     void testParseLocationByCoordinate()
0066     {
0067         QFETCH(QString, inFileName);
0068         QFETCH(QString, refFileName);
0069         QFETCH(RentalVehicleNetworkMap, networks);
0070 
0071         OpenTripPlannerParser p(s("gtfs"));
0072         p.setKnownRentalVehicleNetworks(networks);
0073         const auto res = p.parseLocationsByCoordinate(QJsonDocument::fromJson(Test::readFile(inFileName)).object());
0074         const auto jsonRes = Location::toJson(res);
0075 
0076         const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array();
0077 
0078         if (jsonRes != ref) {
0079             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0080         }
0081         QVERIFY(!jsonRes.empty());
0082         QCOMPARE(jsonRes, ref);
0083     }
0084 
0085     void testParseLocationByName_data()
0086     {
0087         QTest::addColumn<QString>("inFileName");
0088         QTest::addColumn<QString>("refFileName");
0089 
0090         QTest::newRow("fi-digitransit-location")
0091             << s(SOURCE_DIR "/data/otp/fi-digitransit-location-by-name.in.json")
0092             << s(SOURCE_DIR "/data/otp/fi-digitransit-location-by-name.out.json");
0093         QTest::newRow("it-torino-location")
0094             << s(SOURCE_DIR "/data/otp/it-torino-location-by-name.in.json")
0095             << s(SOURCE_DIR "/data/otp/it-torino-location-by-name.out.json");
0096     }
0097 
0098     void testParseLocationByName()
0099     {
0100         QFETCH(QString, inFileName);
0101         QFETCH(QString, refFileName);
0102 
0103         OpenTripPlannerParser p(s("gtfs"));
0104         const auto res = p.parseLocationsByName(QJsonDocument::fromJson(Test::readFile(inFileName)).object());
0105         const auto jsonRes = Location::toJson(res);
0106 
0107         const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array();
0108 
0109         if (jsonRes != ref) {
0110             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0111         }
0112         QVERIFY(!jsonRes.empty());
0113         QCOMPARE(jsonRes, ref);
0114     }
0115 
0116     void testParseDepartures_data()
0117     {
0118         QTest::addColumn<QString>("inFileName");
0119         QTest::addColumn<QString>("refFileName");
0120 
0121         QTest::newRow("fi-digitransit-departures")
0122             << s(SOURCE_DIR "/data/otp/fi-digitransit-departure.in.json")
0123             << s(SOURCE_DIR "/data/otp/fi-digitransit-departure.out.json");
0124     }
0125 
0126     void testParseDepartures()
0127     {
0128         QFETCH(QString, inFileName);
0129         QFETCH(QString, refFileName);
0130 
0131         OpenTripPlannerParser p(s("gtfs"));
0132         const auto res = p.parseDepartures(QJsonDocument::fromJson(Test::readFile(inFileName)).object());
0133         const auto jsonRes = Stopover::toJson(res);
0134 
0135         const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array();
0136 
0137         if (jsonRes != ref) {
0138             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0139         }
0140         QVERIFY(!jsonRes.empty());
0141         QCOMPARE(jsonRes, ref);
0142     }
0143 
0144     void testParseJourney_data()
0145     {
0146         QTest::addColumn<QString>("inFileName");
0147         QTest::addColumn<QString>("refFileName");
0148         QTest::addColumn<QString>("networkConfig");
0149 
0150         QTest::newRow("fi-digitransit-journey")
0151             << s(SOURCE_DIR "/data/otp/fi-digitransit-journey.in.json")
0152             << s(SOURCE_DIR "/data/otp/fi-digitransit-journey.out.json")
0153             << QString();
0154         QTest::newRow("no-entur-journey")
0155             << s(SOURCE_DIR "/data/otp/no-entur-journey.in.json")
0156             << s(SOURCE_DIR "/data/otp/no-entur-journey.out.json")
0157             << QString();
0158         QTest::newRow("de-ulm-rentalbike-journey")
0159             << s(SOURCE_DIR "/data/otp/de-ulm-rentalbike-journey.in.json")
0160             << s(SOURCE_DIR "/data/otp/de-ulm-rentalbike-journey.out.json")
0161             << s(SOURCE_DIR "/../src/lib/networks/de_bw_stadtnavi.json");
0162         QTest::newRow("de-stadtnavi-carpool-journey")
0163             << s(SOURCE_DIR "/data/otp/de-stadtnavi-carpool-journey.in.json")
0164             << s(SOURCE_DIR "/data/otp/de-stadtnavi-carpool-journey.out.json")
0165             << s(SOURCE_DIR "/../src/lib/networks/de_bw_stadtnavi.json");
0166         QTest::newRow("de-stadtnavi-bike-parking-journey")
0167             << s(SOURCE_DIR "/data/otp/de-stadtnavi-bike-parking-journey.in.json")
0168             << s(SOURCE_DIR "/data/otp/de-stadtnavi-bike-parking-journey.out.json")
0169             << s(SOURCE_DIR "/../src/lib/networks/de_bw_stadtnavi.json");
0170         QTest::newRow("no-entur-navigation-guides")
0171             << s(SOURCE_DIR "/data/otp/no-entur-navigation-guides.in.json")
0172             << s(SOURCE_DIR "/data/otp/no-entur-navigation-guides.out.json")
0173             << QString();
0174     }
0175 
0176     void testParseJourney()
0177     {
0178         QFETCH(QString, inFileName);
0179         QFETCH(QString, refFileName);
0180         QFETCH(QString, networkConfig);
0181 
0182         const auto configObj = QJsonDocument::fromJson(Test::readFile(networkConfig)).object();
0183         const auto networkConfigObj = configObj.value(QLatin1String("options")).toObject().value(QLatin1String("rentalVehicleNetworks")).toObject();
0184         QHash <QString, RentalVehicleNetwork> rentalVehicleNetworks;
0185         for (auto it = networkConfigObj.begin(); it != networkConfigObj.end(); ++it) {
0186             auto n = RentalVehicleNetwork::fromJson(it.value().toObject());
0187             rentalVehicleNetworks.insert(it.key(), std::move(n));
0188         }
0189 
0190         OpenTripPlannerParser p(s("gtfs"), s("1"));
0191         p.setKnownRentalVehicleNetworks(rentalVehicleNetworks);
0192         const auto res = p.parseJourneys(QJsonDocument::fromJson(Test::readFile(inFileName)).object());
0193         const auto jsonRes = Journey::toJson(res);
0194 
0195         const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array();
0196 
0197         QVERIFY(!jsonRes.empty());
0198         QVERIFY(Test::compareJson(refFileName, jsonRes, ref));
0199     }
0200 };
0201 
0202 QTEST_GUILESS_MAIN(OtpParserTest)
0203 
0204 #include "otpparsertest.moc"