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

0001 /*
0002     SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include <text/pricefinder.cpp>
0007 
0008 #include <QTest>
0009 
0010 using namespace KItinerary;
0011 
0012 #define s(x) QStringLiteral(x)
0013 
0014 class PriceFinderTest : public QObject
0015 {
0016     Q_OBJECT
0017 private Q_SLOTS:
0018     void testFindHighest_data()
0019     {
0020         QTest::addColumn<QString>("input");
0021         QTest::addColumn<int>("start");
0022         QTest::addColumn<int>("end");
0023         QTest::addColumn<QString>("currency");
0024         QTest::addColumn<double>("value");
0025 
0026         QTest::newRow("iso-suffix-1") << s("123.45EUR") << 0 << 9 << s("EUR") << 123.45;
0027         QTest::newRow("iso-suffix-2") << s("123.45 EUR") << 0 << 10 << s("EUR") << 123.45;
0028         QTest::newRow("iso-prefix-1") << s("EUR123.45") << 0 << 9 << s("EUR") << 123.45;
0029         QTest::newRow("iso-prefix-2") << s("EUR 123.45") << 0 << 10 << s("EUR") << 123.45;
0030         QTest::newRow("symbol-suffix-1") << s("123.45€") << 0 << 7 << s("EUR") << 123.45;
0031         QTest::newRow("symbol-suffix-2") << s("123.45 €") << 0 << 8 << s("EUR") << 123.45;
0032         QTest::newRow("symbol-prefix-1") << s("€123.45") << 0 << 7 << s("EUR") << 123.45;
0033         QTest::newRow("symbol-prefix-2") << s("€ 123.45") << 0 << 8 << s("EUR") << 123.45;
0034 
0035         QTest::newRow("maximum-1") << s("0.50EUR\n1.99EUR\n23.45EUR") << 16 << 24 << s("EUR") << 23.45;
0036         QTest::newRow("maximum-2") << s("0.50 EUR\n0.50 EUR") << 0 << 8 << s("EUR") << 0.5;
0037 
0038         QTest::newRow("no-decimals-1") << s("7123 CZK") << 0 << 8 << s("CZK") << 7123.0;
0039         QTest::newRow("no-decimals-2") << s("CZK 7123") << 0 << 8 << s("CZK") << 7123.0;
0040 
0041         QTest::newRow("text-context-1") << s("Total: 123.43USD") << 7 << 16 << s("USD") << 123.43;
0042         QTest::newRow("text-context-2") << s("Total: 123.43USD\nTaxes: 12.34USD") << 7 << 16 << s("USD") << 123.43;
0043         QTest::newRow("text-context-3") << s("Total amount\nEUR 244.55\nYour payment") << 13 << 23 << s("EUR") << 244.55;
0044 
0045         QTest::newRow("single-digit-1") << s("1€") << 0 << 2 << s("EUR") << 1.0;
0046         QTest::newRow("single-digit-2") << s("1 EUR") << 0 << 5 << s("EUR") << 1.0;
0047 
0048         QTest::newRow("group-separator-1") << s("12,345.67 EUR") << 0 << 13 << s("EUR") << 12345.67;
0049         QTest::newRow("group-separator-2") << s("12 345.67 EUR") << 0 << 13 << s("EUR") << 12345.67;
0050         QTest::newRow("group-separator-3") << s("9,123,456.78 EUR") << 0 << 16 << s("EUR") << 9123456.78;
0051 
0052         QTest::newRow("comma-format-1") << s("2,34 EUR") << 0 << 8 << s("EUR") << 2.34;
0053         QTest::newRow("comma-format-2") << s("123,34 EUR") << 0 << 10 << s("EUR") << 123.34;
0054         QTest::newRow("comma-format-3") << s("4 123,34 EUR") << 0 << 12 << s("EUR") << 4123.34;
0055         QTest::newRow("comma-format-4") << s("4.123,34 EUR") << 0 << 12 << s("EUR") << 4123.34;
0056 
0057         QTest::newRow("group-separator-no-decimals-1") << s("7,123 CZK") << 0 << 9 << s("CZK") << 7123.0;
0058         QTest::newRow("group-separator-no-decimals-2") << s("1,237,123 CZK") << 0 << 13 << s("CZK") << 1237123.0;
0059 
0060         QTest::newRow("x1000-subdivision-1") << s("1.234,567 KWD") << 0 << 13 << s("KWD") << 1234.567;
0061         QTest::newRow("x1000-subdivision-2") << s("1 234 KWD") << 0 << 9 << s("KWD") << 1234.0;
0062 
0063         QTest::newRow("parenthesis") << s("(Price before tax 101.46 EUR)") << 18 << 29 << s("EUR") << 101.46;
0064 
0065         QTest::newRow("double-space-1") << s("123.46  EUR") << 0 << 11 << s("EUR") << 123.46;
0066         QTest::newRow("double-space-2") << s("EUR  123.46") << 0 << 11 << s("EUR") << 123.46;
0067         QTest::newRow("double-space-3") << s("ABC1234V 92.00  EUR 1.00  EUR\n") << 10 << 20 << s("EUR") << 92.0;
0068         QTest::newRow("multi-space") << s("RENTAL CHARGE:                        66.77   EUR UNLIMITED       KM") << 38 << 49 << s("EUR") << 66.77;
0069 
0070         QTest::newRow("no-space-1") << s("Payment collected:GBP375.14/incl VAT |") << 18 << 27 << s("GBP") << 375.14;
0071         QTest::newRow("no-space-2") << s("Total:GBP375.14") << 6 << 15 << s("GBP") << 375.14;
0072         QTest::newRow("no-space-3") << s("Total (GBP375.14)") << 6 << 16 << s("GBP") << 375.14;
0073 
0074         QTest::newRow("yen-1") << s("¥6460.00 JPY") << 1 << 12 << s("JPY") << 6460.0;
0075         QTest::newRow("yen-2") << s("¥6460 円") << 1 << 7 << s("JPY") << 6460.0;
0076 
0077         QTest::newRow("pound-sign-1") << s("£95.90") << 0 << 6 << s("GBP") << 95.90;
0078         QTest::newRow("pound-sign-2") << s("*£95.90*") << 0 << 7 << s("GBP") << 95.90;
0079         QTest::newRow("pound-sign-3") << s("£95.90") << 0 << 6 << s("GBP") << 95.90;
0080 
0081         QTest::newRow("czech-1") << s("Cena 339 Kč") << 5 << 11 << s("CZK") << 339.0;
0082         QTest::newRow("czech-2") << s("Cena 339 Kc") << 5 << 11 << s("CZK") << 339.0;
0083 
0084         QTest::newRow("non-breaking-space-1") << s("Total price:                         17 704 SEK\n") << 37 << 47 << s("SEK") << 17704.0;
0085         QTest::newRow("non-breaking-space-2") << s("35,90 €") << 0 << 7 << s("EUR") << 35.9 ;
0086         QTest::newRow("non-breaking-space-3") << s("5 €") << 0 << 3 << s("EUR") << 5.0 ;
0087     }
0088 
0089     void testFindHighest()
0090     {
0091         QFETCH(QString, input);
0092         QFETCH(int, start);
0093         QFETCH(int, end);
0094         QFETCH(QString, currency);
0095         QFETCH(double, value);
0096 
0097         PriceFinder finder;
0098         const auto res = finder.findHighest(input);
0099         QEXPECT_FAIL("double-space-3", "overlapping price data resolution not implemented", Abort);
0100         QVERIFY(res.hasResult());
0101         QCOMPARE(res.start, start);
0102         QCOMPARE(res.end, end);
0103         QCOMPARE(res.currency, currency);
0104         QCOMPARE(res.value, value);
0105     }
0106 
0107     void testFindHighestNegative_data()
0108     {
0109         QTest::addColumn<QString>("input");
0110 
0111         QTest::newRow("empty") << QString();
0112         QTest::newRow("text") << s("test text");
0113         QTest::newRow("number") << s("1.23");
0114         QTest::newRow("currency") << s("EUR");
0115         QTest::newRow("not-currency-1") << s("123.45 XXX");
0116         QTest::newRow("not-currency-1") << s("XXX123.45");
0117         QTest::newRow("not-currency-3") << s("XXXEUR 123.45");
0118 
0119         QTest::newRow("ambigious-symbol-1") << s("$123.45");
0120         QTest::newRow("ambigious-symbol-2") << s("123.45 kr");
0121         QTest::newRow("ambigious-symbol-3") << s("123.45 kr.");
0122 
0123         QTest::newRow("group-separator-mix") << s("1,234 567.90 EUR");
0124         QTest::newRow("wrong-group-separators-1") << s("12,23,45 EUR");
0125         QTest::newRow("wrong-group-separators-2") << s("12 23 45 EUR");
0126         QTest::newRow("wrong-group-separators-3") << s("12.23.45 EUR");
0127         QTest::newRow("wrong-group-separators-4") << s("12,,345.45 EUR");
0128         QTest::newRow("wrong-group-separators-5") << s("12  345.45 EUR");
0129         QTest::newRow("wrong-group-separators-6") << s("9,123 456.78 EUR");
0130         QTest::newRow("wrong-group-separators-7") << s("12,234,45 EUR");
0131         QTest::newRow("too-many-decimals") << s("12.3454 EUR");
0132 
0133         QTest::newRow("ambigious-currency") << s("USD 123.45 EUR");
0134 
0135         QTest::newRow("x1000-subdivision-1") << s("KWD 1.234");
0136         QTest::newRow("x1000-subdivision-2") << s("1,234 BHD");
0137         QTest::newRow("no-subdivision") << s("1.23 IRR");
0138 
0139         QTest::newRow("mixed-currencies-1") << s("123.45 EUR\n234.56 USD");
0140         QTest::newRow("mixed-currencies-2") << s("Payment collected:EUR375.14/GBP317.47 |");
0141 
0142         QTest::newRow("pnr") << s("S64IHN");
0143         QTest::newRow("address") << s("3600 S Las Vegas Blvd.");
0144 
0145         QTest::newRow("overlapping") << s("january 2020 € 52,83");
0146 
0147         QTest::newRow("negative") << s("-93.00EUR");
0148 
0149         QTest::newRow("yen-sign-1") << s("¥6460");
0150         QTest::newRow("yen-sign-2") << s("¥6460");
0151 
0152         QTest::newRow("distance") << s("KM0118");
0153     }
0154 
0155     void testFindHighestNegative()
0156     {
0157         QFETCH(QString, input);
0158         PriceFinder finder;
0159         const auto res = finder.findHighest(input);
0160         QVERIFY(!res.hasResult());
0161     }
0162 };
0163 
0164 QTEST_GUILESS_MAIN(PriceFinderTest)
0165 
0166 #include "pricefindertest.moc"