diff --git a/tests/core/ActivityInfoTest.cpp b/tests/core/ActivityInfoTest.cpp index 6f050e274..ae426f902 100644 --- a/tests/core/ActivityInfoTest.cpp +++ b/tests/core/ActivityInfoTest.cpp @@ -1,149 +1,150 @@ /* GCompris - ActivityInfoTest.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 "ApplicationSettingsMock.h" #include "src/core/ActivityInfo.h" #define ACTIVITY_INFO_TEST_ATTRIBUTE(attributeName, accessorName, attributeType) \ { \ QFETCH(attributeType, attributeName); \ QSignalSpy spy(&activityinfo, &ActivityInfo::attributeName ## Changed); \ + QVERIFY(spy.isValid()); \ QVERIFY(spy.count() == 0); \ activityinfo.set ## accessorName(attributeName); \ QVERIFY(spy.count() == 1); \ QCOMPARE(activityinfo.attributeName(), attributeName); \ } class CoreActivityInfoTest : public QObject { Q_OBJECT private slots: void ActivityInfoTest(); void ActivityInfoTest_data(); void getSectionPathTest(); void setNameWithKioskMode(); }; void CoreActivityInfoTest::ActivityInfoTest_data() { QTest::addColumn("name"); QTest::addColumn("section"); QTest::addColumn("difficulty"); QTest::addColumn("icon"); QTest::addColumn("author"); QTest::addColumn("demo"); QTest::addColumn("title"); QTest::addColumn("description"); QTest::addColumn("goal"); QTest::addColumn("prerequisite"); QTest::addColumn("manual"); QTest::addColumn("credit"); QTest::addColumn("favorite"); QTest::addColumn("enabled"); QTest::addColumn("createdInVersion"); QTest::newRow("ActivityInfo") << "Name" << "section" << (unsigned int)3 << "icon" << "author" << true << "title" << "description" << "goal" << "prerequisite" << "manual" << "credit" << false << false << 2; QTest::newRow("UnknownInfo") << "Unknown" << "Unknown" << (unsigned int)5 << "Unknown" << "Unknown" << false << "Unknown" << "Unknown" << "Unknown" << "Unknown" << "Unknown" << "Unknown" << true << true << 10; QTest::newRow("Empty") << "" << "" << (unsigned int)0 << "" << "" << false << "" << "" << "" << "" << "" << "" << true << true << 0; } void CoreActivityInfoTest::ActivityInfoTest() { ActivityInfo activityinfo; // called here to set the static instance object to the mock one ApplicationSettingsMock::getInstance(); QCOMPARE(activityinfo.name(), QStringLiteral("")); QCOMPARE(activityinfo.section(), QStringLiteral("")); QCOMPARE(activityinfo.icon(), QStringLiteral("")); QCOMPARE(activityinfo.author(), QStringLiteral("")); QVERIFY(activityinfo.demo()); QCOMPARE(activityinfo.title(), QStringLiteral("")); QCOMPARE(activityinfo.description(), QStringLiteral("")); QCOMPARE(activityinfo.goal(), QStringLiteral("")); QCOMPARE(activityinfo.prerequisite(), QStringLiteral("")); QCOMPARE(activityinfo.manual(), QStringLiteral("")); QCOMPARE(activityinfo.credit(), QStringLiteral("")); QVERIFY(!activityinfo.favorite()); QVERIFY(activityinfo.enabled()); QCOMPARE(activityinfo.createdInVersion(), 0); ACTIVITY_INFO_TEST_ATTRIBUTE(name, Name, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(section, Section, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(difficulty, Difficulty, unsigned int); ACTIVITY_INFO_TEST_ATTRIBUTE(icon, Icon, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(author, Author, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(demo, Demo, bool); ACTIVITY_INFO_TEST_ATTRIBUTE(title, Title, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(description, Description, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(goal, Goal, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(prerequisite, Prerequisite, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(manual, Manual, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(credit, Credit, QString); ACTIVITY_INFO_TEST_ATTRIBUTE(favorite, Favorite, bool); ACTIVITY_INFO_TEST_ATTRIBUTE(enabled, Enabled, bool); ACTIVITY_INFO_TEST_ATTRIBUTE(createdInVersion, CreatedInVersion, int); delete ApplicationSettingsMock::getInstance(); } void CoreActivityInfoTest::getSectionPathTest() { ActivityInfo parent; parent.setSection("parent"); ActivityInfo child(&parent); child.setSection("child"); QStringList sectionPath = child.getSectionPath(); QCOMPARE(sectionPath.size(), 2); QCOMPARE(sectionPath.join('/'), QStringLiteral("parent/child")); } void CoreActivityInfoTest::setNameWithKioskMode() { const QString fakeActivity = QStringLiteral("fakeActivity"); ActivityInfo activityInfo; activityInfo.setFavorite(true); ApplicationSettingsMock::getInstance()->setKioskMode(true); ApplicationSettingsMock::getInstance()->setFavorite(fakeActivity, false); activityInfo.setName(fakeActivity); // in kiosk mode, we don't retrieve the favorite to always have a clean start QVERIFY(activityInfo.favorite()); ApplicationSettingsMock::getInstance()->setKioskMode(false); activityInfo.setName(fakeActivity); // the activity is not a favorite, we remove its flag when setting the name QVERIFY(!activityInfo.favorite()); ApplicationSettingsMock::getInstance()->setFavorite(fakeActivity, true); activityInfo.setName(fakeActivity); // the activity is a favorite, we add its flag when setting the name QVERIFY(activityInfo.favorite()); delete ApplicationSettingsMock::getInstance(); } QTEST_MAIN(CoreActivityInfoTest) #include "ActivityInfoTest.moc" diff --git a/tests/core/ApplicationSettingsMock.h b/tests/core/ApplicationSettingsMock.h index 8dff2750b..18377e9d2 100644 --- a/tests/core/ApplicationSettingsMock.h +++ b/tests/core/ApplicationSettingsMock.h @@ -1,47 +1,47 @@ /* GCompris - ApplicationSettingsMock.h * * Copyright (C) 2018 Himanshu Vishwakarma * GCompris (C) 2018 GCompris Developers * * 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 . */ /* This file is used for the unit tests */ #ifndef APPLICATIONSETTINGSMOCK_H #define APPLICATIONSETTINGSMOCK_H #include #include "src/core/ApplicationSettings.h" class ApplicationSettingsMock : public ApplicationSettings { public: - ApplicationSettingsMock() : ApplicationSettings(QStringLiteral("./DummyApplicationSettings.conf")) + ApplicationSettingsMock() : ApplicationSettings(QStringLiteral("./dummy_application_settings.conf")) { } static ApplicationSettings *getInstance() { if(!m_instance) { m_instance = new ApplicationSettingsMock(); } return m_instance; } }; #endif // APPLICATIONSETTINGSMOCK_H diff --git a/tests/core/ApplicationSettingsTest.cpp b/tests/core/ApplicationSettingsTest.cpp index e87f3b7d5..3c7708f40 100644 --- a/tests/core/ApplicationSettingsTest.cpp +++ b/tests/core/ApplicationSettingsTest.cpp @@ -1,169 +1,176 @@ /* 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 #include "src/core/ApplicationSettings.h" #include "ApplicationSettingsMock.h" #define APPLICATION_SETTINGS_TEST_ATTRIBUTE(attributeType, attributeName, accessorName, accessorNameChanged) \ { \ QFETCH(attributeType, attributeName); \ QSignalSpy spy(&applicationSettingsMock, &ApplicationSettings::accessorNameChanged); \ + QVERIFY(spy.isValid()); \ QVERIFY(spy.count() == 0); \ applicationSettingsMock.accessorName(attributeName); \ QVERIFY(spy.count() == 1); \ QCOMPARE(applicationSettingsMock.attributeName(), attributeName); \ } class CoreApplicationSettingsTest : public QObject { Q_OBJECT private slots: + void cleanup(); void ApplicationSettingsInitializationTest(); void ApplicationSettingsTest(); void ApplicationSettingsTest_data(); void ActivitySettingsTest(); }; void CoreApplicationSettingsTest::ApplicationSettingsInitializationTest() { ApplicationSettingsMock 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 << (quint32)21 << (quint32)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 << (quint32)20 << (quint32)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() { ApplicationSettingsMock applicationSettingsMock; ApplicationSettingsMock::getInstance(); 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(quint32, previousHeight, setPreviousHeight, previousHeightChanged); APPLICATION_SETTINGS_TEST_ATTRIBUTE(quint32, 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); delete ApplicationSettingsMock::getInstance(); } void CoreApplicationSettingsTest::ActivitySettingsTest() { ApplicationSettingsMock applicationSettingsMock; ApplicationSettingsMock::getInstance(); // Creating a dummyActivity QString dummyActivity = QStringLiteral("DummyActivity"); // By Default the DummyActivity is not favorite QVERIFY(!applicationSettingsMock.isFavorite(dummyActivity)); // Setting Up the DummyActivity as Favorite applicationSettingsMock.setFavorite(dummyActivity, true); QVERIFY(applicationSettingsMock.isFavorite(dummyActivity)); // setting Up the DummyActivity as Not favorite applicationSettingsMock.setFavorite(dummyActivity, false); QVERIFY(!applicationSettingsMock.isFavorite(dummyActivity)); // By Default the activity progress is zero QCOMPARE(applicationSettingsMock.loadActivityProgress(dummyActivity), 0); // Saving the Activity Progress applicationSettingsMock.saveActivityProgress(dummyActivity, 3); QCOMPARE(applicationSettingsMock.loadActivityProgress(dummyActivity), 3); applicationSettingsMock.saveActivityProgress(dummyActivity, 10); QCOMPARE(applicationSettingsMock.loadActivityProgress(dummyActivity), 10); applicationSettingsMock.saveActivityProgress(dummyActivity, 0); QCOMPARE(applicationSettingsMock.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")); applicationSettingsMock.saveActivityConfiguration(dummyActivity, configuration); - QVariantMap newconfiguration = applicationSettingsMock.loadActivityConfiguration(dummyActivity); + QVariantMap newConfiguration = applicationSettingsMock.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"))); + 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"))); delete ApplicationSettingsMock::getInstance(); } +void CoreApplicationSettingsTest::cleanup() +{ + QFile::remove("./dummy_application_settings.conf"); +} + QTEST_MAIN(CoreApplicationSettingsTest) #include "ApplicationSettingsTest.moc" - diff --git a/tests/core/FileTest.cpp b/tests/core/FileTest.cpp index 1d7aed82f..5f6673b30 100644 --- a/tests/core/FileTest.cpp +++ b/tests/core/FileTest.cpp @@ -1,71 +1,132 @@ /* GCompris - FileTest.cpp * * Copyright (C) 2018 Himanshu Vishwakarma * GCompris (C) 2018 GCompris Developers * * 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 . */ /* This file is used for the unit tests */ #include #include +#include #include "src/core/File.h" class CoreFileTest : public QObject { Q_OBJECT private slots: - void FileTest(); + void cleanup(); + void FileExistsTest(); + void ReadWriteErrorsTest(); + void ReadWriteErrorsTest_data(); void ReadWriteTest(); + void NameTest(); }; -void CoreFileTest::FileTest() +static const QString tempFilename = QStringLiteral("./dummy_test_files.txt"); +static const QString fakeFilename = QStringLiteral("-_/fezagvvx&V/d;-ùlc"); + +void CoreFileTest::FileExistsTest() { - File file; - QSignalSpy spyName(&file, &File::nameChanged); + QFile tempFile(tempFilename); + // open in write mode to create the file if does not exist + tempFile.open(QIODevice::ReadWrite); + tempFile.close(); - QVERIFY(spyName.count() == 0); + QVERIFY(File::exists(tempFilename)); +} - QString name = QStringLiteral("./dummy_test_files.txt"); - file.setName(name); - QVERIFY(File::exists(name)); - QVERIFY(File::mkpath(QStringLiteral("./make/dummy/path"))); - QVERIFY(spyName.count() == 1); - QCOMPARE(file.write(QStringLiteral("How are you??")), true); - QCOMPARE(file.read(), QStringLiteral("How are you??")); +void CoreFileTest::ReadWriteErrorsTest_data() +{ + QTest::addColumn("filename"); + QTest::addColumn("readError"); + QTest::addColumn("writeError"); + QTest::newRow("empty file") << QStringLiteral("") + << QStringLiteral("source is empty") + << QStringLiteral("source is empty"); + + QTest::newRow("non existing file") << fakeFilename + << QStringLiteral("Unable to open the file") + << QStringLiteral("could not open file ") + fakeFilename; } -void CoreFileTest::ReadWriteTest() +void CoreFileTest::ReadWriteErrorsTest() { - File file; + QFETCH(QString, filename); + QFETCH(QString, readError); + QFETCH(QString, writeError); + + const QString fileContent = QStringLiteral("this is going to test the class File in the core"); - QString fileContaint = QStringLiteral("this is going to test the class File in the core"); + File file; + file.setName(filename); QSignalSpy spyError(&file, &File::error); + QVERIFY(spyError.isValid()); QVERIFY(spyError.count() == 0); - // File object does not having file name - QVERIFY(!file.write(fileContaint)); + // we can't read + QVERIFY(file.read().isEmpty()); QVERIFY(spyError.count() == 1); - QVERIFY(file.write(fileContaint, "./dummy_test_files.txt")); - QCOMPARE(file.read(), fileContaint); - QVERIFY(file.exists("./dummy_test_files.txt")); + QString error = qvariant_cast(spyError.at(0).at(0)); + QCOMPARE(error, readError); + // we can't write + QVERIFY(!file.write(fileContent)); + QVERIFY(spyError.count() == 2); + error = qvariant_cast(spyError.at(1).at(0)); + QCOMPARE(error, writeError); +} + +void CoreFileTest::ReadWriteTest() +{ + QFile tempFile(tempFilename); + // open in write mode to create the file if does not exist + tempFile.open(QIODevice::ReadWrite); + tempFile.close(); + + File file; + const QString fileContent = QStringLiteral("this is going to test the class File in the core"); + // normal use case, file exists + QVERIFY(file.write(fileContent, tempFilename)); + QCOMPARE(file.read(), fileContent); +} + +void CoreFileTest::NameTest() +{ + File file; + QSignalSpy spyName(&file, &File::nameChanged); + QVERIFY(spyName.isValid()); + QVERIFY(spyName.count() == 0); + file.setName(tempFilename); + QVERIFY(spyName.count() == 1); + QCOMPARE(file.name(), tempFilename); + // test sanitizeUrl + const QString sameNameUnsanitized = QStringLiteral("file://")+tempFilename; + file.setName(sameNameUnsanitized); + // no update triggered as same name after sanitization + QVERIFY(spyName.count() == 1); + QCOMPARE(file.name(), tempFilename); +} +void CoreFileTest::cleanup() +{ + QFile::remove("./dummy_test_files.txt"); } QTEST_MAIN(CoreFileTest) -#include "FileTest.moc" \ No newline at end of file +#include "FileTest.moc"