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"