From 6b0c8f7e769a141f13194cf341e888c9b49f294c Mon Sep 17 00:00:00 2001 From: aqua Date: Mon, 5 Sep 2022 16:17:50 +0300 Subject: Add RekonqWindow tests --- src/CMakeLists.txt | 20 ++++++++-- src/plugins/CMakeLists.txt | 2 +- src/rekonqwindow.cpp | 56 -------------------------- src/rekonqwindow.hpp | 12 +++--- src/rekonqwindow.ui | 14 +------ src/rekonqwindow_class.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++ src/test/rekonqwindow_mock.hpp | 17 ++++++++ src/test/settings_mock.hpp | 1 + src/test/test_rekonqwindow.cpp | 38 ++++++++++++++++++ 9 files changed, 172 insertions(+), 79 deletions(-) create mode 100644 src/rekonqwindow_class.cpp create mode 100644 src/test/rekonqwindow_mock.hpp create mode 120000 src/test/settings_mock.hpp create mode 100644 src/test/test_rekonqwindow.cpp (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cc197ee3..b9712235 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,21 +8,27 @@ add_subdirectory(urlbar) ### ------- sources -------- +set(rekonqwindow_SRCS + rekonqwindow_class.cpp rekonqwindow.hpp rekonqwindow.ui + tabbar/tabbar.cpp tabbar/tabbar.h + urlbar/urlbar.cpp urlbar/urlbar.hpp urlbar/completer.cpp urlbar/completer.hpp +) +set(rekonqwindow_IFACES ${PROJECT_SOURCE_DIR}/include/rview.hpp) + # rekonq set(rekonq_SRCS #---------------------------------------- main.cpp application.cpp application_instance.cpp application.hpp - #---------------------------------------- - rekonqwindow.cpp rekonqwindow.hpp rekonqwindow.ui taskmanager.cpp taskmanager.h taskmanager.ui #---------------------------------------- - plugins/rplugininterface.hpp + rekonqwindow.cpp ${rekonqwindow_SRCS} #---------------------------------------- ) if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") list(APPEND rekonq_SRCS test/rview_fake.cpp test/rview_fake.h test/rview_fake.ui) endif() list(TRANSFORM rekonq_SRCS PREPEND src/) +set(rekonq_SRCS ${rekonq_SRCS} ${rekonqwindow_IFACES}) set(rekonq_SRCS ${rekonq_SRCS} PARENT_SCOPE) @@ -110,11 +116,19 @@ ENDIF(HAVE_QCA2 AND HAVE_QTOAUTH) # tests if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") + # application test add_executable(test_application test/test_application.cpp test/application_mock.hpp application_instance.cpp application.hpp) target_compile_definitions(test_application PRIVATE REKONQ_TEST) target_link_libraries(test_application GTest::gtest GTest::gmock GTest::gtest_main SingleApplication::SingleApplication) gtest_discover_tests(test_application) + + # rekonqwindow test + add_executable(test_rekonqwindow test/test_rekonqwindow.cpp test/rekonqwindow_mock.hpp test/settings_mock.hpp + ${rekonqwindow_SRCS} ${rekonqwindow_IFACES}) + target_compile_definitions(test_rekonqwindow PRIVATE REKONQ_TEST) + target_link_libraries(test_rekonqwindow GTest::gtest GTest::gmock settings) + gtest_discover_tests(test_rekonqwindow) endif() ### ------------ INSTALL FILES... diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt index a978542f..9d80b057 100644 --- a/src/plugins/CMakeLists.txt +++ b/src/plugins/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(pluginloader STATIC pluginloader.cpp pluginloader.h) +add_library(pluginloader STATIC pluginloader.cpp pluginloader.h rplugininterface.hpp) target_link_libraries(pluginloader PUBLIC Qt6::Core Qt6::Widgets) if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") diff --git a/src/rekonqwindow.cpp b/src/rekonqwindow.cpp index f969622c..f9f26186 100644 --- a/src/rekonqwindow.cpp +++ b/src/rekonqwindow.cpp @@ -9,66 +9,10 @@ #include "rekonqwindow.hpp" #include "application.hpp" -#include "settings/settingsdialog.h" -#include "taskmanager.h" #include "ui_rekonqwindow.h" #include #include -#ifdef QT_DEBUG -#include "test/rview_fake.h" -#endif - -RekonqWindow::RekonqWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::RekonqWindow) -{ - ui->setupUi(this); - - connect(ui->tabs, &TabBar::currentChanged, this, [this](RekonqView *view) { - if (view == nullptr) { // last tab has been closed - close(); - return; - } - - ui->views->setCurrentWidget(view); - ui->urlBar->setCurrentView(view); - }); - connect(ui->tabs, &TabBar::removeView, this, [this](RekonqView *view) { ui->views->removeWidget(view); }); - - connect(ui->back, &QToolButton::clicked, this, [this]() { currentView()->back(); }); - connect(ui->forward, &QToolButton::clicked, this, [this]() { currentView()->forward(); }); - connect(ui->refresh, &QToolButton::clicked, this, [this]() { currentView()->refresh(); }); - connect(ui->home, &QToolButton::clicked, this, [this]() { loadUrl(rekonq::HomePage, rekonq::CurrentTab); }); - - // connect menu actions - // file menu -#ifdef QT_DEBUG - { - auto *actionNewDebugTab = new QAction(tr("New Debug Tab"), ui->menuFile); - connect(actionNewDebugTab, &QAction::triggered, this, [this]() { addView(new RekonqView_fake(this)); }); - ui->menuFile->insertAction(ui->actionNewTab, actionNewDebugTab); - } -#endif - connect(ui->actionNewTab, &QAction::triggered, this, - [this]() { loadUrl(rekonq::NewTabPage, rekonq::NewFocusedTab); }); - connect(ui->actionCloseTab, &QAction::triggered, this, - [this]() { emit ui->tabs->tabCloseRequested(ui->tabs->currentIndex()); }); - connect(ui->actionQuit, &QAction::triggered, qApp, &QApplication::quit); - // edit menu - // view menu - // history menu - // bookmarks menu - // settings menu - connect(ui->actionSettings, &QAction::triggered, this, - [this]() { (new SettingsDialog(Application::instance()->settings(), this))->show(); }); - connect(ui->actionTaskManager, &QAction::triggered, this, [this]() { (new TaskManager(this))->show(); }); - // help menu - connect(ui->actionAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt); - - connect(ui->newTab, &QToolButton::clicked, ui->actionNewTab, &QAction::trigger); -} - -RekonqWindow::~RekonqWindow() { delete ui; } - // -------------------------------------------------------------------------------------------------- RekonqView *RekonqWindow::currentView() diff --git a/src/rekonqwindow.hpp b/src/rekonqwindow.hpp index 742adbdb..58dbe539 100644 --- a/src/rekonqwindow.hpp +++ b/src/rekonqwindow.hpp @@ -13,7 +13,7 @@ #include "rekonq.hpp" #include -#include +#include // Forward Declarations class RekonqView; @@ -29,12 +29,13 @@ public: explicit RekonqWindow(QWidget *parent = nullptr); ~RekonqWindow() override; - [[nodiscard]] RekonqView *currentView(); + void setupShortcuts(const RekonqSettings *settings); + [[nodiscard]] REKONQ_TEST_VIRTUAL RekonqView *currentView() REKONQ_TEST_PURE; public slots: - int addView(RekonqView *view); - void loadUrl(rekonq::DefaultUrl url, rekonq::OpenType type = rekonq::CurrentTab); - void loadUrl(const QUrl &url, rekonq::OpenType type = rekonq::CurrentTab); + REKONQ_TEST_VIRTUAL int addView(RekonqView *view) REKONQ_TEST_PURE; + REKONQ_TEST_VIRTUAL void loadUrl(rekonq::DefaultUrl url, rekonq::OpenType type = rekonq::CurrentTab) REKONQ_TEST_PURE; + REKONQ_TEST_VIRTUAL void loadUrl(const QUrl &url, rekonq::OpenType type = rekonq::CurrentTab) REKONQ_TEST_PURE; // void loadUrl(const KUrl &, Rekonq::OpenType type = Rekonq::CurrentTab, TabHistory *history = 0); private slots: @@ -44,7 +45,6 @@ private slots: private: Ui::RekonqWindow *ui; - QSplitter *_splitter = nullptr; // QWeakPointer _historyPanel; // QWeakPointer _bookmarksPanel; }; diff --git a/src/rekonqwindow.ui b/src/rekonqwindow.ui index bd14852a..b16fe187 100644 --- a/src/rekonqwindow.ui +++ b/src/rekonqwindow.ui @@ -120,7 +120,7 @@ 0 0 800 - 22 + 30 @@ -180,9 +180,6 @@ Task Manager - - F12 - @@ -198,9 +195,6 @@ &Quit - - Ctrl+Q - @@ -211,17 +205,11 @@ New Tab - - Ctrl+T - Close Tab - - Ctrl+W - diff --git a/src/rekonqwindow_class.cpp b/src/rekonqwindow_class.cpp new file mode 100644 index 00000000..d0645cb6 --- /dev/null +++ b/src/rekonqwindow_class.cpp @@ -0,0 +1,91 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2013 by Andrea Diamantini + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ */ + +#include "rekonqwindow.hpp" +#include "ui_rekonqwindow.h" +#include +#include + +#ifndef REKONQ_TEST +#include "application.hpp" +#include "settings/settingsdialog.h" +#include "taskmanager.h" +#endif + +#if defined(QT_DEBUG) && !defined(REKONQ_TEST) +#include "test/rview_fake.h" +#endif + +RekonqWindow::RekonqWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::RekonqWindow) +{ + ui->setupUi(this); + + connect(ui->tabs, &TabBar::currentChanged, this, [this](RekonqView *view) { + if (view == nullptr) { // last tab has been closed + close(); + return; + } + + ui->views->setCurrentWidget(view); + ui->urlBar->setCurrentView(view); + }); + connect(ui->tabs, &TabBar::removeView, this, [this](RekonqView *view) { ui->views->removeWidget(view); }); + + connect(ui->back, &QToolButton::clicked, this, [this]() { currentView()->back(); }); + connect(ui->forward, &QToolButton::clicked, this, [this]() { currentView()->forward(); }); + connect(ui->refresh, &QToolButton::clicked, this, [this]() { currentView()->refresh(); }); + connect(ui->home, &QToolButton::clicked, this, [this]() { loadUrl(rekonq::HomePage, rekonq::CurrentTab); }); + + auto *actionFocusUrlBar = new QAction(this); + actionFocusUrlBar->setShortcut({"F6"}); + connect(actionFocusUrlBar, &QAction::triggered, this, [this]() { + ui->urlBar->setFocus(); + ui->urlBar->selectAll(); + }); + addAction(actionFocusUrlBar); + + // connect menu actions + // file menu +#if defined(QT_DEBUG) && !defined(REKONQ_TEST) + { + auto *actionNewDebugTab = new QAction(tr("New Debug Tab"), ui->menuFile); + connect(actionNewDebugTab, &QAction::triggered, this, [this]() { addView(new RekonqView_fake(this)); }); + ui->menuFile->insertAction(ui->actionNewTab, actionNewDebugTab); + } +#endif + connect(ui->actionNewTab, &QAction::triggered, this, + [this]() { loadUrl(rekonq::NewTabPage, rekonq::NewFocusedTab); }); + connect(ui->actionCloseTab, &QAction::triggered, this, + [this]() { emit ui->tabs->tabCloseRequested(ui->tabs->currentIndex()); }); + connect(ui->actionQuit, &QAction::triggered, qApp, &QApplication::quit); + // edit menu + // view menu + // history menu + // bookmarks menu + // settings menu +#ifndef REKONQ_TEST + connect(ui->actionSettings, &QAction::triggered, this, + [this]() { (new SettingsDialog(Application::instance()->settings(), this))->show(); }); + connect(ui->actionTaskManager, &QAction::triggered, this, [this]() { (new TaskManager(this))->show(); }); +#endif + // help menu + connect(ui->actionAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt); + + connect(ui->newTab, &QToolButton::clicked, ui->actionNewTab, &QAction::trigger); +} + +RekonqWindow::~RekonqWindow() { delete ui; } + +void RekonqWindow::setupShortcuts(const RekonqSettings *settings) +{ + for (auto *action : findChildren(QRegularExpression("^action.*"))) { + const auto shortcut = settings->value(action->objectName()); + if (shortcut.isValid()) action->setShortcut(shortcut.toString()); + } +} diff --git a/src/test/rekonqwindow_mock.hpp b/src/test/rekonqwindow_mock.hpp new file mode 100644 index 00000000..403237d4 --- /dev/null +++ b/src/test/rekonqwindow_mock.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "../rekonqwindow.hpp" +#include + +class FakeWindow : public RekonqWindow { + Q_OBJECT + +public: + explicit FakeWindow(QWidget *parent = nullptr) : RekonqWindow(parent) {} + ~FakeWindow() override = default; + + MOCK_METHOD(RekonqView *, currentView, (), (override)); + MOCK_METHOD(int, addView, (RekonqView *), (override)); + MOCK_METHOD(void, loadUrl, (rekonq::DefaultUrl, rekonq::OpenType), (override)); + MOCK_METHOD(void, loadUrl, (const QUrl &, rekonq::OpenType), (override)); +}; diff --git a/src/test/settings_mock.hpp b/src/test/settings_mock.hpp new file mode 120000 index 00000000..369a0abe --- /dev/null +++ b/src/test/settings_mock.hpp @@ -0,0 +1 @@ +../settings/test/settings_mock.hpp \ No newline at end of file diff --git a/src/test/test_rekonqwindow.cpp b/src/test/test_rekonqwindow.cpp new file mode 100644 index 00000000..9e90cd94 --- /dev/null +++ b/src/test/test_rekonqwindow.cpp @@ -0,0 +1,38 @@ +#include "rekonqwindow_mock.hpp" +#include "settings_mock.hpp" +#include +#include +#include + +using ::testing::_; // NOLINT(bugprone-reserved-identifier) +using ::testing::Matcher; +using ::testing::ReturnArg; + +TEST(RekonqWindow, mock_shortcuts) +{ + FakeWindow window; + EXPECT_CALL(window, currentView).Times(0); + EXPECT_CALL(window, addView).Times(0); + EXPECT_CALL(window, loadUrl(Matcher(_), _)).Times(0); + EXPECT_CALL(window, loadUrl(Matcher(_), _)).Times(0); + + for (auto *action : window.findChildren(QRegularExpression("^action.*"))) { + EXPECT_TRUE(action->shortcut().isEmpty()) << qUtf8Printable(action->objectName()); + } + + MockSettings settings; + EXPECT_CALL(settings, value).WillRepeatedly(ReturnArg<0>()); + + window.setupShortcuts(&settings); + for (auto *action : window.findChildren(QRegularExpression("^action.*"))) { + EXPECT_FALSE(action->shortcut().isEmpty()) << qUtf8Printable(action->objectName()); + } +} + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + QApplication app(argc, argv); + + return RUN_ALL_TESTS(); +} -- cgit v1.2.1