summaryrefslogtreecommitdiffstats
path: root/tests/auto/qndeffilter/tst_qndeffilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qndeffilter/tst_qndeffilter.cpp')
-rw-r--r--tests/auto/qndeffilter/tst_qndeffilter.cpp485
1 files changed, 485 insertions, 0 deletions
diff --git a/tests/auto/qndeffilter/tst_qndeffilter.cpp b/tests/auto/qndeffilter/tst_qndeffilter.cpp
new file mode 100644
index 00000000..90493e42
--- /dev/null
+++ b/tests/auto/qndeffilter/tst_qndeffilter.cpp
@@ -0,0 +1,485 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QTest>
+
+#include <QNdefFilter>
+#include <QNdefNfcSmartPosterRecord>
+#include <QNdefNfcTextRecord>
+#include <QNdefNfcUriRecord>
+#include <QNdefMessage>
+
+QT_USE_NAMESPACE
+
+class tst_QNdefFilter : public QObject
+{
+ Q_OBJECT
+private slots:
+ void construct();
+ void copyConstruct();
+ void assingmentOperator();
+
+ void clearFilter();
+
+ void orderMatch();
+
+ void appendRecord();
+ void appendRecord_data();
+
+ void appendRecordParameters();
+ void appendRecordParameters_data();
+
+ void appendRecordTemplate();
+ void appendRecordTemplate_data();
+
+ void match();
+ void match_data();
+};
+
+void tst_QNdefFilter::construct()
+{
+ QNdefFilter filter;
+ QCOMPARE(filter.recordCount(), 0);
+ QCOMPARE(filter.orderMatch(), false);
+}
+
+void tst_QNdefFilter::copyConstruct()
+{
+ QNdefFilter filter;
+ filter.setOrderMatch(true);
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 1);
+
+ QNdefFilter filterCopy(filter);
+ QCOMPARE(filterCopy.orderMatch(), true);
+ QCOMPARE(filterCopy.recordCount(), 2);
+ QNdefFilter::Record rec = filterCopy.recordAt(1);
+ QCOMPARE(rec.typeNameFormat, QNdefRecord::Empty);
+ QCOMPARE(rec.type, QByteArray());
+ QCOMPARE(rec.minimum, 0U);
+ QCOMPARE(rec.maximum, 1U);
+}
+
+void tst_QNdefFilter::assingmentOperator()
+{
+ QNdefFilter filter;
+ filter.setOrderMatch(true);
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 1);
+
+ QNdefFilter filterCopy;
+ filterCopy = filter;
+
+ QCOMPARE(filterCopy.orderMatch(), true);
+ QCOMPARE(filterCopy.recordCount(), 2);
+ QNdefFilter::Record rec = filterCopy.recordAt(1);
+ QCOMPARE(rec.typeNameFormat, QNdefRecord::Empty);
+ QCOMPARE(rec.type, QByteArray());
+ QCOMPARE(rec.minimum, 0U);
+ QCOMPARE(rec.maximum, 1U);
+}
+
+void tst_QNdefFilter::clearFilter()
+{
+ QNdefFilter filter;
+ filter.setOrderMatch(true);
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 1);
+
+ filter.clear();
+
+ QCOMPARE(filter.orderMatch(), false);
+ QCOMPARE(filter.recordCount(), 0);
+}
+
+void tst_QNdefFilter::orderMatch()
+{
+ QNdefFilter filter;
+ QCOMPARE(filter.orderMatch(), false);
+
+ filter.setOrderMatch(true);
+ QCOMPARE(filter.orderMatch(), true);
+
+ filter.setOrderMatch(false);
+ QCOMPARE(filter.orderMatch(), false);
+}
+
+void tst_QNdefFilter::appendRecord()
+{
+ QFETCH(QNdefRecord::TypeNameFormat, typeNameFormat);
+ QFETCH(QByteArray, type);
+ QFETCH(unsigned int, minimum);
+ QFETCH(unsigned int, maximum);
+ QFETCH(bool, result);
+
+ QNdefFilter filter;
+
+ const QNdefFilter::Record record { typeNameFormat, type, minimum, maximum };
+ QVERIFY(filter.appendRecord(record) == result);
+ const int desiredRecordCount = result ? 1 : 0;
+ QCOMPARE(filter.recordCount(), desiredRecordCount);
+}
+
+void tst_QNdefFilter::appendRecord_data()
+{
+ QTest::addColumn<QNdefRecord::TypeNameFormat>("typeNameFormat");
+ QTest::addColumn<QByteArray>("type");
+ QTest::addColumn<unsigned int>("minimum");
+ QTest::addColumn<unsigned int>("maximum");
+ QTest::addColumn<bool>("result");
+
+ constexpr struct {
+ const char *type;
+ QNdefRecord::TypeNameFormat format;
+ } inputs[] = {
+ { "Empty", QNdefRecord::Empty },
+ { "NfcRtd", QNdefRecord::NfcRtd },
+ { "Mime", QNdefRecord::Mime },
+ { "Uri", QNdefRecord::Uri},
+ { "ExternalRtd", QNdefRecord::ExternalRtd },
+ { "Unknown", QNdefRecord::Unknown }
+ };
+
+ for (auto [typeC, format] : inputs) {
+ const auto type = QByteArray::fromRawData(typeC, strlen(typeC));
+ QTest::addRow("%s; min < max", typeC) << format << type << 1u << 2u << true;
+ QTest::addRow("%s; min == max", typeC) << format << type << 2u << 2u << true;
+ QTest::addRow("%s; min > max", typeC) << format << type << 2u << 1u << false;
+ }
+}
+
+void tst_QNdefFilter::appendRecordParameters()
+{
+ QFETCH(QNdefRecord::TypeNameFormat, typeNameFormat);
+ QFETCH(QByteArray, type);
+ QFETCH(unsigned int, minimum);
+ QFETCH(unsigned int, maximum);
+ QFETCH(bool, result);
+
+ QNdefFilter filter;
+
+ QVERIFY(filter.appendRecord(typeNameFormat, type, minimum, maximum) == result);
+ const int desiredRecordCount = result ? 1 : 0;
+ QCOMPARE(filter.recordCount(), desiredRecordCount);
+}
+
+void tst_QNdefFilter::appendRecordParameters_data()
+{
+ appendRecord_data();
+}
+
+void tst_QNdefFilter::appendRecordTemplate()
+{
+ QFETCH(QByteArray, type);
+ QFETCH(unsigned int, minimum);
+ QFETCH(unsigned int, maximum);
+ QFETCH(bool, result);
+
+ QNdefFilter filter;
+ if (type == QByteArray("SmartPoster"))
+ QVERIFY(filter.appendRecord<QNdefNfcSmartPosterRecord>(minimum, maximum) == result);
+ else if (type == QByteArray("Text"))
+ QVERIFY(filter.appendRecord<QNdefNfcTextRecord>(minimum, maximum) == result);
+ else if (type == QByteArray("Uri"))
+ QVERIFY(filter.appendRecord<QNdefNfcUriRecord>(minimum, maximum) == result);
+
+ const int desiredRecordCount = result ? 1 : 0;
+ QCOMPARE(filter.recordCount(), desiredRecordCount);
+}
+
+void tst_QNdefFilter::appendRecordTemplate_data()
+{
+ QTest::addColumn<QByteArray>("type");
+ QTest::addColumn<unsigned int>("minimum");
+ QTest::addColumn<unsigned int>("maximum");
+ QTest::addColumn<bool>("result");
+
+ const QList<QByteArray> types {"SmartPoster", "Text", "Uri"};
+ for (const auto &type : types) {
+ QTest::newRow(type + "; min < max") << type << 1u << 2u << true;
+ QTest::newRow(type + "; min == max") << type << 2u << 2u << true;
+ QTest::newRow(type + "; min > max") << type << 2u << 1u << false;
+ }
+}
+
+void tst_QNdefFilter::match()
+{
+ QFETCH(QNdefFilter, filter);
+ QFETCH(QNdefMessage, message);
+ QFETCH(bool, result);
+
+ QCOMPARE(filter.match(message), result);
+}
+
+void tst_QNdefFilter::match_data()
+{
+ QTest::addColumn<QNdefFilter>("filter");
+ QTest::addColumn<QNdefMessage>("message");
+ QTest::addColumn<bool>("result");
+
+ QNdefFilter filter;
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Mime, "image/png", 1, 1);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 100);
+
+ QNdefNfcTextRecord textRec;
+ textRec.setPayload("text");
+
+ QNdefRecord mimeRec;
+ mimeRec.setTypeNameFormat(QNdefRecord::Mime);
+ mimeRec.setType("image/png");
+ mimeRec.setPayload("some image should be here");
+
+ QNdefRecord emptyRec;
+ emptyRec.setTypeNameFormat(QNdefRecord::Empty);
+
+ {
+ QTest::addRow("empty filter, empty message, match")
+ << QNdefFilter() << QNdefMessage() << true;
+
+ QNdefMessage message;
+ message.push_back(emptyRec);
+
+ QTest::addRow("empty filter, non-empty message, no match")
+ << QNdefFilter() << message << false;
+
+ QTest::addRow("non-empty filter, empty message, no match")
+ << filter << QNdefMessage() << false;
+
+ QNdefFilter f;
+ f.appendRecord<QNdefNfcUriRecord>(0, 1);
+
+ QTest::addRow("filter with 0 or 1 rec, empty message, match")
+ << f << QNdefMessage() << true;
+
+ QNdefMessage uriMsg;
+ uriMsg.push_back(QNdefNfcUriRecord());
+
+ QTest::addRow("filter with 0 or 1 rec, one record, match") << f << uriMsg << true;
+
+ uriMsg.push_back(QNdefNfcUriRecord());
+
+ QTest::addRow("filter with 0 or 1 rec, too many records, no match") << f << uriMsg << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("No optional records, no ordering, match") << filter << message << true;
+
+ message.push_back(emptyRec);
+ message.push_back(emptyRec);
+
+ QTest::addRow("Multiple records with optional, no ordering, match")
+ << filter << message << true;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Multiple records with optional, with ordering, match")
+ << filter << message << true;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(textRec);
+ message.push_back(emptyRec);
+ message.push_back(textRec);
+
+ QTest::addRow("Random order, no ordering, match") << filter << message << true;
+
+ filter.setOrderMatch(true);
+ QTest::addRow("Random order, with ordering, no match") << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefRecord rec;
+ rec.setTypeNameFormat(QNdefRecord::NfcRtd);
+ rec.setType("image/png");
+ rec.setPayload("borken image with invalid format");
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(rec);
+
+ QTest::addRow("TypeNameFormat mismatch, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+ QTest::addRow("TypeNameFormat mismatch, with ordering, no match")
+ << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefRecord rec;
+ rec.setTypeNameFormat(QNdefRecord::Mime);
+ rec.setType("image/jpeg");
+ rec.setPayload("Good image with invalid type");
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(rec);
+
+ QTest::addRow("Type mismatch, no ordering, no match") << filter << message << false;
+
+ filter.setOrderMatch(true);
+ QTest::addRow("Type mismatch, with ordering, no match") << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(QNdefNfcUriRecord());
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(emptyRec);
+
+ QTest::addRow("Type not from filter in the beginning, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Type not from filter in the beginning, with ordering, no match")
+ << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(QNdefNfcUriRecord());
+ message.push_back(emptyRec);
+
+ QTest::addRow("Type not from filter in the middle, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Type not from filter in the middle, with ordering, no match")
+ << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(emptyRec);
+ message.push_back(QNdefNfcUriRecord());
+
+ QTest::addRow("Type not from filter in the end, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Type not from filter in the end, with ordering, no match")
+ << filter << message << false;
+ }
+
+ QNdefFilter repeatedFilter;
+ // These 2 consecutive QNdefNfcTextRecord's are the same as
+ // repeatedFilter.appendRecord<QNdefNfcTextRecord>(0, 2);
+ repeatedFilter.appendRecord<QNdefNfcTextRecord>(0, 1);
+ repeatedFilter.appendRecord<QNdefNfcTextRecord>(0, 1);
+ repeatedFilter.appendRecord(QNdefRecord::Mime, "", 1, 1);
+ repeatedFilter.appendRecord<QNdefNfcTextRecord>(1, 1);
+
+ {
+ repeatedFilter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("Filter with repeated type format, no ordering, match")
+ << repeatedFilter << message << true;
+
+ repeatedFilter.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format, with ordering, no match")
+ << repeatedFilter << message << false;
+ }
+
+ {
+ repeatedFilter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(textRec);
+
+ QTest::addRow("Filter with repeated type format 2, no ordering, match")
+ << repeatedFilter << message << true;
+
+ repeatedFilter.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format 2, with ordering, match")
+ << repeatedFilter << message << true;
+ }
+
+ QNdefFilter repeatedFilter2;
+ repeatedFilter2.appendRecord<QNdefNfcTextRecord>(0, 2);
+ repeatedFilter2.appendRecord<QNdefNfcTextRecord>(1, 1);
+ repeatedFilter2.appendRecord(QNdefRecord::Mime, "", 1, 1);
+
+ {
+ repeatedFilter2.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("Filter with repeated type format 3, no ordering, match")
+ << repeatedFilter2 << message << true;
+
+ repeatedFilter2.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format 3, with ordering, match")
+ << repeatedFilter2 << message << true;
+ }
+
+ {
+ repeatedFilter2.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("Filter with repeated type format 4, no ordering, no match")
+ << repeatedFilter2 << message << false;
+
+ repeatedFilter2.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format 4, with ordering, no match")
+ << repeatedFilter2 << message << false;
+ }
+}
+
+QTEST_MAIN(tst_QNdefFilter)
+
+#include "tst_qndeffilter.moc"