File indexing completed on 2024-05-12 05:17:32

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include <text/timefinder.cpp>
0007 
0008 #include <QTest>
0009 
0010 using namespace KItinerary;
0011 
0012 #define s(x) QStringLiteral(x)
0013 
0014 class TimeFinderTest : public QObject
0015 {
0016     Q_OBJECT
0017 private Q_SLOTS:
0018     void testTimeFinderSingular_data()
0019     {
0020         QTest::addColumn<QString>("input");
0021         QTest::addColumn<QTime>("time");
0022 
0023         QTest::newRow("ISO") << s("bla 23:42 blub") << QTime(23, 42);
0024         QTest::newRow("short") << s("1:23") << QTime(1, 23);
0025         QTest::newRow("min") << s("abc 0:00") << QTime(0, 0);
0026         QTest::newRow("max") << s("23:59 abc") << QTime(23, 59);
0027         QTest::newRow("French") << s("bla 16h45 blub") << QTime(16, 45);
0028         QTest::newRow("dot") << s("bla 18.30 blub") << QTime(18, 30);
0029         QTest::newRow("US") << s("1:30 pm") << QTime(13, 30);
0030         QTest::newRow("US midnight") << s("12:00 am") << QTime(0, 0);
0031         QTest::newRow("US noon") << s("12:00 p.m.") << QTime(12, 0);
0032         QTest::newRow("extra pm") << s("14:20PM") << QTime(14, 20);
0033         QTest::newRow("short pm") << s("6:40p") << QTime(18, 40);
0034         QTest::newRow("Japanese") << s("16時04分") << QTime(16, 4);
0035         QTest::newRow("dot with ap") << s("12.30 am") << QTime(0, 30);
0036         QTest::newRow("Korean pm") << s("오후 1시 30분") << QTime(13, 30);
0037         QTest::newRow("Korean 24h") << s("14시 5분") << QTime(14, 5);
0038         QTest::newRow("Chinese 24h") << s("19時45分") << QTime(19, 45);
0039         QTest::newRow("Chinese colon/pm") << s("下午7:45") << QTime(19, 45);
0040         QTest::newRow("Chinese full/pm") << s("下午7點45分") << QTime(19, 45);
0041         QTest::newRow("Greek pm") << s("10:40 μ.μ.") << QTime(22, 40);
0042         QTest::newRow("Arabic pm") << s("11:30م ") << QTime(23, 30);
0043         QTest::newRow("Hrs") << s("1145 Hrs") << QTime(11, 45);
0044         // TODO tests for RLM/LRM control chars, and Arabic times with indic numbers
0045     }
0046 
0047     void testTimeFinderSingular()
0048     {
0049         QFETCH(QString, input);
0050         QFETCH(QTime, time);
0051 
0052         TimeFinder finder;
0053         finder.find(input);
0054         QCOMPARE(finder.results().size(), 1);
0055         QCOMPARE(finder.results()[0].dateTime.toTime(), time);
0056 
0057         QCOMPARE(finder.findSingularTime(input), time);
0058     }
0059 
0060     void testTimeFinderNone_data()
0061     {
0062         QTest::addColumn<QString>("input");
0063 
0064         QTest::newRow("empty") << QString();
0065         QTest::newRow("text") << s("some text without mentioning a time");
0066         QTest::newRow("colon") << s("item 3: 24");
0067         QTest::newRow("DE date") << s("am 12.10. ");
0068         QTest::newRow("ISO hour out of range") << s("24:59");
0069         QTest::newRow("ISO min out of range") << s("23:60");
0070         QTest::newRow("with seconds") << s("12:23:54");
0071         QTest::newRow("in number") << s("12.234");
0072         QTest::newRow("price") << s("1.30$");
0073         QTest::newRow("pm no separator") << s("6:40px");
0074         QTest::newRow("no leading separation") << s("x12:30 bla");
0075         QTest::newRow("no trailing separation") << s("\n12:30bla");
0076         QTest::newRow("ap without separation") << s("07:13ama");
0077     }
0078 
0079     void testTimeFinderNone()
0080     {
0081         QFETCH(QString, input);
0082 
0083         TimeFinder finder;
0084         finder.find(input);
0085         QCOMPARE(finder.results().size(), 0);
0086         QCOMPARE(finder.findSingularTime(input), QTime());
0087     }
0088 
0089     void testTimeFinderPlural()
0090     {
0091         TimeFinder finder;
0092         finder.find(u"from 09:00 to 17:00");
0093         QCOMPARE(finder.results().size(), 2);
0094         QCOMPARE(finder.results()[0].dateTime.toTime(), QTime(9, 0));
0095         QCOMPARE(finder.results()[1].dateTime.toTime(), QTime(17, 0));
0096 
0097         QCOMPARE(finder.findSingularTime(u"from 09:00 to 17:00"), QTime());
0098     }
0099 
0100     void testTimeFinderDateTime_data()
0101     {
0102         QTest::addColumn<QString>("input");
0103         QTest::addColumn<QDateTime>("dateTime");
0104 
0105         QTest::newRow("US") << s("26 Sep 2021 16:43") << QDateTime({2021, 9, 26}, {16, 43});
0106         QTest::newRow("US") << s("26.09.2021 16:43") << QDateTime({2021, 9, 26}, {16, 43});
0107     }
0108 
0109     void testTimeFinderDateTime()
0110     {
0111         QFETCH(QString, input);
0112         QFETCH(QDateTime, dateTime);
0113 
0114         TimeFinder finder;
0115         finder.find(input);
0116         QCOMPARE(finder.results().size(), 1);
0117         QCOMPARE(finder.results()[0].dateTime.toDateTime(), dateTime);
0118     }
0119 };
0120 
0121 QTEST_GUILESS_MAIN(TimeFinderTest)
0122 
0123 #include "timefindertest.moc"