File indexing completed on 2024-05-19 05:17:49
0001 /* 0002 SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include <KItinerary/ExtractorDocumentNode> 0008 #include <KItinerary/ExtractorDocumentNodeFactory> 0009 #include <KItinerary/ExtractorDocumentProcessor> 0010 #include <KItinerary/ExtractorEngine> 0011 #include <KItinerary/ExtractorFilter> 0012 #include <KItinerary/ExtractorResult> 0013 0014 #include <QFile> 0015 #include <QTest> 0016 0017 using namespace KItinerary; 0018 0019 #define s(x) QStringLiteral(x) 0020 0021 class ExtractorFilterTest : public QObject 0022 { 0023 Q_OBJECT 0024 private Q_SLOTS: 0025 void testIcalFilter() 0026 { 0027 QFile f(s(SOURCE_DIR "/extractordata/ical/eventreservation.ics")); 0028 QVERIFY(f.open(QFile::ReadOnly)); 0029 0030 ExtractorEngine engine; 0031 auto root = engine.documentNodeFactory()->createNode(f.readAll()); 0032 QVERIFY(!root.isNull()); 0033 QCOMPARE(root.mimeType(), QLatin1StringView("text/calendar")); 0034 root.processor()->expandNode(root, &engine); 0035 QCOMPARE(root.childNodes().size(), 1); 0036 0037 ExtractorFilter filter; 0038 filter.setMimeType(s("text/calendar")); 0039 filter.setFieldName(s("productId")); 0040 filter.setPattern(s("KDE")); 0041 filter.setScope(ExtractorFilter::Current); 0042 0043 QVERIFY(!filter.matches(root)); 0044 0045 filter.setPattern(s("libkcal")); 0046 QVERIFY(filter.matches(root)); 0047 0048 std::vector<ExtractorDocumentNode> matches; 0049 filter.allMatches(root, matches); 0050 QCOMPARE(matches.size(), 1); 0051 QCOMPARE(matches[0].mimeType(), root.mimeType()); 0052 0053 filter.setScope(ExtractorFilter::Children); 0054 QVERIFY(!filter.matches(root)); 0055 filter.setMimeType(s("internal/event")); 0056 filter.setPattern(s("Akademy")); 0057 QVERIFY(!filter.matches(root)); 0058 filter.setFieldName(s("summary")); 0059 QVERIFY(filter.matches(root)); 0060 matches.clear(); 0061 filter.allMatches(root, matches); 0062 QCOMPARE(matches.size(), 1); 0063 QCOMPARE(matches[0].mimeType(), QLatin1StringView("internal/event")); 0064 filter.setScope(ExtractorFilter::Descendants); 0065 QVERIFY(filter.matches(root)); 0066 matches.clear(); 0067 filter.allMatches(root, matches); 0068 QCOMPARE(matches.size(), 1); 0069 QCOMPARE(matches[0].mimeType(), QLatin1StringView("internal/event")); 0070 } 0071 0072 void testPkPassFilter() 0073 { 0074 QFile f(s(SOURCE_DIR "/pkpassdata/swiss.pkpass")); 0075 QVERIFY(f.open(QFile::ReadOnly)); 0076 0077 ExtractorEngine engine; 0078 auto root = engine.documentNodeFactory()->createNode(f.readAll()); 0079 QVERIFY(!root.isNull()); 0080 QCOMPARE(root.mimeType(), 0081 QLatin1StringView("application/vnd.apple.pkpass")); 0082 root.processor()->expandNode(root, &engine); 0083 QCOMPARE(root.childNodes().size(), 1); 0084 auto bcbp = root.childNodes()[0]; 0085 QCOMPARE(bcbp.mimeType(), QLatin1StringView("internal/iata-bcbp")); 0086 0087 ExtractorFilter filter; 0088 filter.setMimeType(s("application/vnd.apple.pkpass")); 0089 filter.setFieldName(s("passTypeIdentifier")); 0090 filter.setPattern(s("pass.booking.swiss.com")); 0091 0092 filter.setScope(ExtractorFilter::Current); 0093 QVERIFY(!filter.matches(bcbp)); 0094 QVERIFY(filter.matches(root)); 0095 0096 filter.setScope(ExtractorFilter::Parent); 0097 QVERIFY(filter.matches(bcbp)); 0098 QVERIFY(!filter.matches(root)); 0099 filter.setScope(ExtractorFilter::Ancestors); 0100 QVERIFY(filter.matches(bcbp)); 0101 QVERIFY(!filter.matches(root)); 0102 } 0103 0104 void testResultFilter() 0105 { 0106 QFile f(s(SOURCE_DIR "/calendarhandlerdata/event.json")); 0107 QVERIFY(f.open(QFile::ReadOnly)); 0108 0109 ExtractorEngine engine; 0110 auto root = engine.documentNodeFactory()->createNode(f.readAll()); 0111 QVERIFY(!root.isNull()); 0112 QCOMPARE(root.mimeType(), QLatin1StringView("application/ld+json")); 0113 root.processor()->preExtract(root, &engine); 0114 QCOMPARE(root.result().size(), 1); 0115 0116 ExtractorFilter filter; 0117 filter.setMimeType(s("application/ld+json")); 0118 filter.setFieldName(s("location.address.addressLocality")); 0119 filter.setPattern(s("Berlin")); 0120 filter.setScope(ExtractorFilter::Current); 0121 QVERIFY(!filter.matches(root)); 0122 filter.setPattern(s("Milan")); 0123 QVERIFY(filter.matches(root)); 0124 } 0125 0126 void testIataBcbpFilter() 0127 { 0128 QFile f(s(SOURCE_DIR "/extractordata/synthetic/iata-bcbp-demo.pdf")); 0129 QVERIFY(f.open(QFile::ReadOnly)); 0130 0131 ExtractorEngine engine; 0132 engine.setData(f.readAll()); 0133 engine.extract(); 0134 const auto root = engine.rootDocumentNode(); 0135 QVERIFY(!root.isNull()); 0136 0137 ExtractorFilter filter; 0138 filter.setMimeType(s("internal/iata-bcbp")); 0139 filter.setScope(ExtractorFilter::Descendants); 0140 QVERIFY(filter.matches(root)); 0141 0142 std::vector<ExtractorDocumentNode> matches; 0143 filter.allMatches(root, matches); 0144 QCOMPARE(matches.size(), 1); 0145 0146 filter.setFieldName(s("operatingCarrierDesignator")); 0147 filter.setPattern(s("AK")); 0148 QVERIFY(filter.matches(root)); 0149 } 0150 }; 0151 0152 QTEST_GUILESS_MAIN(ExtractorFilterTest) 0153 0154 #include "extractorfiltertest.moc"