// Copyright (C) Oleg Shparber, et al. // SPDX-License-Identifier: GPL-3.0-or-later #include "../plist.h" #include using namespace Zeal::Util; class PlistTest : public QObject { Q_OBJECT private slots: void initTestCase(); void testReadsKeys(); void testLeadingNewline(); void testLeadingIndentation(); void testByteOrderMark(); void testMalformedContent(); void testMissingFile(); private: QString writePlist(const QByteArray &data); QTemporaryDir m_dir; int m_counter = 0; }; namespace { const QByteArray Body = QByteArrayLiteral("\n" "\n" "\n" " \n" " CFBundleName\n" " Android KTX\n" " isDashDocset\n" " \n" " isJavaScriptEnabled\n" " \n" " \n" "\n"); } // namespace QString PlistTest::writePlist(const QByteArray &data) { const QString path = m_dir.filePath(QStringLiteral("Info%1.plist").arg(++m_counter)); QFile file(path); if (!file.open(QIODevice::WriteOnly) || file.write(data) != data.size()) { return {}; } return path; } void PlistTest::initTestCase() { QVERIFY(m_dir.isValid()); } void PlistTest::testReadsKeys() { Plist plist; QVERIFY(plist.read(writePlist(Body))); QVERIFY(!plist.hasError()); QCOMPARE(plist.value(QStringLiteral("CFBundleName")), QVariant(QStringLiteral("Android KTX"))); QCOMPARE(plist.value(QStringLiteral("isDashDocset")), QVariant(true)); QCOMPARE(plist.value(QStringLiteral("isJavaScriptEnabled")), QVariant(false)); } // See: https://github.com/zealdocs/zeal/issues/1949 void PlistTest::testLeadingNewline() { Plist plist; QVERIFY(plist.read(writePlist(QByteArrayLiteral("\n") + Body))); QVERIFY(!plist.hasError()); QCOMPARE(plist[QStringLiteral("CFBundleName")].toString(), QStringLiteral("Android KTX")); } void PlistTest::testLeadingIndentation() { Plist plist; QVERIFY(plist.read(writePlist(QByteArrayLiteral("\n ") + Body))); QVERIFY(!plist.hasError()); QCOMPARE(plist[QStringLiteral("CFBundleName")].toString(), QStringLiteral("Android KTX")); } void PlistTest::testByteOrderMark() { Plist plist; QVERIFY(plist.read(writePlist(QByteArrayLiteral("\xEF\xBB\xBF") + Body))); QVERIFY(!plist.hasError()); QCOMPARE(plist[QStringLiteral("CFBundleName")].toString(), QStringLiteral("Android KTX")); } void PlistTest::testMalformedContent() { const QString path = writePlist(QByteArrayLiteral("CFBundleName")); QVERIFY(!path.isEmpty()); Plist plist; QVERIFY(!plist.read(path)); QVERIFY(plist.hasError()); } void PlistTest::testMissingFile() { Plist plist; QVERIFY(!plist.read(m_dir.filePath(QStringLiteral("Missing.plist")))); QVERIFY(plist.hasError()); } QTEST_GUILESS_MAIN(PlistTest) #include "plist_test.moc"