File indexing completed on 2024-04-21 15:30:36

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <KPublicTransport/Location>
0008 
0009 #include <QTest>
0010 
0011 #include <cmath>
0012 
0013 #define s(x) QStringLiteral(x)
0014 
0015 using namespace KPublicTransport;
0016 
0017 class LocationTest : public QObject
0018 {
0019     Q_OBJECT
0020 private Q_SLOTS:
0021     void testLocationNameCompare_data()
0022     {
0023         QTest::addColumn<QString>("lhs");
0024         QTest::addColumn<QString>("rhs");
0025 
0026         QTest::newRow("identical") << s("Berlin Hbf") << s("Berlin Hbf");
0027 
0028         QTest::newRow("case folding") << s("Berlin Hbf") << s("Berlin HBF");
0029 
0030         QTest::newRow("separators1") << s("Berlin Hauptbahnhof") << s("Berlin, Hauptbahnhof");
0031         QTest::newRow("separators2") << s("Berlin Hauptbahnhof") << s("Berlin (Hauptbahnhof)");
0032         QTest::newRow("separators3") << s("Berlin, Hauptbahnhof") << s("Berlin (Hauptbahnhof)");
0033         QTest::newRow("separators4") << s("Paris-Gare-de-Lyon") << s("Paris Gare de Lyon");
0034 
0035         QTest::newRow("abbreviations1") << s("Berlin Hbf") << s("Berlin Hauptbahnhof");
0036         QTest::newRow("abbreviations2") << s("Amsterdam Cs") << s("Amsterdam Centraal");
0037         QTest::newRow("abbreviations3") << s("Berlin Friedrich Straße") << s("Berlin Friedrich Str.");
0038 
0039         QTest::newRow("inline abbreviation1") << s("Berlin Friedrichstr.") << s("Berlin Friedrichstrasse");
0040 
0041         QTest::newRow("extras1") << s("S+U Berlin Hbf") << s("Berlin Hauptbahnhof");
0042         QTest::newRow("extras2") << s("Berlin Schönefeld Flughafen (S)") << s("S Berlin Schönefeld Flughafen");
0043         QTest::newRow("extras3") << s("Paris Gare de Lyon RER") << s("Paris Gare de Lyon");
0044         QTest::newRow("extras4") << s("Paris-Gare-de-Lyon RER (Paris)") << s("Gare de Lyon RER A (Paris)");
0045 
0046         QTest::newRow("station1") << s("Boissy-St-Léger") << s("Gare de Boissy-St-Léger");
0047         QTest::newRow("station2") << s("Flughafen Wien") << s("Flughafen Wien Bahnhof");
0048         QTest::newRow("station3") << s("Berlin Schönefeld Flughafen Bhf") << s("Berlin Schönefeld Flughafen");
0049 
0050         QTest::newRow("duplicates1") << s("Paris Gare de Lyon (Paris)") << s("Paris Gare de Lyon");
0051         QTest::newRow("duplicates2") << s("Gare de Saint-Rémy les Chevreuse (Saint-Rémy-lès-Chevreuse)") << s("St-Rémy-lès-Chevreuse (Saint-Rémy-lès-Chevreuse)");
0052 
0053         QTest::newRow("normalization1") << s("Boissy-St-Léger (Boissy-Saint-Léger)") << s("Boissy St Léger");
0054 
0055         QTest::newRow("order1") << s("Paris Gare de Lyon") << s("Gare de Lyon (Paris)");
0056 
0057         QTest::newRow("localization1") << s("Berlin Flughafen Schönefeld (Airport)") << s("Berlin Flughafen Schönefeld Bhf");
0058 
0059         QTest::newRow("diacritic1") << s("Berlin Flughafen Schonefeld") << s("Berlin Flughafen Schönefeld");
0060         QTest::newRow("diacritic2") << s("Berlin Flughafen Schoenefeld") << s("Berlin Flughafen Schönefeld");
0061         QTest::newRow("diacritic3") << s("København H") << s("Koebenhavn H");
0062 
0063         QTest::newRow("prefix1") << s("Zürich Flughafen") << s("Zürich Flughafen (Kloten)");
0064 
0065         QTest::newRow("unicode1") << s("Berlin Friedrichstraße") << s("Berlin Friedrichstrasse");
0066     }
0067 
0068     void testLocationNameCompare()
0069     {
0070         QFETCH(QString, lhs);
0071         QFETCH(QString, rhs);
0072         Location l, r;
0073         l.setName(lhs);
0074         r.setName(rhs);
0075 
0076         QEXPECT_FAIL("inline abbreviation1", "not implemented yet", Abort);
0077         QVERIFY(Location::isSame(l, r));
0078         QVERIFY(Location::isSame(r, l));
0079     }
0080 
0081     void testLocationNameMerge_data()
0082     {
0083         QTest::addColumn<QString>("lhs");
0084         QTest::addColumn<QString>("rhs");
0085         QTest::addColumn<QString>("result");
0086 
0087         QTest::newRow("identical") << s("Berlin Hbf") << s("Berlin Hbf") << s("Berlin Hbf");
0088         QTest::newRow("abbreviation") << s("Berlin Hbf") << s("Berlin Hauptbahnhof") << s("Berlin Hauptbahnhof");
0089         QTest::newRow("separators") << s("Châtelet les Halles (Paris)") << s("Châtelet-les-Halles (Paris)") << s("Châtelet les Halles (Paris)");
0090 
0091         // TODO stuff that doesn't work as good as it could be yet
0092         //QTest::newRow("all caps") << s("BERLIN") << s("Berlin") << s("Berlin");
0093         //QTest::newRow("unicode") << s("København H") << s("Koebenhavn H") << s("København H");
0094         //QTest::newRow("redundancy") << s("Bern (Bern)") << s("Bern") << s("Bern");
0095     }
0096 
0097     void testLocationNameMerge()
0098     {
0099         QFETCH(QString, lhs);
0100         QFETCH(QString, rhs);
0101         QFETCH(QString, result);
0102 
0103         Location l, r;
0104         l.setName(lhs);
0105         r.setName(rhs);
0106 
0107         QCOMPARE(Location::merge(l, r).name(), result);
0108         QCOMPARE(Location::merge(r, l).name(), result);
0109     }
0110 
0111     void testCoordinates()
0112     {
0113         Location l, r;
0114         l.setName(QStringLiteral("Berlin"));
0115         r.setName(QStringLiteral("Berlin"));
0116 
0117         l.setCoordinate(52.555, 13.555);
0118         QVERIFY(Location::isSame(l, r));
0119         QVERIFY(Location::isSame(r, l));
0120 
0121         r.setCoordinate(52.557, 13.557);
0122         QVERIFY(Location::isSame(l, r));
0123         QVERIFY(Location::isSame(r, l));
0124 
0125         QVERIFY(std::abs(Location::merge(l, r).latitude() - 52.556) < 0.001);
0126         QVERIFY(std::abs(Location::merge(r, l).latitude() - 52.556) < 0.001);
0127         QVERIFY(std::abs(Location::merge(l, r).longitude() - 13.556) < 0.001);
0128         QVERIFY(std::abs(Location::merge(r, l).longitude() - 13.556) < 0.001);
0129 
0130         r.setCoordinate(-52.5, 135.5);
0131         QVERIFY(!Location::isSame(l, r));
0132         QVERIFY(!Location::isSame(r, l));
0133     }
0134 
0135     void testLocationIdentifierCompare()
0136     {
0137         Location l, r;
0138         l.setIdentifier(QStringLiteral("ibnr"), QStringLiteral("8012345"));
0139         r.setIdentifier(QStringLiteral("ibnr"), QStringLiteral("8054321"));
0140         QVERIFY(!Location::isSame(l, r));
0141         QVERIFY(!Location::isSame(r, l));
0142         QVERIFY(Location::isSame(l, l));
0143 
0144         l.setIdentifier(QStringLiteral("db"), QStringLiteral("12345"));
0145         r.setIdentifier(QStringLiteral("db"), QStringLiteral("12345"));
0146         QVERIFY(!Location::isSame(l, r));
0147         QVERIFY(!Location::isSame(r, l));
0148         QVERIFY(Location::isSame(l, l));
0149 
0150         l.setIdentifier(QStringLiteral("sncf"), QStringLiteral("FRABC"));
0151         QVERIFY(!Location::isSame(l, r));
0152         QVERIFY(!Location::isSame(r, l));
0153         QVERIFY(Location::isSame(l, l));
0154 
0155         Location l2, r2;
0156         l2.setName(QStringLiteral("Brussels Gare de Midi"));
0157         l2.setName(QStringLiteral("Brussels Gare de Midi"));
0158         l2.setIdentifier(QStringLiteral("vendor1"), QStringLiteral("12345"));
0159         r2.setIdentifier(QStringLiteral("vendor2"), QStringLiteral("54321"));
0160         QVERIFY(Location::isSame(l2, r2));
0161         QVERIFY(Location::isSame(r2, l2));
0162     }
0163 };
0164 
0165 QTEST_GUILESS_MAIN(LocationTest)
0166 
0167 #include "locationtest.moc"