diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,7 +44,7 @@ ecm_install_po_files_as_qm(po) endif() - option(BUILD_TESTING "Build and enable unit tests" OFF) + option(BUILD_TESTING "Build and enable unit tests" ON) include(ECMCoverageOption) endif(ECM_FOUND) diff --git a/src/core/ApplicationSettings.h b/src/core/ApplicationSettings.h --- a/src/core/ApplicationSettings.h +++ b/src/core/ApplicationSettings.h @@ -467,6 +467,9 @@ */ Q_INVOKABLE bool useExternalWordset(); +protected: + explicit ApplicationSettings(QObject *parent, QString path); + protected slots: Q_INVOKABLE void notifyShowLockedActivitiesChanged(); @@ -569,7 +572,8 @@ void barHiddenChanged(); private: - + // Repeated code in the constructor of the class + void getConstructor(); // Update in configuration the couple {key, value} in the group. template void updateValueInConfig(const QString& group, const QString& key, const T& value); diff --git a/src/core/ApplicationSettings.cpp b/src/core/ApplicationSettings.cpp --- a/src/core/ApplicationSettings.cpp +++ b/src/core/ApplicationSettings.cpp @@ -92,7 +92,20 @@ m_config(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + "/gcompris/" + GCOMPRIS_APPLICATION_NAME + ".conf", QSettings::IniFormat) { - const QRect &screenSize = QApplication::desktop()->screenGeometry(); + getConstructor(); +} + +ApplicationSettings::ApplicationSettings(QObject *parent, QString path): QObject(parent), + m_baseFontSizeMin(-7), m_baseFontSizeMax(7), + m_fontLetterSpacingMin(0.0), m_fontLetterSpacingMax(8.0), + m_config(path, QSettings::IniFormat) +{ + getConstructor(); +} + +void ApplicationSettings::getConstructor() +{ + const QRect &screenSize = QApplication::desktop()->screenGeometry(); // initialize from settings file or default @@ -168,9 +181,9 @@ m_isBarHidden = false; connect(this, &ApplicationSettings::showLockedActivitiesChanged, this, &ApplicationSettings::notifyShowLockedActivitiesChanged); - connect(this, &ApplicationSettings::audioVoicesEnabledChanged, this, &ApplicationSettings::notifyAudioVoicesEnabledChanged); - connect(this, &ApplicationSettings::audioEffectsEnabledChanged, this, &ApplicationSettings::notifyAudioEffectsEnabledChanged); - connect(this, &ApplicationSettings::fullscreenChanged, this, &ApplicationSettings::notifyFullscreenChanged); + connect(this, &ApplicationSettings::audioVoicesEnabledChanged, this, &ApplicationSettings::notifyAudioVoicesEnabledChanged); + connect(this, &ApplicationSettings::audioEffectsEnabledChanged, this, &ApplicationSettings::notifyAudioEffectsEnabledChanged); + connect(this, &ApplicationSettings::fullscreenChanged, this, &ApplicationSettings::notifyFullscreenChanged); connect(this, &ApplicationSettings::previousHeightChanged, this, &ApplicationSettings::notifyPreviousHeightChanged); connect(this, &ApplicationSettings::previousWidthChanged, this, &ApplicationSettings::notifyPreviousWidthChanged); connect(this, &ApplicationSettings::localeChanged, this, &ApplicationSettings::notifyLocaleChanged); diff --git a/tests/core/ApplicationSettingsTest.cpp b/tests/core/ApplicationSettingsTest.cpp new file mode 100644 --- /dev/null +++ b/tests/core/ApplicationSettingsTest.cpp @@ -0,0 +1,174 @@ +/* GCompris - ApplicationSettingsTest.cpp + * + * Copyright (C) 2018 Himanshu Vishwakarma + * + * Authors: + * Himanshu Vishwakarma + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#include + +#include "src/core/ApplicationSettings.h" + +#define APPLICATION_SETTINGS_TEST_ATTRIBUTE(attributeType, attributeName, accessorName, accessorNameChanged) \ +{ \ + QFETCH(attributeType, attributeName); \ + QSignalSpy spy(&dummyApplicationSettings, &ApplicationSettings::accessorNameChanged); \ + QVERIFY(spy.count() == 0); \ + dummyApplicationSettings.accessorName(attributeName); \ + QVERIFY(spy.count() == 1); \ + QCOMPARE(dummyApplicationSettings.attributeName(), attributeName); \ +} + +class DummyApplicationSettings : public ApplicationSettings +{ +public: + DummyApplicationSettings() : ApplicationSettings(nullptr, QStringLiteral("./DummyApplicationSettingsTest.conf")) + { + ApplicationSettings::setFullscreen(NULL); + ApplicationSettings::setPreviousHeight(NULL); + ApplicationSettings::setPreviousWidth(NULL); + ApplicationSettings::setBaseFontSize(NULL); + } +}; + +class CoreApplicationSettingsTest : public QObject +{ + Q_OBJECT +private slots: + void ApplicationSettingsInitializationTest(); + void ApplicationSettingsTest(); + void ApplicationSettingsTest_data(); + void ActivitySettingsTest(); +}; + +void CoreApplicationSettingsTest::ApplicationSettingsInitializationTest() +{ + ApplicationSettings applicationSettings; + QCOMPARE(applicationSettings.baseFontSizeMin(), -7); + QCOMPARE(applicationSettings.baseFontSizeMax(), 7); + QCOMPARE(applicationSettings.fontLetterSpacingMin(), (qreal)0.0); + QCOMPARE(applicationSettings.fontLetterSpacingMax(), (qreal)8.0); +} + +void CoreApplicationSettingsTest::ApplicationSettingsTest_data() +{ + QTest::addColumn("showLockedActivities"); + QTest::addColumn("isAudioVoicesEnabled"); + QTest::addColumn("isAudioEffectsEnabled"); + QTest::addColumn("previousHeight"); + QTest::addColumn("previousWidth"); + QTest::addColumn("isVirtualKeyboard"); + QTest::addColumn("locale"); + QTest::addColumn("font"); + QTest::addColumn("isEmbeddedFont"); + QTest::addColumn("fontCapitalization"); + QTest::addColumn("fontLetterSpacing"); + QTest::addColumn("isAutomaticDownloadsEnabled"); + QTest::addColumn("filterLevelMin"); + QTest::addColumn("filterLevelMax"); + QTest::addColumn("isDemoMode"); + QTest::addColumn("codeKey"); + QTest::addColumn("isKioskMode"); + QTest::addColumn("sectionVisible"); + QTest::addColumn("wordset"); + QTest::addColumn("downloadServerUrl"); + QTest::addColumn("cachePath"); + QTest::addColumn("exeCount"); + QTest::addColumn("isBarHidden"); + QTest::addColumn("baseFontSize"); + QTest::addColumn("lastGCVersionRan"); + + QTest::newRow("dummySettings1") << true << true << true << (qint32)21 << (qint32)25 << true << "en_EN" << "font1" << true << (quint32)36 << (qreal)2.532 << true << (quint32)26 << (quint32)84 << true << "codeKey1" << true << true << "wordset1" << "downloadServerUrl1" << "cachePath1" << (quint32)48 << true << 7 << 52 ; + QTest::newRow("dummySettings2") << false << false << false << (qint32)20 << (qint32)32 << false << "en_US" << "font2" << false << (quint32)34 <<(qreal)2.3 << false << (quint32)24 << (quint32)80 << false << "codekey2" << false << false << "wordset2" << "downloadServerUrl2" << "cachePath2" << (quint32)44 << false << 5 << 64 ; +} + +void CoreApplicationSettingsTest::ApplicationSettingsTest() +{ + DummyApplicationSettings dummyApplicationSettings; + + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, showLockedActivities, setShowLockedActivities, showLockedActivitiesChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isAudioVoicesEnabled, setIsAudioVoicesEnabled, audioVoicesEnabledChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isAudioEffectsEnabled, setIsAudioEffectsEnabled, audioEffectsEnabledChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(qint32, previousHeight, setPreviousHeight, previousHeightChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(qint32, previousWidth, setPreviousWidth, previousWidthChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isVirtualKeyboard, setVirtualKeyboard, virtualKeyboardChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(QString, locale, setLocale, localeChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(QString, font, setFont, fontChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isEmbeddedFont, setIsEmbeddedFont, embeddedFontChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(quint32, fontCapitalization, setFontCapitalization, fontCapitalizationChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(qreal, fontLetterSpacing, setFontLetterSpacing, fontLetterSpacingChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isAutomaticDownloadsEnabled, setIsAutomaticDownloadsEnabled, automaticDownloadsEnabledChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(quint32, filterLevelMin, setFilterLevelMin, filterLevelMinChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(quint32, filterLevelMax, setFilterLevelMax, filterLevelMaxChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isDemoMode, setDemoMode, demoModeChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(QString, codeKey, setCodeKey, codeKeyChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isKioskMode, setKioskMode, kioskModeChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, sectionVisible, setSectionVisible, sectionVisibleChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(QString, wordset, setWordset, wordsetChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(QString, downloadServerUrl, setDownloadServerUrl, downloadServerUrlChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(QString, cachePath, setCachePath, cachePathChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(quint32, exeCount, setExeCount, exeCountChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(bool, isBarHidden, setBarHidden, barHiddenChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(int, baseFontSize, setBaseFontSize, baseFontSizeChanged); + APPLICATION_SETTINGS_TEST_ATTRIBUTE(int, lastGCVersionRan, setLastGCVersionRan, lastGCVersionRanChanged); +} + +void CoreApplicationSettingsTest::ActivitySettingsTest() +{ + DummyApplicationSettings dummyApplicationSettings; + // Creating a dummyActivity + QString dummyActivity = QStringLiteral("DummyActivity"); + + // By Default the DummyActivity is not favorite + QVERIFY(!dummyApplicationSettings.isFavorite(dummyActivity)); + // Setting Up the DummyActivity as Favorite + dummyApplicationSettings.setFavorite(dummyActivity, true); + QVERIFY(dummyApplicationSettings.isFavorite(dummyActivity)); + // setting Up the DummyActivity as Not favorite + dummyApplicationSettings.setFavorite(dummyActivity, false); + QVERIFY(!dummyApplicationSettings.isFavorite(dummyActivity)); + + // By Default the activity progress is zero + QCOMPARE(dummyApplicationSettings.loadActivityProgress(dummyActivity), 0); + // Saving the Activity Progress + dummyApplicationSettings.saveActivityProgress(dummyActivity, 3); + QCOMPARE(dummyApplicationSettings.loadActivityProgress(dummyActivity), 3); + dummyApplicationSettings.saveActivityProgress(dummyActivity, 10); + QCOMPARE(dummyApplicationSettings.loadActivityProgress(dummyActivity), 10); + dummyApplicationSettings.saveActivityProgress(dummyActivity, 0); + QCOMPARE(dummyApplicationSettings.loadActivityProgress(dummyActivity), 0); + + // By Default the activity + QVariantMap configuration; + configuration.insert(QStringLiteral("DummyKey1"), QStringLiteral("DummyValue1")); + configuration.insert(QStringLiteral("DummyKey2"), QStringLiteral("DummyValue2")); + configuration.insert(QStringLiteral("DummyKey3"), QStringLiteral("DummyValue3")); + configuration.insert(QStringLiteral("DummyKey4"), QStringLiteral("DummyValue4")); + + dummyApplicationSettings.saveActivityConfiguration(dummyActivity, configuration); + QVariantMap newconfiguration = dummyApplicationSettings.loadActivityConfiguration(dummyActivity); + + QCOMPARE(newconfiguration.value(QStringLiteral("DummyKey1")), configuration.value(QStringLiteral("DummyKey1"))); + QCOMPARE(newconfiguration.value(QStringLiteral("DummyKey2")), configuration.value(QStringLiteral("DummyKey2"))); + QCOMPARE(newconfiguration.value(QStringLiteral("DummyKey3")), configuration.value(QStringLiteral("DummyKey3"))); + QCOMPARE(newconfiguration.value(QStringLiteral("DummyKey4")), configuration.value(QStringLiteral("DummyKey4"))); +} + +QTEST_MAIN(CoreApplicationSettingsTest) +#include "ApplicationSettingsTest.moc" + diff --git a/tests/core/CMakeLists.txt b/tests/core/CMakeLists.txt --- a/tests/core/CMakeLists.txt +++ b/tests/core/CMakeLists.txt @@ -9,3 +9,4 @@ ) ecm_add_test(ActivityInfoTest.cpp TEST_NAME CoreActivityInfoTest LINK_LIBRARIES ${CORE_TEST_LIBRARIES}) +ecm_add_test(ApplicationSettingsTest.cpp TEST_NAME CoreApplicationSettingsTest LINK_LIBRARIES ${CORE_TEST_LIBRARIES})