/**************************************************************************** ** ** Copyright (C) 2016 Research In Motion ** 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 #include #include #include #include #include QT_USE_NAMESPACE static const quint8 payload[] = { 0xC1, 0x02, 0x00, 0x00, 0x03, 0x0D, 0x53, 0x70, 0x91, 0x01, 0x08, 0x55, 0x01, 0x72, 0x69, 0x6D, 0x2E, 0x63, 0x6F, 0x6D, 0x11, 0x01, 0x0D, 0x54, 0x02, 0x65, 0x6E, 0x49, 0x63, 0x6F, 0x6E, 0x20, 0x54, 0x69, 0x74, 0x6C, 0x65, 0x11, 0x01, 0x09, 0x74, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x11, 0x01, 0x04, 0x73, 0x00, 0x00, 0x04, 0x00, 0x11, 0x03, 0x01, 0x61, 0x63, 0x74, 0x01, 0x42, 0x09, 0x00, 0x00, 0x02, 0xC5, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x08, 0x02, 0x00, 0x00, 0x00, 0xB4, 0x52, 0x39, 0xF5, 0x00, 0x00, 0x02, 0x8C, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9C, 0x62, 0x60, 0x68, 0x60, 0xA0, 0x11, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0x99, 0xB9, 0x0D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x62, 0x60, 0x60, 0xE8, 0xA6, 0x11, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x82, 0x1A, 0x1D, 0x1B, 0xBB, 0x75, 0xE6, 0xCC, 0x8B, 0x10, 0x34, 0x7F, 0xFE, 0xE5, 0xF2, 0xF2, 0x83, 0x82, 0x82, 0x93, 0x81, 0xE2, 0xF9, 0xF9, 0x7B, 0x81, 0x22, 0x1D, 0x1D, 0x27, 0xE1, 0x1A, 0x3A, 0x3B, 0x4F, 0x02, 0x45, 0x94, 0x94, 0x66, 0x41, 0xB8, 0x69, 0x69, 0x3B, 0xF7, 0xEF, 0x7F, 0x74, 0xF7, 0xEE, 0x87, 0xD5, 0xAB, 0x6F, 0x1A, 0x1B, 0x2F, 0x42, 0x36, 0x1A, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x82, 0x1A, 0x0D, 0x34, 0xEE, 0x3F, 0x06, 0x00, 0x2A, 0x05, 0x6A, 0x83, 0xB3, 0x21, 0x2A, 0xDF, 0xBF, 0xFF, 0x01, 0xE4, 0xBA, 0xB8, 0xAC, 0x02, 0xB2, 0xD7, 0xAF, 0xBF, 0x8D, 0xA9, 0x05, 0x6E, 0x34, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC2, 0x67, 0x34, 0xD0, 0x2D, 0x70, 0xA3, 0xE1, 0x0E, 0x87, 0x1B, 0x1D, 0x1A, 0xBA, 0x09, 0xAE, 0xF2, 0xDD, 0xBB, 0xEF, 0x10, 0x06, 0xC4, 0x4A, 0x08, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x42, 0x31, 0x1A, 0xA8, 0x02, 0xE8, 0x53, 0x7B, 0xFB, 0x15, 0x67, 0xCE, 0xBC, 0x80, 0x28, 0x85, 0x33, 0x80, 0xD6, 0xA0, 0x19, 0x0D, 0x91, 0x82, 0x68, 0x01, 0x8A, 0x4B, 0x4B, 0x4F, 0x5F, 0xB5, 0xEA, 0x06, 0xB2, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x42, 0x37, 0x1A, 0xC2, 0x05, 0xAA, 0x80, 0x98, 0x78, 0xE5, 0xCA, 0x1B, 0xB8, 0xD3, 0x20, 0x46, 0x40, 0x8C, 0x8E, 0x8E, 0xDE, 0x02, 0x11, 0x04, 0xBA, 0x1D, 0x57, 0x34, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC2, 0x6E, 0x34, 0x30, 0xC8, 0x90, 0x8D, 0xBE, 0x7F, 0xFF, 0x03, 0x3C, 0x4C, 0x20, 0x46, 0xD7, 0xD5, 0x1D, 0x81, 0x28, 0xC0, 0x93, 0x42, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC2, 0x6E, 0x34, 0xD0, 0x14, 0x88, 0xCE, 0x0B, 0x17, 0x5E, 0x01, 0xC9, 0xFE, 0xFE, 0x33, 0xF0, 0x30, 0x81, 0x18, 0xDD, 0xD5, 0x75, 0x0A, 0x59, 0x3D, 0x30, 0x39, 0x41, 0x10, 0xB2, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x42, 0x8F, 0x46, 0x60, 0x08, 0x42, 0xDC, 0x08, 0x01, 0x90, 0x68, 0xAC, 0xAF, 0x3F, 0xBA, 0x7B, 0xF7, 0x03, 0x48, 0x98, 0x40, 0x8C, 0x9E, 0x3A, 0xF5, 0x3C, 0x72, 0x04, 0xC0, 0xA3, 0x04, 0x98, 0x2E, 0xE1, 0x46, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC2, 0x97, 0x42, 0x80, 0x6E, 0x87, 0x18, 0x0D, 0x4C, 0xE6, 0xC0, 0xF4, 0x0B, 0x61, 0x10, 0x6F, 0x34, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC2, 0x62, 0x34, 0x50, 0x33, 0x50, 0x0F, 0xD0, 0x2C, 0xA0, 0x38, 0xDC, 0x68, 0xA0, 0x67, 0x21, 0x7E, 0x42, 0x0E, 0x10, 0x78, 0x58, 0x03, 0x23, 0x13, 0xA2, 0x12, 0xD9, 0x68, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC2, 0x1E, 0xD6, 0x70, 0x04, 0x37, 0x1A, 0xCE, 0x86, 0x80, 0xB4, 0xB4, 0x5D, 0xC8, 0xC9, 0x06, 0x88, 0x80, 0x81, 0x86, 0x66, 0x34, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x22, 0xC1, 0x68, 0x60, 0xA6, 0x87, 0x1B, 0x0D, 0x4C, 0x9D, 0x90, 0x6C, 0x02, 0x4C, 0xCB, 0xB8, 0x8C, 0x06, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x22, 0xC1, 0x68, 0x79, 0xF9, 0x99, 0xC8, 0x46, 0xC3, 0x53, 0x11, 0x30, 0xBB, 0x03, 0x15, 0x9C, 0x3F, 0xFF, 0x12, 0xCD, 0x68, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x22, 0xC1, 0x68, 0xE4, 0xE8, 0x02, 0x1A, 0x0D, 0x0C, 0x7D, 0x48, 0xB8, 0x23, 0x03, 0x64, 0xA3, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x22, 0xCD, 0x68, 0x20, 0x03, 0x6E, 0x34, 0x90, 0x0B, 0x2C, 0x12, 0x80, 0x11, 0x0E, 0x37, 0x17, 0x18, 0x38, 0xC8, 0x49, 0x1B, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0x42, 0x79, 0x0D, 0xCC, 0xBA, 0x40, 0x84, 0x91, 0x5F, 0xBA, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0x61, 0xB5, 0x0B, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA2, 0xA1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA3, 0xA1, 0xD1, 0x00, 0x27, 0x58, 0x04, 0x5A, 0x28, 0x87, 0x48, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; class tst_QNdefNfcSmartPosterRecord : public QObject { Q_OBJECT public: tst_QNdefNfcSmartPosterRecord(); ~tst_QNdefNfcSmartPosterRecord(); private: QNdefNfcTextRecord getTextRecord(const QString& locale); QString getTitle(const QString& locale); void checkLocale(const QNdefNfcSmartPosterRecord& record, const QStringList& localeList); QMap _textRecords; private slots: void tst_emptyRecord(); void tst_titles(); void tst_uri(); void tst_action(); void tst_icon(); void tst_size(); void tst_typeInfo(); void tst_construct(); void tst_downcast(); }; tst_QNdefNfcSmartPosterRecord::tst_QNdefNfcSmartPosterRecord() { _textRecords["en"] = "test"; _textRecords["fr"] = "essai"; _textRecords["es"] = "prueba"; _textRecords["de"] = "pruefung"; _textRecords["nl"] = "proef"; _textRecords["en-US"] = "trial"; } tst_QNdefNfcSmartPosterRecord::~tst_QNdefNfcSmartPosterRecord() { } QNdefNfcTextRecord tst_QNdefNfcSmartPosterRecord::getTextRecord(const QString& locale) { QNdefNfcTextRecord record; record.setLocale(locale); record.setEncoding(QNdefNfcTextRecord::Utf8); record.setText(_textRecords[locale]); return record; } QString tst_QNdefNfcSmartPosterRecord::getTitle(const QString& locale) { return _textRecords[locale]; } void tst_QNdefNfcSmartPosterRecord::checkLocale(const QNdefNfcSmartPosterRecord& record, const QStringList& localeList) { QList locales = _textRecords.keys(); for (int i = 0; i < locales.size(); i++) { if (localeList.contains(locales[i])) { QVERIFY(record.hasTitle(locales[i])); } else { QVERIFY(!record.hasTitle(locales[i])); } } if (localeList.empty()) { QVERIFY(record.hasTitle()); } } void tst_QNdefNfcSmartPosterRecord::tst_emptyRecord() { QNdefNfcSmartPosterRecord record; QCOMPARE(record.typeNameFormat(), QNdefRecord::NfcRtd); QCOMPARE(record.type(), QByteArray("Sp")); QVERIFY(record.id().isEmpty()); QVERIFY(record.payload().isEmpty()); QVERIFY(!record.hasTitle()); QVERIFY(!record.hasAction()); QVERIFY(!record.hasIcon()); QVERIFY(!record.hasSize()); QVERIFY(!record.hasTypeInfo()); QCOMPARE(record.titleCount(), 0); QCOMPARE(record.titleRecord(0), QNdefNfcTextRecord()); QCOMPARE(record.title(), QString()); QList emptyTitleList; QCOMPARE(record.titleRecords(), emptyTitleList); QCOMPARE(record.uri(), QUrl()); QCOMPARE(record.uriRecord(), QNdefNfcUriRecord()); QCOMPARE(record.action(), QNdefNfcSmartPosterRecord::UnspecifiedAction); QCOMPARE(record.iconCount(), 0); QCOMPARE(record.iconRecord(0), QNdefNfcIconRecord()); QCOMPARE(record.icon(), QByteArray()); QList emptyIconList; QCOMPARE(record.iconRecords(), emptyIconList); quint32 size = 0; QCOMPARE(record.size(), size); QCOMPARE(record.typeInfo(), QByteArray()); QVERIFY(record.isRecordType()); QVERIFY(!record.isRecordType()); QVERIFY(!record.isRecordType()); QCOMPARE(record, QNdefNfcSmartPosterRecord()); QVERIFY(!(record != QNdefNfcSmartPosterRecord())); } void tst_QNdefNfcSmartPosterRecord::tst_titles() { QNdefNfcSmartPosterRecord record; // Set "en" locale QNdefNfcTextRecord enRecord = getTextRecord("en"); QVERIFY(record.addTitle(enRecord)); QCOMPARE(record.titleCount(), 1); { QStringList locales; locales << "en"; checkLocale(record, locales); } // Get "en" locale QCOMPARE(record.titleRecord(0), enRecord); QCOMPARE(record.title(), getTitle("en")); QCOMPARE(record.title("fr"), QString()); QList titleRecords = record.titleRecords(); QCOMPARE(titleRecords.size(), 1); QCOMPARE(titleRecords[0], enRecord); QVERIFY(!record.addTitle(enRecord)); QCOMPARE(record.titleCount(), 1); // Add "de" locale QNdefNfcTextRecord deRecord = getTextRecord("de"); QVERIFY(record.addTitle(deRecord)); QCOMPARE(record.titleCount(), 2); { QStringList locales; locales << "en" << "de"; checkLocale(record, locales); } // Add "fr" locale QNdefNfcTextRecord frRecord = getTextRecord("fr"); QVERIFY(record.addTitle(frRecord)); QCOMPARE(record.titleCount(), 3); { QStringList locales; locales << "en" << "de" << "fr"; checkLocale(record, locales); } QVERIFY(record.removeTitle(frRecord)); QCOMPARE(record.titleCount(), 2); { QStringList locales; locales << "en" << "de"; checkLocale(record, locales); } QVERIFY(!record.removeTitle(frRecord)); QCOMPARE(record.titleCount(), 2); QVERIFY(record.removeTitle("en")); QCOMPARE(record.titleCount(), 1); { QStringList locales; locales << "de"; checkLocale(record, locales); } titleRecords = record.titleRecords(); QCOMPARE(titleRecords.size(), 1); QCOMPARE(titleRecords[0], deRecord); QCOMPARE(record.title(), getTitle("de")); QVERIFY(record.removeTitle(deRecord)); QCOMPARE(record.titleCount(), 0); // Test setTitles QNdefNfcTextRecord nlRecord = getTextRecord("nl"); QNdefNfcTextRecord esRecord = getTextRecord("es"); QVERIFY(record.addTitle(enRecord)); QVERIFY(record.addTitle(deRecord)); QVERIFY(record.addTitle(frRecord)); QCOMPARE(record.titleCount(), 3); QList titles; titles << nlRecord << esRecord; record.setTitles(titles); QCOMPARE(record.titleCount(), 2); QCOMPARE(record.title("en"), QString()); QCOMPARE(record.title("de"), QString()); QCOMPARE(record.title("fr"), QString()); QCOMPARE(record.title("nl"), getTitle("nl")); QCOMPARE(record.title("es"), getTitle("es")); } void tst_QNdefNfcSmartPosterRecord::tst_uri() { QNdefNfcSmartPosterRecord record; QString qtString = "http://www.qt-project.org"; QString bbString = "http://www.blackberry.com"; QCOMPARE(record.uri(), QUrl()); QCOMPARE(record.uriRecord(), QNdefNfcUriRecord()); QUrl qtUrl(qtString); record.setUri(qtUrl); QCOMPARE(record.uri(), qtUrl); QNdefNfcUriRecord qtRecord; qtRecord.setUri(qtString); QCOMPARE(record.uriRecord(), qtRecord); QNdefNfcUriRecord bbRecord; bbRecord.setUri(bbString); record.setUri(bbRecord); QCOMPARE(record.uri(), QUrl(bbString)); QCOMPARE(record.uriRecord(), bbRecord); } void tst_QNdefNfcSmartPosterRecord::tst_action() { QNdefNfcSmartPosterRecord record; record.setAction(QNdefNfcSmartPosterRecord::DoAction); QVERIFY(record.hasAction()); QCOMPARE(record.action(), QNdefNfcSmartPosterRecord::DoAction); record.setAction(QNdefNfcSmartPosterRecord::SaveAction); QVERIFY(record.hasAction()); QCOMPARE(record.action(), QNdefNfcSmartPosterRecord::SaveAction); record.setAction(QNdefNfcSmartPosterRecord::UnspecifiedAction); QVERIFY(record.hasAction()); QCOMPARE(record.action(), QNdefNfcSmartPosterRecord::UnspecifiedAction); } void tst_QNdefNfcSmartPosterRecord::tst_icon() { QNdefNfcSmartPosterRecord record; QNdefNfcIconRecord icon; record.addIcon(icon); QVERIFY(record.hasIcon()); QCOMPARE(record.iconCount(), 1); QCOMPARE(record.iconRecord(0), icon); QCOMPARE(record.icon(), QByteArray()); QList iconRecords = record.iconRecords(); QCOMPARE(iconRecords.size(), 1); QCOMPARE(iconRecords[0], icon); QVERIFY(record.removeIcon(QByteArray())); QVERIFY(!record.hasIcon()); QCOMPARE(record.iconCount(), 0); QByteArray mimeType = "test/data"; record.addIcon(mimeType, "icondata"); QVERIFY(record.hasIcon()); QVERIFY(record.hasIcon(mimeType)); QVERIFY(!record.hasIcon(QByteArray("mime"))); QCOMPARE(record.iconCount(), 1); QCOMPARE(record.icon(), QByteArray("icondata")); QCOMPARE(record.icon(mimeType), QByteArray("icondata")); QNdefNfcIconRecord icon2; icon2.setData("iconrecorddata"); icon2.setType("test/icon"); record.addIcon(icon2); QVERIFY(record.hasIcon(QByteArray("test/icon"))); QCOMPARE(record.iconCount(), 2); QCOMPARE(record.icon("test/icon"), QByteArray("iconrecorddata")); iconRecords = record.iconRecords(); QCOMPARE(iconRecords.size(), 2); QNdefNfcIconRecord icon3; icon3.setData("icondata"); icon3.setType("test/data"); QCOMPARE(iconRecords[0], icon3); QCOMPARE(iconRecords[1], icon2); QVERIFY(record.removeIcon(mimeType)); QCOMPARE(record.iconCount(), 1); iconRecords = record.iconRecords(); QCOMPARE(iconRecords.size(), 1); QCOMPARE(iconRecords[0], icon2); QList iconList; QNdefNfcIconRecord testIcon; testIcon.setData("testicondata"); testIcon.setType("test/data"); iconList << testIcon; record.setIcons(iconList); QCOMPARE(record.iconCount(), 1); iconRecords = record.iconRecords(); QCOMPARE(iconRecords.size(), 1); QCOMPARE(iconRecords[0], testIcon); } void tst_QNdefNfcSmartPosterRecord::tst_size() { QNdefNfcSmartPosterRecord record; quint32 size = 1024; record.setSize(size); QCOMPARE(record.size(), size); QVERIFY(record.hasSize()); size = 0; record.setSize(size); QCOMPARE(record.size(), size); QVERIFY(record.hasSize()); } void tst_QNdefNfcSmartPosterRecord::tst_typeInfo() { QNdefNfcSmartPosterRecord record; QByteArray typeInfo("typeinfo"); record.setTypeInfo(typeInfo); QCOMPARE(record.typeInfo(), typeInfo); QVERIFY(record.hasTypeInfo()); typeInfo = "moreinfo"; record.setTypeInfo(typeInfo); QCOMPARE(record.typeInfo(), typeInfo); QVERIFY(record.hasTypeInfo()); } void tst_QNdefNfcSmartPosterRecord::tst_construct() { QByteArray data((char *)payload, sizeof(payload)); QNdefMessage ndefMessage = QNdefMessage::fromByteArray(data); QCOMPARE(ndefMessage.size(), 1); QNdefRecord record = ndefMessage[0]; QVERIFY(record.isRecordType()); // Construct a SP record from a standard QNdefRecord QNdefNfcSmartPosterRecord sprecord(record); QCOMPARE(sprecord.typeNameFormat(), record.typeNameFormat()); QCOMPARE(sprecord.type(), record.type()); QCOMPARE(sprecord.payload(), record.payload()); QVERIFY(sprecord.hasTitle("en")); QCOMPARE(sprecord.title("en"), QString("Icon Title")); QCOMPARE(sprecord.titleCount(), 1); QList titleRecords = sprecord.titleRecords(); QCOMPARE(titleRecords[0].text(), QString("Icon Title")); QCOMPARE(titleRecords[0].locale(), QString("en")); QCOMPARE(sprecord.uri(), QUrl("http://www.rim.com")); QVERIFY(sprecord.hasAction()); QCOMPARE(sprecord.action(), QNdefNfcSmartPosterRecord::SaveAction); QByteArray mimeType = "image/png"; QVERIFY(sprecord.hasIcon()); QVERIFY(sprecord.hasIcon(mimeType)); QCOMPARE(sprecord.iconCount(), 1); QList iconRecords = sprecord.iconRecords(); QCOMPARE(iconRecords.size(), 1); QCOMPARE(iconRecords[0].type(), mimeType); QVERIFY(!iconRecords[0].data().isEmpty()); QVERIFY(iconRecords.value(1).type().isEmpty()); QVERIFY(iconRecords.value(1).data().isEmpty()); QVERIFY(sprecord.hasSize()); quint32 size = 1024; QCOMPARE(sprecord.size(), size); QVERIFY(sprecord.hasTypeInfo()); QCOMPARE(sprecord.typeInfo(), QByteArray("text/html")); QVERIFY(record == sprecord); QVERIFY(!(record != sprecord)); } void tst_QNdefNfcSmartPosterRecord::tst_downcast() { QByteArray data((char *)payload, sizeof(payload)); QNdefMessage ndefMessage = QNdefMessage::fromByteArray(data); QCOMPARE(ndefMessage.size(), 1); QNdefRecord record = ndefMessage[0]; QVERIFY(record.isRecordType()); // Trying to downcast a QNdefRecord to a QNdefNfcSmartPosterRecord causes // an exception because a QNdefRecord does not contain the shared private data. // So first need to create a real QNdefNfcSmartPosterRecord and refer to it via its base QNdefNfcSmartPosterRecord sprecord(record); QNdefRecord *pRecord = (QNdefRecord *)&sprecord; QVERIFY(pRecord->isRecordType()); QCOMPARE(pRecord->typeNameFormat(), sprecord.typeNameFormat()); QCOMPARE(pRecord->type(), sprecord.type()); QCOMPARE(pRecord->payload(), sprecord.payload()); QCOMPARE(pRecord->typeNameFormat(), record.typeNameFormat()); QCOMPARE(pRecord->type(), record.type()); QCOMPARE(pRecord->payload(), record.payload()); // Add another title QNdefNfcTextRecord esRecord = getTextRecord("es"); QVERIFY(sprecord.addTitle(esRecord)); QCOMPARE(sprecord.titleCount(), 2); { QStringList locales; locales << "en" << "es"; checkLocale(sprecord, locales); } // Now make sure the base and SP record's payloads are the same QByteArray basePayload = pRecord->payload(); QByteArray spPayload = sprecord.payload(); // Check length is longer on the base QVERIFY(basePayload.length() > record.payload().length()); // Check the payloads are the same QCOMPARE(basePayload, spPayload); } QTEST_MAIN(tst_QNdefNfcSmartPosterRecord) #include "tst_qndefnfcsmartposterrecord.moc"