From af1eff03c9e839914aab4109970c4a9f6fac8a99 Mon Sep 17 00:00:00 2001 From: aqua Date: Thu, 8 Sep 2022 10:27:30 +0300 Subject: RekonqSettings: add resetValue and remove value's defaultValue parameter - generate default rekonqrc and include it in libsettings - Settings uses :/settings/rekonqrc to provide default values - Add Settings::path() to get the default settings location --- .gitignore | 3 ++ CMakeLists.txt | 2 +- include/rsettings.hpp | 3 +- scripts/rekonf.py | 52 ++++++++++++-------- src/CMakeLists.txt | 2 - src/application.cpp | 10 ++-- src/main.cpp | 1 + src/rekonq.kcfg | 2 +- src/settings/CMakeLists.txt | 13 ++++- src/settings/settings.cpp | 51 +++++++++++++++++-- src/settings/settings.hpp | 14 ++++-- src/settings/settings.qrc | 7 +++ src/settings/settingsdialog.cpp | 16 +++--- src/settings/settingswidget.cpp | 42 ---------------- src/settings/settingswidgets.hpp | 6 ++- src/settings/test/rekonqrc | 37 -------------- src/settings/test/settings_mock.hpp | 3 +- src/settings/test/test_settings.cpp | 82 +++++++++++++++++++++++-------- src/settings/test/test_settings.qrc | 7 --- src/settings/test/test_settingsdialog.cpp | 9 +--- src/tabbar/CMakeLists.txt | 2 - src/urlbar/CMakeLists.txt | 2 - 22 files changed, 195 insertions(+), 171 deletions(-) create mode 100644 src/settings/settings.qrc delete mode 100644 src/settings/test/rekonqrc delete mode 100644 src/settings/test/test_settings.qrc delete mode 100644 src/tabbar/CMakeLists.txt delete mode 100644 src/urlbar/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 9add7aa9..136cbf6d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ CMakeCache.txt debug.log .gdb_history +.cache +compile_commands.json cmake-build-debug/ cmake-build-coverage/ cmake-build-release/ +src/settings/rekonqrc diff --git a/CMakeLists.txt b/CMakeLists.txt index ea9ef655..540ed7e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,7 +117,7 @@ add_executable(rekonq ${rekonq_SRCS} third-party/resources.qrc) target_include_directories(rekonq PRIVATE src) target_link_libraries(rekonq spdlog::spdlog Qt6::Widgets SingleApplication::SingleApplication - settings pluginloader tabbar urlbar + settings pluginloader ) add_custom_target(rekonq_check_license python scripts/check_license.py ${rekonq_SRCS} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) diff --git a/include/rsettings.hpp b/include/rsettings.hpp index 9f0fc4d0..67eb46e2 100644 --- a/include/rsettings.hpp +++ b/include/rsettings.hpp @@ -23,7 +23,8 @@ public: virtual void endGroup() = 0; virtual void setValue(const QString &key, const QVariant &value) = 0; - [[nodiscard]] virtual QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const = 0; + virtual void resetValue(const QString &key) = 0; + [[nodiscard]] virtual QVariant value(const QString &key) const = 0; [[nodiscard]] virtual QString filePath() const = 0; diff --git a/scripts/rekonf.py b/scripts/rekonf.py index 941c29c7..6bb5d084 100755 --- a/scripts/rekonf.py +++ b/scripts/rekonf.py @@ -13,42 +13,42 @@ import sys from xml.etree import ElementTree -def write_int_entry(obj, name, default): - """Add a QSpinBox connected to an Int (obj, name, default)""" +def write_int_entry(obj, name): + """Add a QSpinBox connected to an Int""" print(f' auto* { obj } = new QSpinBox(this);') - print(f' { obj }->setValue(s->value("{ obj }", { default }).toInt());') + print(f' { obj }->setValue(s->value("{ obj }").toInt());') print(f' connect({ obj }, &QSpinBox::valueChanged, this, [this]() {{ emit changed(); }});') print(f' formLayout->addRow(tr("{ name }"), { obj });') -def write_bool_entry(obj, name, default): - """Add a QCheckBox connected to a Bool (obj, name, default)""" +def write_bool_entry(obj, name): + """Add a QCheckBox connected to a Bool""" print(f' auto* { obj } = new QCheckBox(tr("{ name }"), this);') - print(f' { obj }->setChecked(s->value("{ obj }", { default }).toBool());') + print(f' { obj }->setChecked(s->value("{ obj }").toBool());') print(f' connect({ obj }, &QCheckBox::stateChanged, this, [this]() {{ emit changed(); }});') print(f' formLayout->addRow(QString(), { obj });') -def write_string_entry(obj, name, default): - """Add a QLineEdit connected to a String (obj, name, default)""" +def write_string_entry(obj, name): + """Add a QLineEdit connected to a String""" print(f' auto* {obj} = new QLineEdit(this);') - print(f' { obj }->setText(s->value("{ obj }", "{ default }").toString());') + print(f' { obj }->setText(s->value("{ obj }").toString());') print(f' connect({ obj }, &QLineEdit::textChanged, this, [this]() {{ emit changed(); }});') print(f' formLayout->addRow(tr("{ name }"), { obj });') -def write_font_entry(obj, name, default): - """Add a QFontComboBox connected to a Font (obj, name, default)""" +def write_font_entry(obj, name): + """Add a QFontComboBox connected to a Font""" print(f' auto* { obj } = new QFontComboBox(this);') - print(f' { obj }->setCurrentFont(s->value("{ obj }", "{ default }").toString());') + print(f' { obj }->setCurrentFont(s->value("{ obj }").toString());') print(f' connect({ obj }, &QFontComboBox::currentFontChanged, this, [this]() {{ emit changed(); }});') print(f' formLayout->addRow(tr("{ name }"), { obj });') -def write_shortcut_entry(obj, name, default): - """Add a QKeySequenceEdit connected to a Shortcut (obj, name, default)""" +def write_shortcut_entry(obj, name): + """Add a QKeySequenceEdit connected to a Shortcut""" print(f' auto* { obj } = new QKeySequenceEdit(this);') - print(f' { obj }->setKeySequence(s->value("{ obj }", "{ default }").toString());') + print(f' { obj }->setKeySequence(s->value("{ obj }").toString());') print(f' connect({ obj }, &QKeySequenceEdit::keySequenceChanged, this, [this]() {{ emit changed(); }});') print(f' formLayout->addRow(tr("{ name }"), { obj });') @@ -69,7 +69,6 @@ def generate_group_widget(root, group): # includes print('// Includes') print('#include "settingswidgets.hpp"') - print('#include "helpers.hpp"') print('#include ') print('#include ') print('#include ') @@ -97,16 +96,29 @@ def generate_group_widget(root, group): else: obj = entry.attrib['key'] name = entry.attrib["name"] - default = entry.find('{*}default').text - write_entry_fn.get(entry.attrib['type'])(obj, name, default) + write_entry_fn.get(entry.attrib['type'])(obj, name) print(f' { obj }->setObjectName("{ obj }");') - print(f' { obj }->setProperty("defaultValue", "{ default }");') print('') if class_group != 'General': - print(' s->endGroup();') + print(' m_settings->endGroup();') print('}\n') + # reset + print(f'void { class_name }::reset() {{') + if class_group != 'General': + print(f' m_settings->beginGroup("{ class_group }");') + + for entry in group.findall('{http://www.kde.org/standards/kcfg/1.0}entry'): + if entry.attrib.get("hidden") == "true": + print(f' // hidden entry { entry.attrib.get("name") }') + else: + key = entry.attrib['key'] + print(f' m_settings->resetValue("{ key }");') + + if class_group != 'General': + print(' m_settings->endGroup();') + print('}\n') def generate_group_ini(group): """Generate settings in ini format for group""" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b9712235..a4193a16 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,8 +3,6 @@ ADD_SUBDIRECTORY( data ) add_subdirectory(settings) add_subdirectory(plugins) -add_subdirectory(tabbar) -add_subdirectory(urlbar) ### ------- sources -------- diff --git a/src/application.cpp b/src/application.cpp index 295d2708..c3858a4a 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -29,17 +29,13 @@ Application::Application(int &argc, char *argv[]) : SingleApplication(argc, argv connect(this, &SingleApplication::receivedMessage, this, &Application::parseCommandLine); // updating rekonq configuration - const auto settingsPath = - QDir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation)).filePath("rekonqrc"); + const auto settingsPath = Settings::path(); spdlog::info("Loading rekonq configuration: {}", qUtf8Printable(settingsPath)); m_settings = new Settings(settingsPath, this); - if (m_settings->value("FirstRun", true).toBool()) { + if (m_settings->value("FirstRun").toBool()) { spdlog::info("First run"); - if ((new SettingsDialog(m_settings, nullptr))->exec()) { - spdlog::info("new settings saved"); - m_settings->setValue("FirstRun", false); - } + if ((new SettingsDialog(m_settings, nullptr))->exec()) spdlog::info("Settings saved"); } // load default plugins diff --git a/src/main.cpp b/src/main.cpp index 51e68716..a537be8b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,7 @@ int main(int argc, char **argv) #ifdef QT_DEBUG spdlog::set_level(spdlog::level::debug); #endif + Q_INIT_RESOURCE(settings); // When loading QtWebEngine from a plugin, set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); diff --git a/src/rekonq.kcfg b/src/rekonq.kcfg index f3013859..eab64724 100644 --- a/src/rekonq.kcfg +++ b/src/rekonq.kcfg @@ -27,7 +27,7 @@ https://duckduckgo.com/?q=%1 - TODO: change type to Path + TODO: change type to Path TODO: change type to Path diff --git a/src/settings/CMakeLists.txt b/src/settings/CMakeLists.txt index 712fd57a..38a35cf6 100644 --- a/src/settings/CMakeLists.txt +++ b/src/settings/CMakeLists.txt @@ -15,11 +15,20 @@ add_custom_command(OUTPUT shortcutssettingswidget.cpp DEPENDS ${PROJECT_SOURCE_D --group=Shortcuts --output=shortcutssettingswidget.cpp ${PROJECT_SOURCE_DIR}/src/rekonq.kcfg) +# generate rekonqrc +execute_process( + COMMAND python3 ${PROJECT_SOURCE_DIR}/scripts/rekonf.py --group=all --output=rekonqrc ${PROJECT_SOURCE_DIR}/src/rekonq.kcfg + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + #OUTPUT rekonqrc + #DEPENDS ${PROJECT_SOURCE_DIR}/scripts/rekonf.py ${PROJECT_SOURCE_DIR}/src/rekonq.kcfg +) + add_library(settings STATIC ${PROJECT_SOURCE_DIR}/include/rsettings.hpp settings.cpp settings.hpp settingsdialog.cpp settingsdialog.h settingsdialog.ui settingswidgets.hpp settingswidget.cpp helpers.hpp generalsettingswidget.cpp appearancesettingswidget.cpp networksettingswidget.cpp shortcutssettingswidget.cpp + settings.qrc rekonqrc ) target_link_libraries(settings PUBLIC Qt6::Widgets) @@ -27,7 +36,7 @@ IF(${CMAKE_BUILD_TYPE} STREQUAL "Debug") add_executable(test_settingsdialog test/test_settingsdialog.cpp test/settings_mock.hpp) target_link_libraries(test_settingsdialog GTest::gmock settings) - add_executable(test_settings test/test_settings.cpp test/test_settings.qrc test/settings_mock.hpp) + add_executable(test_settings test/test_settings.cpp test/settings_mock.hpp) target_link_libraries(test_settings PRIVATE GTest::gtest GTest::gmock settings) - gtest_discover_tests(test_settings EXTRA_ARGS rekonqrc) + gtest_discover_tests(test_settings) endif() diff --git a/src/settings/settings.cpp b/src/settings/settings.cpp index 190bc977..d7216b2e 100644 --- a/src/settings/settings.cpp +++ b/src/settings/settings.cpp @@ -8,23 +8,66 @@ * ============================================================ */ #include "settings.hpp" +#include "../rekonq.hpp" +#include "helpers.hpp" +#include #include +#include + +QString Settings::path() +{ + return QDir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation)).filePath("rekonqrc"); +} Settings::Settings(const QString &path, QObject *parent) : RekonqSettings(parent) { d = new QSettings(path, QSettings::IniFormat, this); + b = new QSettings(":/settings/rekonqrc", QSettings::IniFormat, this); } -void Settings::beginGroup(const QString &prefix) { d->beginGroup(prefix); } +Settings::~Settings() +{ + delete d; + delete b; +} -void Settings::endGroup() { d->endGroup(); } +void Settings::beginGroup(const QString &prefix) +{ + d->beginGroup(prefix); + b->beginGroup(prefix); +} + +void Settings::endGroup() +{ + d->endGroup(); + b->endGroup(); +} void Settings::setValue(const QString &key, const QVariant &value) { - d->setValue(key, value); + if (value == b->value(key)) d->remove(key); + else + d->setValue(key, value); emit changed(key, value); } -QVariant Settings::value(const QString &key, const QVariant &defaultValue) const { return d->value(key, defaultValue); } +void Settings::resetValue(const QString &key) { d->remove(key); } + +QVariant Settings::value(const QString &key) const +{ + auto v = d->value(key); + if (v.isValid()) return v; + + if (key == QL1S("standardFontFamily")) return getFont(QFont::System).family(); + if (key == QL1S("fixedFontFamily")) return getFont(QFont::Monospace).family(); + if (key == QL1S("serifFontFamily")) return getFont(QFont::Times).family(); + if (key == QL1S("sansSerifFontFamily")) return getFont(QFont::Helvetica).family(); + if (key == QL1S("cursiveFontFamily")) return getFont(QFont::Cursive).family(); + if (key == QL1S("fantasyFontFamily")) return getFont(QFont::Fantasy).family(); + + v = b->value(key); + Q_ASSERT_X(v.isValid(), __PRETTY_FUNCTION__, qUtf8Printable(key)); + return v; +} QString Settings::filePath() const { return d->fileName(); } diff --git a/src/settings/settings.hpp b/src/settings/settings.hpp index 713ce38d..8d413985 100644 --- a/src/settings/settings.hpp +++ b/src/settings/settings.hpp @@ -12,22 +12,28 @@ #include class QSettings; -class Settings final : public RekonqSettings { +class Settings : public RekonqSettings { Q_OBJECT public: + [[nodiscard]] static QString path(); + explicit Settings(const QString &settingsPath, QObject *parent = nullptr); - ~Settings() override = default; + ~Settings() override; void beginGroup(const QString &prefix) override; void endGroup() override; void setValue(const QString &key, const QVariant &value) override; - [[nodiscard]] QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const override; + void resetValue(const QString &key) override; + [[nodiscard]] QVariant value(const QString &key) const override; [[nodiscard]] QString filePath() const override; +protected: + QSettings *d; + QSettings *b; + private: Q_DISABLE_COPY_MOVE(Settings) - QSettings *d; }; diff --git a/src/settings/settings.qrc b/src/settings/settings.qrc new file mode 100644 index 00000000..71e19674 --- /dev/null +++ b/src/settings/settings.qrc @@ -0,0 +1,7 @@ + + + + + rekonqrc + + diff --git a/src/settings/settingsdialog.cpp b/src/settings/settingsdialog.cpp index 68fa7a26..66a47140 100644 --- a/src/settings/settingsdialog.cpp +++ b/src/settings/settingsdialog.cpp @@ -23,7 +23,7 @@ SettingsDialog::SettingsDialog(RekonqSettings *settings, QWidget *parent) : QDia restoreDefaultsBtn = ui->buttonBox->button(QDialogButtonBox::RestoreDefaults); Q_CHECK_PTR(restoreDefaultsBtn); - if (!settings->value("FirstRun", true).toBool()) saveBtn->setEnabled(false); + if (!settings->value("FirstRun").toBool()) saveBtn->setEnabled(false); addPage(new GeneralSettingsWidget(settings, this)); addPage(new AppearanceSettingsWidget(settings, this)); @@ -32,16 +32,14 @@ SettingsDialog::SettingsDialog(RekonqSettings *settings, QWidget *parent) : QDia connect(ui->listWidget, &QListWidget::currentRowChanged, ui->stackedWidget, &QStackedWidget::setCurrentIndex); - connect(restoreDefaultsBtn, &QPushButton::clicked, this, [this]() { - for (auto *w : ui->stackedWidget->findChildren(QString(), Qt::FindDirectChildrenOnly)) { - w->reset(); - } + connect(restoreDefaultsBtn, &QPushButton::clicked, this, [this, settings]() { + for (auto *w : ui->stackedWidget->findChildren(QString(), Qt::FindDirectChildrenOnly)) w->reset(); + settings->setValue("FirstRun", false); + close(); }); connect(this, &QDialog::accepted, this, [this]() { - for (auto *w : ui->stackedWidget->findChildren(QString(), Qt::FindDirectChildrenOnly)) { - w->save(); - } + for (auto *w : ui->stackedWidget->findChildren(QString(), Qt::FindDirectChildrenOnly)) w->save(); }); } @@ -54,4 +52,4 @@ void SettingsDialog::addPage(SettingsWidget *page) ui->stackedWidget->addWidget(page); connect(page, &SettingsWidget::changed, this, [this]() { saveBtn->setEnabled(true); }); -} \ No newline at end of file +} diff --git a/src/settings/settingswidget.cpp b/src/settings/settingswidget.cpp index b5a2432c..60f2bf62 100644 --- a/src/settings/settingswidget.cpp +++ b/src/settings/settingswidget.cpp @@ -37,45 +37,3 @@ void SettingsWidget::save() if (objectName() != QLatin1String("General")) m_settings->endGroup(); } - -void SettingsWidget::reset() -{ - if (objectName() != QLatin1String("General")) m_settings->beginGroup(objectName()); - - // Int - for (auto *spinbox : findChildren(QString(), Qt::FindDirectChildrenOnly)) { - const auto value = spinbox->property("defaultValue"); - spinbox->setValue(value.toInt()); - m_settings->setValue(spinbox->objectName(), value); - } - - // Bool - for (auto *checkbox : findChildren(QString(), Qt::FindDirectChildrenOnly)) { - const auto value = checkbox->property("defaultValue"); - checkbox->setChecked(value.toBool()); - m_settings->setValue(checkbox->objectName(), value); - } - - // String - for (auto *lineedit : findChildren(QString(), Qt::FindDirectChildrenOnly)) { - const auto value = lineedit->property("defaultValue"); - lineedit->setText(value.toString()); - m_settings->setValue(lineedit->objectName(), value); - } - - // Font - for (auto *font : findChildren(QString(), Qt::FindDirectChildrenOnly)) { - const auto value = font->property("defaultValue"); - font->setFont(QFont(value.toString())); - m_settings->setValue(font->objectName(), value); - } - - // Shortcut - for (auto *shortcut : findChildren(QString(), Qt::FindDirectChildrenOnly)) { - const auto value = shortcut->property("defaultValue"); - shortcut->setKeySequence(value.toString()); - m_settings->setValue(shortcut->objectName(), value); - } - - if (objectName() != QLatin1String("General")) m_settings->endGroup(); -} \ No newline at end of file diff --git a/src/settings/settingswidgets.hpp b/src/settings/settingswidgets.hpp index cb08b591..532a5683 100644 --- a/src/settings/settingswidgets.hpp +++ b/src/settings/settingswidgets.hpp @@ -27,7 +27,7 @@ signals: public slots: void save(); - void reset(); + virtual void reset() = 0; protected: RekonqSettings *m_settings; @@ -38,6 +38,7 @@ class GeneralSettingsWidget final : public SettingsWidget { public: explicit GeneralSettingsWidget(RekonqSettings *, QWidget *parent = nullptr); ~GeneralSettingsWidget() override = default; + void reset() override; }; class AppearanceSettingsWidget final : public SettingsWidget { @@ -45,6 +46,7 @@ class AppearanceSettingsWidget final : public SettingsWidget { public: explicit AppearanceSettingsWidget(RekonqSettings *, QWidget *parent = nullptr); ~AppearanceSettingsWidget() override = default; + void reset() override; }; class NetworkSettingsWidget final : public SettingsWidget { @@ -52,6 +54,7 @@ class NetworkSettingsWidget final : public SettingsWidget { public: explicit NetworkSettingsWidget(RekonqSettings *, QWidget *parent = nullptr); ~NetworkSettingsWidget() override = default; + void reset() override; }; class ShortcutsSettingsWidget final : public SettingsWidget { @@ -59,4 +62,5 @@ class ShortcutsSettingsWidget final : public SettingsWidget { public: explicit ShortcutsSettingsWidget(RekonqSettings *, QWidget *parent = nullptr); ~ShortcutsSettingsWidget() override = default; + void reset() override; }; diff --git a/src/settings/test/rekonqrc b/src/settings/test/rekonqrc deleted file mode 100644 index fe67194c..00000000 --- a/src/settings/test/rekonqrc +++ /dev/null @@ -1,37 +0,0 @@ -[General] -FirstRun=true -lang=TODO: change type to StringList -homepage=about:blank -newtab=about:blank -searchUrl=https://duckduckgo.com/?q=%1 -pluginPath=TODO: change type to Path - -[Network] -downloadPath=TODO: change type to Path -downloadPathAsk=true -userAgent=TODO - -[Appearance] -IconTheme=tabler -defaultFontSize=16 -minFontSize=7 -defaultEncoding=ISO 8859-1 -defaultZoom=10 - -[Shortcuts] -actionShowSidebar=Ctrl+B -actionShowSearchBar=Ctrl+F -actionSettings=Ctrl+S -actionQuit=Ctrl+Q -actionNewTab=Ctrl+T -actionCloseTab=Ctrl+W -actionSwitchTabLeft=Ctrl+Left -actionSwitchTabRight=Ctrl+Right -actionFocusAddressBar=F6 -actionBack=Alt+Left -actionForward=Alt+Right -actionRefresh=F5 -actionReload=Ctrl+F5 -actionOpen=Ctrl+O -actionBookmark=Ctrl+D - diff --git a/src/settings/test/settings_mock.hpp b/src/settings/test/settings_mock.hpp index bc3fbc2f..bf0e137a 100644 --- a/src/settings/test/settings_mock.hpp +++ b/src/settings/test/settings_mock.hpp @@ -21,7 +21,8 @@ public: MOCK_METHOD(void, endGroup, (), (override)); MOCK_METHOD(void, setValue, (const QString &, const QVariant &), (override)); - MOCK_METHOD(QVariant, value, (const QString &, const QVariant &), (const, override)); + MOCK_METHOD(void, resetValue, (const QString &), (override)); + MOCK_METHOD(QVariant, value, (const QString &), (const, override)); MOCK_METHOD(QString, filePath, (), (const, override)); }; diff --git a/src/settings/test/test_settings.cpp b/src/settings/test/test_settings.cpp index 6efc64c3..a797a224 100644 --- a/src/settings/test/test_settings.cpp +++ b/src/settings/test/test_settings.cpp @@ -7,9 +7,10 @@ #include #include -#include +#include #include #include +#include #include #include @@ -19,9 +20,10 @@ #include "../settingsdialog.h" #include "settings_mock.hpp" -using ::testing::_; +using ::testing::_; // NOLINT(bugprone-reserved-identifier) using ::testing::AtLeast; using ::testing::ContainerEq; +using ::testing::Return; using ::testing::ReturnArg; MATCHER_P(QStringEq, a, "") @@ -32,7 +34,7 @@ MATCHER_P(QStringEq, a, "") MATCHER_P(QVariantEq, a, "") { *result_listener << "where the arg is " << qUtf8Printable(arg.toString()); - return arg.toString().compare(a) == 0; + return arg == QVariant(a); } TEST(settings, getFont) @@ -46,15 +48,30 @@ TEST(settings, getFont) TEST(settings, settingsPath) { - const auto path = QDir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation)).filePath("rekonqrc"); + const auto path = Settings::path(); EXPECT_FALSE(path.isEmpty()); EXPECT_TRUE(path.endsWith("rekonqrc")); + + QFile defaultSettingsPath(":/settings/rekonqrc"); + EXPECT_TRUE(defaultSettingsPath.exists()); } +class TestSettings : public Settings { +public: + TestSettings(const QString &path = QString()) : Settings(path, nullptr){}; + ~TestSettings() override = default; + + [[nodiscard]] auto groups() const { return d->childGroups(); } + [[nodiscard]] auto keys() const { return d->childKeys(); } +}; + TEST(settings, Settings) { - Settings settings(":rekonqrc"); - EXPECT_THAT(settings.filePath(), QStringEq(":rekonqrc")); + TestSettings settings; + EXPECT_TRUE(settings.filePath().isEmpty()); + + EXPECT_TRUE(settings.groups().isEmpty()); + EXPECT_TRUE(settings.keys().isEmpty()); const auto FirstRun = settings.value("FirstRun"); EXPECT_TRUE(FirstRun.isValid()); @@ -63,6 +80,9 @@ TEST(settings, Settings) settings.setValue("FirstRun", false); EXPECT_FALSE(settings.value("FirstRun").toBool()); + EXPECT_TRUE(settings.groups().isEmpty()); + EXPECT_EQ(settings.keys().count(), 1); + settings.beginGroup("Network"); const auto downloadPathAsk = settings.value("downloadPathAsk"); EXPECT_TRUE(downloadPathAsk.isValid()); @@ -72,9 +92,12 @@ TEST(settings, Settings) const auto searchUrl = settings.value("searchUrl"); EXPECT_TRUE(searchUrl.isValid()); EXPECT_EQ(searchUrl.toString(), QString("https://duckduckgo.com/?q=%1")); + + EXPECT_TRUE(settings.groups().isEmpty()); + EXPECT_EQ(settings.keys().count(), 1); } -TEST(settings, SettingsDialog) +TEST(settings, SettingsDialog_mock) { constexpr unsigned n_settings = 36; // there are 36 settings in total MockSettings mockSettings; @@ -82,16 +105,20 @@ TEST(settings, SettingsDialog) // beginGroup/endGroup are called twice: during the ctor and when accepted EXPECT_CALL(mockSettings, beginGroup).Times(3 * 4); EXPECT_CALL(mockSettings, endGroup).Times(3 * 4); - EXPECT_CALL(mockSettings, value).Times(n_settings * 2).WillRepeatedly(ReturnArg<1>()); - // 1 setting is hidden and won't be set by the dialog - // save and reset will both call setValue on all non-hidden settings - EXPECT_CALL(mockSettings, setValue(_, _)).Times(n_settings * 2 - 3); + EXPECT_CALL(mockSettings, value).Times(n_settings * 2 - 2).WillRepeatedly(ReturnArg<0>()); + EXPECT_CALL(mockSettings, value(QStringEq("homepage"))).Times(2).WillRepeatedly(Return(QVariant("about:blank"))); + // expect accept to call setValue on all non-hidden settings + EXPECT_CALL(mockSettings, setValue(_, _)).Times(n_settings - 2); EXPECT_CALL(mockSettings, setValue(QStringEq("homepage"), QVariantEq("https://kde.org"))); + EXPECT_CALL(mockSettings, setValue(QStringEq("FirstRun"), QVariantEq(false))); + // expect resetBtn to call resetValue on all non-hidden settings + EXPECT_CALL(mockSettings, resetValue).Times(n_settings - 1); // change setting { SettingsDialog dlg(&mockSettings); auto *homepage = dlg.findChild("homepage"); + ASSERT_FALSE(homepage == nullptr); EXPECT_TRUE(homepage->text() == QLatin1String("about:blank")) << qUtf8Printable(homepage->text()); homepage->setText("https://kde.org"); dlg.accept(); @@ -101,24 +128,37 @@ TEST(settings, SettingsDialog) { SettingsDialog dlg(&mockSettings); auto *resetBtn = dlg.findChild()->button(QDialogButtonBox::RestoreDefaults); - EXPECT_FALSE(resetBtn == nullptr); + ASSERT_FALSE(resetBtn == nullptr); resetBtn->click(); } } +TEST(settings, SettingsDialog) +{ + const auto path = Settings::path(); + ASSERT_FALSE(QFile::exists(path)); + + { + Settings settings(path); + EXPECT_TRUE(settings.value("FirstRun").toBool()); + + SettingsDialog dlg(&settings); + auto *resetBtn = dlg.findChild()->button(QDialogButtonBox::RestoreDefaults); + ASSERT_FALSE(resetBtn == nullptr); + resetBtn->click(); + } + + ASSERT_TRUE(QFile::exists(path)); + ASSERT_TRUE(QFile::remove(path)); +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); + Q_INIT_RESOURCE(settings); - // handling fonts requires a QGuiApplication - // The proper platform name needs to be added to the argument list before the QGuiApplication constructor is called - // This needs to be done here for gtest_discover_tests to work - QList args; - for (int i = 0; i < argc; ++i) args.append(argv[i]); - args.append({"-platform", "offscreen"}); - int args_count = args.count(); - - QApplication app(args_count, args.data()); + QApplication app(argc, argv); + QStandardPaths::setTestModeEnabled(true); return RUN_ALL_TESTS(); } diff --git a/src/settings/test/test_settings.qrc b/src/settings/test/test_settings.qrc deleted file mode 100644 index 16e74fef..00000000 --- a/src/settings/test/test_settings.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - - - rekonqrc - - diff --git a/src/settings/test/test_settingsdialog.cpp b/src/settings/test/test_settingsdialog.cpp index a50cf307..a89ec82d 100644 --- a/src/settings/test/test_settingsdialog.cpp +++ b/src/settings/test/test_settingsdialog.cpp @@ -5,20 +5,15 @@ * Copyright (C) 2022 aqua * ============================================================ */ +#include "../settings.hpp" #include "../settingsdialog.h" -#include "settings_mock.hpp" #include -using ::testing::AtLeast; -using ::testing::NiceMock; -using ::testing::ReturnArg; - int main(int argc, char **argv) { QApplication app(argc, argv); - NiceMock settings; - EXPECT_CALL(settings, value).WillRepeatedly(ReturnArg<1>()); + Settings settings(Settings::path()); SettingsDialog dlg(&settings); dlg.show(); diff --git a/src/tabbar/CMakeLists.txt b/src/tabbar/CMakeLists.txt deleted file mode 100644 index 9333ef0a..00000000 --- a/src/tabbar/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_library(tabbar STATIC tabbar.cpp tabbar.h) -target_link_libraries(tabbar PUBLIC Qt6::Widgets) \ No newline at end of file diff --git a/src/urlbar/CMakeLists.txt b/src/urlbar/CMakeLists.txt deleted file mode 100644 index 7827dfb2..00000000 --- a/src/urlbar/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_library(urlbar STATIC urlbar.cpp urlbar.hpp completer.cpp completer.hpp) -target_link_libraries(urlbar PUBLIC Qt6::Widgets) -- cgit v1.2.1