blob: 26e993b261e9457a669ef3e2e0fd2c8b9e365d9d [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtNfc module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtTest/QtTest>
#include <qndefrecord.h>
#include <qndefnfctextrecord.h>
#include <qndefnfcurirecord.h>
#include <qqmlndefrecord.h>
QT_USE_NAMESPACE
Q_DECLARE_METATYPE(QNdefRecord::TypeNameFormat)
class tst_QNdefRecord : public QObject
{
Q_OBJECT
public:
tst_QNdefRecord();
~tst_QNdefRecord();
private slots:
void tst_record();
void tst_textRecord_data();
void tst_textRecord();
void tst_uriRecord_data();
void tst_uriRecord();
void tst_declarative_record_data();
void tst_declarative_record();
void tst_declarativeChangedSignals();
};
tst_QNdefRecord::tst_QNdefRecord()
{
}
tst_QNdefRecord::~tst_QNdefRecord()
{
}
void tst_QNdefRecord::tst_record()
{
// test empty record
{
QNdefRecord record;
QVERIFY(record.isEmpty());
QCOMPARE(record.typeNameFormat(), QNdefRecord::Empty);
QVERIFY(record.type().isEmpty());
QVERIFY(record.id().isEmpty());
QVERIFY(record.payload().isEmpty());
QVERIFY(!record.isRecordType<QNdefNfcTextRecord>());
QVERIFY(!record.isRecordType<QNdefNfcUriRecord>());
QCOMPARE(record, QNdefRecord());
QVERIFY(!(record != QNdefRecord()));
QQmlNdefRecord declRecord;
QCOMPARE(declRecord.record(), record);
QCOMPARE(declRecord.type(), QString());
QCOMPARE(declRecord.typeNameFormat(), QQmlNdefRecord::Empty);
}
// test type name format
{
QNdefRecord record;
record.setTypeNameFormat(QNdefRecord::Empty);
QCOMPARE(record.typeNameFormat(), QNdefRecord::Empty);
record.setTypeNameFormat(QNdefRecord::NfcRtd);
QCOMPARE(record.typeNameFormat(), QNdefRecord::NfcRtd);
record.setTypeNameFormat(QNdefRecord::Mime);
QCOMPARE(record.typeNameFormat(), QNdefRecord::Mime);
record.setTypeNameFormat(QNdefRecord::Uri);
QCOMPARE(record.typeNameFormat(), QNdefRecord::Uri);
record.setTypeNameFormat(QNdefRecord::ExternalRtd);
QCOMPARE(record.typeNameFormat(), QNdefRecord::ExternalRtd);
record.setTypeNameFormat(QNdefRecord::Unknown);
QCOMPARE(record.typeNameFormat(), QNdefRecord::Unknown);
record.setTypeNameFormat(QNdefRecord::TypeNameFormat(6));
QCOMPARE(record.typeNameFormat(), QNdefRecord::Unknown);
record.setTypeNameFormat(QNdefRecord::TypeNameFormat(7));
QCOMPARE(record.typeNameFormat(), QNdefRecord::Unknown);
}
// test type
{
QNdefRecord record;
record.setType("test type");
QCOMPARE(record.type(), QByteArray("test type"));
}
// test id
{
QNdefRecord record;
record.setId("test id");
QCOMPARE(record.id(), QByteArray("test id"));
}
// test payload
{
QNdefRecord record;
record.setPayload("test payload");
QVERIFY(!record.isEmpty());
QVERIFY(!record.payload().isEmpty());
QCOMPARE(record.payload(), QByteArray("test payload"));
}
// test copy
{
QNdefRecord record;
record.setTypeNameFormat(QNdefRecord::ExternalRtd);
record.setType("qt-project.org:test-rtd");
record.setId("test id");
record.setPayload("test payload");
QNdefRecord ccopy(record);
QCOMPARE(record.typeNameFormat(), ccopy.typeNameFormat());
QCOMPARE(record.type(), ccopy.type());
QCOMPARE(record.id(), ccopy.id());
QCOMPARE(record.payload(), ccopy.payload());
QVERIFY(record == ccopy);
QVERIFY(!(record != ccopy));
QNdefRecord acopy;
acopy = record;
QCOMPARE(record.typeNameFormat(), acopy.typeNameFormat());
QCOMPARE(record.type(), acopy.type());
QCOMPARE(record.id(), acopy.id());
QCOMPARE(record.payload(), acopy.payload());
QVERIFY(record == acopy);
QVERIFY(!(record != acopy));
QVERIFY(record != QNdefRecord());
}
// test comparison
{
QNdefRecord record;
record.setTypeNameFormat(QNdefRecord::ExternalRtd);
record.setType("qt-project.org:test-rtd");
record.setId("test id");
record.setPayload("test payload");
QNdefRecord other;
other.setTypeNameFormat(QNdefRecord::ExternalRtd);
other.setType("qt-project.org:test-other-rtd");
other.setId("test other id");
other.setPayload("test other payload");
QVERIFY(record != other);
}
}
void tst_QNdefRecord::tst_textRecord_data()
{
QTest::addColumn<QString>("locale");
QTest::addColumn<QString>("text");
QTest::addColumn<bool>("utf8");
QTest::addColumn<QByteArray>("payload");
QTest::newRow("en_US utf8") << QString::fromLatin1("en_US")
<< QString::fromLatin1("Test String")
<< true
<< QByteArray::fromHex("05656E5F55535465737420537472696E67");
QTest::newRow("en_US utf16") << QString::fromLatin1("en_US")
<< QString::fromLatin1("Test String")
<< false
<< QByteArray::fromHex("85656E5F5553FEFF005400650073007400200053007400720069006E0067");
QTest::newRow("ja_JP utf8") << QString::fromLatin1("ja_JP")
<< QString::fromUtf8("\343\203\206\343\202\271\343\203\210\346"
"\226\207\345\255\227\345\210\227")
<< true
<< QByteArray::fromHex("056A615F4A50E38386E382B9E38388E69687E5AD97E58897");
QTest::newRow("ja_JP utf16") << QString::fromLatin1("ja_JP")
<< QString::fromUtf8("\343\203\206\343\202\271\343\203\210\346"
"\226\207\345\255\227\345\210\227")
<< false
<< QByteArray::fromHex("856A615F4A50FEFF30C630B930C865875B575217");
}
void tst_QNdefRecord::tst_textRecord()
{
QFETCH(QString, locale);
QFETCH(QString, text);
QFETCH(bool, utf8);
QFETCH(QByteArray, payload);
// test setters
{
QNdefNfcTextRecord record;
record.setLocale(locale);
record.setText(text);
record.setEncoding(utf8 ? QNdefNfcTextRecord::Utf8 : QNdefNfcTextRecord::Utf16);
QCOMPARE(record.payload(), payload);
QVERIFY(record != QNdefRecord());
QQmlNdefRecord declRecord(record);
QCOMPARE(declRecord.record(), QNdefRecord(record));
QCOMPARE(declRecord.type(), QString("T"));
QCOMPARE(declRecord.typeNameFormat(), QQmlNdefRecord::NfcRtd);
}
// test getters
{
QNdefNfcTextRecord record;
record.setPayload(payload);
QCOMPARE(record.locale(), locale);
QCOMPARE(record.text(), text);
QCOMPARE(record.encoding() == QNdefNfcTextRecord::Utf8, utf8);
}
// test copy
{
QNdefRecord record;
record.setTypeNameFormat(QNdefRecord::NfcRtd);
record.setType("T");
record.setPayload(payload);
QVERIFY(!record.isRecordType<QNdefRecord>());
QVERIFY(record.isRecordType<QNdefNfcTextRecord>());
QVERIFY(!record.isRecordType<QNdefNfcUriRecord>());
QNdefNfcTextRecord textRecord(record);
QVERIFY(!textRecord.isEmpty());
QVERIFY(record == textRecord);
QCOMPARE(textRecord.locale(), locale);
QCOMPARE(textRecord.text(), text);
QCOMPARE(textRecord.encoding() == QNdefNfcTextRecord::Utf8, utf8);
}
}
void tst_QNdefRecord::tst_uriRecord_data()
{
QTest::addColumn<QString>("url");
QTest::addColumn<QByteArray>("payload");
QTest::newRow("http") << QString::fromLatin1("http://qt-project.org/")
<< QByteArray::fromHex("0371742d70726f6a6563742e6f72672f");
QTest::newRow("tel") << QString::fromLatin1("tel:+1234567890")
<< QByteArray::fromHex("052B31323334353637383930");
QTest::newRow("mailto") << QString::fromLatin1("mailto:test@example.com")
<< QByteArray::fromHex("0674657374406578616D706C652E636F6D");
QTest::newRow("urn") << QString::fromLatin1("urn:nfc:ext:qt-project.org:test")
<< QByteArray::fromHex("136E66633A6578743A71742D70726F6A6563742E6F72673A74657374");
}
void tst_QNdefRecord::tst_uriRecord()
{
QFETCH(QString, url);
QFETCH(QByteArray, payload);
// test setters
{
QNdefNfcUriRecord record;
record.setUri(QUrl(url));
QCOMPARE(record.payload(), payload);
QVERIFY(record != QNdefRecord());
QQmlNdefRecord declRecord(record);
QCOMPARE(declRecord.record(), QNdefRecord(record));
QCOMPARE(declRecord.type(), QString("U"));
QCOMPARE(declRecord.typeNameFormat(), QQmlNdefRecord::NfcRtd);
}
// test getters
{
QNdefNfcUriRecord record;
record.setPayload(payload);
QCOMPARE(record.uri(), QUrl(url));
}
// test copy
{
QNdefRecord record;
record.setTypeNameFormat(QNdefRecord::NfcRtd);
record.setType("U");
record.setPayload(payload);
QVERIFY(!record.isRecordType<QNdefRecord>());
QVERIFY(!record.isRecordType<QNdefNfcTextRecord>());
QVERIFY(record.isRecordType<QNdefNfcUriRecord>());
QNdefNfcUriRecord uriRecord(record);
QVERIFY(!uriRecord.isEmpty());
QVERIFY(record == uriRecord);
QCOMPARE(uriRecord.uri(), QUrl(url));
}
}
void tst_QNdefRecord::tst_declarative_record_data()
{
QTest::addColumn<QNdefRecord::TypeNameFormat>("typeNameFormat");
QTest::addColumn<QByteArray>("type");
QTest::newRow("NfcRtd:U") << QNdefRecord::NfcRtd << QByteArray("U");
QTest::newRow("NfcRtd:T") << QNdefRecord::NfcRtd << QByteArray("T");
QTest::newRow("Empty:BLAH") << QNdefRecord::Empty << QByteArray("BLAH");
QTest::newRow("Empty") << QNdefRecord::Empty << QByteArray("");
QTest::newRow("Unknown") << QNdefRecord::Unknown << QByteArray("BLAHfoo");
QTest::newRow("Mime") << QNdefRecord::Mime << QByteArray("foobar");
QTest::newRow("ExternalRtd") << QNdefRecord::ExternalRtd << QByteArray("");
}
void tst_QNdefRecord::tst_declarative_record()
{
QFETCH(QNdefRecord::TypeNameFormat, typeNameFormat);
QFETCH(QByteArray, type);
{
QNdefRecord record;
record.setTypeNameFormat(typeNameFormat);
record.setType(type);
QCOMPARE(record.typeNameFormat(), typeNameFormat);
QCOMPARE(record.type(), type);
QQmlNdefRecord declRecord(record);
QCOMPARE(declRecord.record(), record);
QCOMPARE(declRecord.record().typeNameFormat(), typeNameFormat);
QCOMPARE(declRecord.record().type(), type);
QCOMPARE(declRecord.type(), QString(type));
QCOMPARE(declRecord.typeNameFormat(), static_cast<QQmlNdefRecord::TypeNameFormat>(typeNameFormat));
QQmlNdefRecord declRecord2;
declRecord2.setRecord(record);
QCOMPARE(declRecord2.record(), record);
QCOMPARE(declRecord2.record().typeNameFormat(), typeNameFormat);
QCOMPARE(declRecord2.record().type(), type);
QCOMPARE(declRecord2.type(), QString(type));
QCOMPARE(declRecord2.typeNameFormat(), static_cast<QQmlNdefRecord::TypeNameFormat>(typeNameFormat));
QQmlNdefRecord declRecord3;
declRecord3.setTypeNameFormat((QQmlNdefRecord::TypeNameFormat)typeNameFormat);
declRecord3.setType(type);
QCOMPARE(declRecord3.type(), QString(type));
QCOMPARE(declRecord3.record().typeNameFormat(), typeNameFormat);
QCOMPARE(declRecord3.record().type(), type);
QCOMPARE(declRecord3.typeNameFormat(), static_cast<QQmlNdefRecord::TypeNameFormat>(typeNameFormat));
}
}
void tst_QNdefRecord::tst_declarativeChangedSignals()
{
QQmlNdefRecord record;
QSignalSpy typeSpy(&record, SIGNAL(typeChanged()));
QSignalSpy tnfSpy(&record, SIGNAL(typeNameFormatChanged()));
QSignalSpy recordSpy(&record, SIGNAL(recordChanged()));
QCOMPARE(typeSpy.count(), 0);
QCOMPARE(recordSpy.count(), 0);
record.setType("U");
record.setTypeNameFormat(QQmlNdefRecord::NfcRtd);
QCOMPARE(typeSpy.count(), 1);
QCOMPARE(tnfSpy.count(), 1);
QCOMPARE(recordSpy.count(), 0);
QCOMPARE(record.type(), QString("U"));
QCOMPARE(record.record().type(), QByteArray("U"));
QCOMPARE(record.record().typeNameFormat(), QNdefRecord::NfcRtd);
QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::NfcRtd);
record.setType("U"); //same value, no signal
QCOMPARE(typeSpy.count(), 1);
QCOMPARE(tnfSpy.count(), 1);
QCOMPARE(recordSpy.count(), 0);
QCOMPARE(record.type(), QString("U"));
QCOMPARE(record.record().type(), QByteArray("U"));
QCOMPARE(record.record().typeNameFormat(), QNdefRecord::NfcRtd);
QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::NfcRtd);
record.setType("blah");
record.setType("blah2");
record.setTypeNameFormat(QQmlNdefRecord::ExternalRtd);
QCOMPARE(typeSpy.count(), 3);
QCOMPARE(tnfSpy.count(), 2);
QCOMPARE(recordSpy.count(), 0);
QCOMPARE(record.type(), QString("blah2"));
QCOMPARE(record.record().type(), QByteArray("blah2"));
QCOMPARE(record.record().typeNameFormat(), QNdefRecord::ExternalRtd);
QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::ExternalRtd);
record.setType("Rubbish");
QCOMPARE(typeSpy.count(), 4);
QCOMPARE(tnfSpy.count(), 2);
QCOMPARE(recordSpy.count(), 0);
QCOMPARE(record.type(), QString("Rubbish"));
QCOMPARE(record.record().type(), QByteArray("Rubbish"));
QCOMPARE(record.record().typeNameFormat(), QNdefRecord::ExternalRtd);
QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::ExternalRtd);
record.setType("QQQQ");
record.setTypeNameFormat(QQmlNdefRecord::Mime);
QCOMPARE(typeSpy.count(), 5);
QCOMPARE(tnfSpy.count(), 3);
QCOMPARE(recordSpy.count(), 0);
QCOMPARE(record.type(), QString("QQQQ"));
QCOMPARE(record.record().type(), QByteArray("QQQQ"));
QCOMPARE(record.record().typeNameFormat(), QNdefRecord::Mime);
QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::Mime);
record.setRecord(QNdefRecord());
QCOMPARE(typeSpy.count(), 5); //setting record -> no recordChanged signal
QCOMPARE(tnfSpy.count(), 3);
QCOMPARE(recordSpy.count(), 1);
QCOMPARE(record.type(), QString(""));
QCOMPARE(record.record().type(), QByteArray());
QCOMPARE(record.record().typeNameFormat(), QNdefRecord::Empty);
QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::Empty);
}
QTEST_MAIN(tst_QNdefRecord)
#include "tst_qndefrecord.moc"