File indexing completed on 2024-03-24 15:26:17

0001 /*
0002     SPDX-FileCopyrightText: 2016 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 // test object
0008 #include <kaboutdata.h>
0009 // Qt
0010 #include <QObject>
0011 #include <QTest>
0012 
0013 // Separate test for reading & setting applicationData
0014 // to ensure a separate process where no other test case has
0015 // directly or indirectly called KAboutData::setApplicationData before
0016 // and thus created the global KAboutData object
0017 class KAboutDataApplicationDataTest : public QObject
0018 {
0019     Q_OBJECT
0020 
0021 private Q_SLOTS:
0022     void testInteractionWithQApplicationData();
0023 #if KCOREADDONS_BUILD_DEPRECATED_SINCE(5, 76)
0024     void testRegisterPluginData();
0025 #endif
0026 };
0027 
0028 static const char AppName[] = "app";
0029 static const char ProgramName[] = "ProgramName";
0030 static const char Version[] = "Version";
0031 static const char OrganizationDomain[] = "no.where";
0032 static const char DesktopFileName[] = "org.kde.someapp";
0033 
0034 static const char AppName2[] = "otherapp";
0035 static const char ProgramName2[] = "OtherProgramName";
0036 static const char Version2[] = "OtherVersion";
0037 static const char OrganizationDomain2[] = "other.no.where";
0038 static const char DesktopFileName2[] = "org.kde.otherapp";
0039 
0040 void KAboutDataApplicationDataTest::testInteractionWithQApplicationData()
0041 {
0042     // init the app metadata the Qt way
0043     QCoreApplication *app = QCoreApplication::instance();
0044     app->setApplicationName(QLatin1String(AppName));
0045     app->setProperty("applicationDisplayName", QLatin1String(ProgramName));
0046     app->setApplicationVersion(QLatin1String(Version));
0047     app->setOrganizationDomain(QLatin1String(OrganizationDomain));
0048     app->setProperty("desktopFileName", QLatin1String(DesktopFileName));
0049 
0050     // without setting before, get KAboutData::applicationData
0051     const KAboutData applicationAboutData = KAboutData::applicationData();
0052 
0053     // should be initialized with Q*Application metadata
0054     QCOMPARE(applicationAboutData.componentName(), QLatin1String(AppName));
0055     QCOMPARE(applicationAboutData.displayName(), QLatin1String(ProgramName));
0056     QCOMPARE(applicationAboutData.organizationDomain(), QLatin1String(OrganizationDomain));
0057     QCOMPARE(applicationAboutData.version(), QLatin1String(Version));
0058     QCOMPARE(applicationAboutData.desktopFileName(), QLatin1String(DesktopFileName));
0059 
0060     // now set some new KAboutData, with different values
0061     KAboutData aboutData2(QString::fromLatin1(AppName2), QString::fromLatin1(ProgramName2), QString::fromLatin1(Version2));
0062     aboutData2.setOrganizationDomain(OrganizationDomain2);
0063     aboutData2.setDesktopFileName(QLatin1String(DesktopFileName2));
0064 
0065     KAboutData::setApplicationData(aboutData2);
0066 
0067     // check that Q*Application metadata has been updated, as expected per API definition
0068     QCOMPARE(app->applicationName(), QLatin1String(AppName2));
0069     QCOMPARE(app->property("applicationDisplayName").toString(), QLatin1String(ProgramName2));
0070     QCOMPARE(app->organizationDomain(), QLatin1String(OrganizationDomain2));
0071     QCOMPARE(app->applicationVersion(), QLatin1String(Version2));
0072     QCOMPARE(app->property("desktopFileName").toString(), QLatin1String(DesktopFileName2));
0073 
0074     // and check as well KAboutData::applicationData itself
0075     const KAboutData applicationAboutData2 = KAboutData::applicationData();
0076 
0077     QCOMPARE(applicationAboutData2.componentName(), QLatin1String(AppName2));
0078     QCOMPARE(applicationAboutData2.displayName(), QLatin1String(ProgramName2));
0079     QCOMPARE(applicationAboutData2.organizationDomain(), QLatin1String(OrganizationDomain2));
0080     QCOMPARE(applicationAboutData2.version(), QLatin1String(Version2));
0081     QCOMPARE(applicationAboutData2.desktopFileName(), QLatin1String(DesktopFileName2));
0082 }
0083 
0084 #if KCOREADDONS_BUILD_DEPRECATED_SINCE(5, 76)
0085 void KAboutDataApplicationDataTest::testRegisterPluginData()
0086 {
0087     for (const auto &name : {QStringLiteral("foo"), QStringLiteral("bar")}) {
0088         QVERIFY(!KAboutData::pluginData(name));
0089         KAboutData::registerPluginData(KAboutData(name));
0090 
0091         auto v1 = KAboutData::pluginData(name);
0092         QVERIFY(v1);
0093         QCOMPARE(v1->componentName(), name);
0094 
0095         // re-registering will overwrite and not trigger memory leaks (check LSAN)
0096         KAboutData::registerPluginData(KAboutData(name));
0097 
0098         // the pointer staid the same, as QHash is node based
0099         QCOMPARE(KAboutData::pluginData(name), v1);
0100     }
0101 }
0102 #endif
0103 
0104 QTEST_MAIN(KAboutDataApplicationDataTest)
0105 
0106 #include "kaboutdataapplicationdatatest.moc"