]> cloud.milkyroute.net Git - dolphin.git/blob - src/tests/dolphinmainwindowtest.cpp
Tabs: ensure to have folder icons for remote folders
[dolphin.git] / src / tests / dolphinmainwindowtest.cpp
1 /*
2 * SPDX-FileCopyrightText: 2017 Elvis Angelaccio <elvis.angelaccio@kde.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "dolphinmainwindow.h"
8 #include "dolphinnewfilemenu.h"
9 #include "dolphintabpage.h"
10 #include "dolphintabwidget.h"
11 #include "dolphinviewcontainer.h"
12
13 #include <KActionCollection>
14
15 #include <QSignalSpy>
16 #include <QStandardPaths>
17 #include <QTest>
18
19 class DolphinMainWindowTest : public QObject
20 {
21 Q_OBJECT
22
23 private Q_SLOTS:
24 void initTestCase();
25 void init();
26 void testClosingTabsWithSearchBoxVisible();
27 void testActiveViewAfterClosingSplitView_data();
28 void testActiveViewAfterClosingSplitView();
29 void testUpdateWindowTitleAfterClosingSplitView();
30 void testUpdateWindowTitleAfterChangingSplitView();
31 void testOpenInNewTabTitle();
32 void testNewFileMenuEnabled_data();
33 void testNewFileMenuEnabled();
34 void testWindowTitle_data();
35 void testWindowTitle();
36
37
38
39 private:
40 QScopedPointer<DolphinMainWindow> m_mainWindow;
41 };
42
43 void DolphinMainWindowTest::initTestCase()
44 {
45 QStandardPaths::setTestModeEnabled(true);
46 }
47
48 void DolphinMainWindowTest::init()
49 {
50 m_mainWindow.reset(new DolphinMainWindow());
51 }
52
53 // See https://bugs.kde.org/show_bug.cgi?id=379135
54 void DolphinMainWindowTest::testClosingTabsWithSearchBoxVisible()
55 {
56 m_mainWindow->openDirectories({ QUrl::fromLocalFile(QDir::homePath()) }, false);
57 m_mainWindow->show();
58 // Without this call the searchbox doesn't get FocusIn events.
59 QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data()));
60 QVERIFY(m_mainWindow->isVisible());
61
62 auto tabWidget = m_mainWindow->findChild<DolphinTabWidget*>("tabWidget");
63 QVERIFY(tabWidget);
64
65 // Show search box on first tab.
66 tabWidget->currentTabPage()->activeViewContainer()->setSearchModeEnabled(true);
67
68 tabWidget->openNewActivatedTab(QUrl::fromLocalFile(QDir::homePath()));
69 QCOMPARE(tabWidget->count(), 2);
70
71 // Triggers the crash in bug #379135.
72 tabWidget->closeTab();
73 QCOMPARE(tabWidget->count(), 1);
74 }
75
76 void DolphinMainWindowTest::testActiveViewAfterClosingSplitView_data()
77 {
78 QTest::addColumn<bool>("closeLeftView");
79
80 QTest::newRow("close left view") << true;
81 QTest::newRow("close right view") << false;
82 }
83
84 void DolphinMainWindowTest::testActiveViewAfterClosingSplitView()
85 {
86 m_mainWindow->openDirectories({ QUrl::fromLocalFile(QDir::homePath()) }, false);
87 m_mainWindow->show();
88 QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data()));
89 QVERIFY(m_mainWindow->isVisible());
90
91 auto tabWidget = m_mainWindow->findChild<DolphinTabWidget*>("tabWidget");
92 QVERIFY(tabWidget);
93 QVERIFY(tabWidget->currentTabPage()->primaryViewContainer());
94 QVERIFY(!tabWidget->currentTabPage()->secondaryViewContainer());
95
96 // Open split view.
97 m_mainWindow->actionCollection()->action(QStringLiteral("split_view"))->trigger();
98 QVERIFY(tabWidget->currentTabPage()->splitViewEnabled());
99 QVERIFY(tabWidget->currentTabPage()->secondaryViewContainer());
100
101 // Make sure the right view is the active one.
102 auto leftViewContainer = tabWidget->currentTabPage()->primaryViewContainer();
103 auto rightViewContainer = tabWidget->currentTabPage()->secondaryViewContainer();
104 QVERIFY(!leftViewContainer->isActive());
105 QVERIFY(rightViewContainer->isActive());
106
107 QFETCH(bool, closeLeftView);
108 if (closeLeftView) {
109 // Activate left view.
110 leftViewContainer->setActive(true);
111 QVERIFY(leftViewContainer->isActive());
112 QVERIFY(!rightViewContainer->isActive());
113
114 // Close left view. The secondary view (which was on the right) will become the primary one and must be active.
115 m_mainWindow->actionCollection()->action(QStringLiteral("split_view"))->trigger();
116 QVERIFY(!leftViewContainer->isActive());
117 QVERIFY(rightViewContainer->isActive());
118 QCOMPARE(rightViewContainer, tabWidget->currentTabPage()->activeViewContainer());
119 } else {
120 // Close right view. The left view will become active.
121 m_mainWindow->actionCollection()->action(QStringLiteral("split_view"))->trigger();
122 QVERIFY(leftViewContainer->isActive());
123 QVERIFY(!rightViewContainer->isActive());
124 QCOMPARE(leftViewContainer, tabWidget->currentTabPage()->activeViewContainer());
125 }
126 }
127
128 // Test case for bug #385111
129 void DolphinMainWindowTest::testUpdateWindowTitleAfterClosingSplitView()
130 {
131 m_mainWindow->openDirectories({ QUrl::fromLocalFile(QDir::homePath()) }, false);
132 m_mainWindow->show();
133 QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data()));
134 QVERIFY(m_mainWindow->isVisible());
135
136 auto tabWidget = m_mainWindow->findChild<DolphinTabWidget*>("tabWidget");
137 QVERIFY(tabWidget);
138 QVERIFY(tabWidget->currentTabPage()->primaryViewContainer());
139 QVERIFY(!tabWidget->currentTabPage()->secondaryViewContainer());
140
141 // Open split view.
142 m_mainWindow->actionCollection()->action(QStringLiteral("split_view"))->trigger();
143 QVERIFY(tabWidget->currentTabPage()->splitViewEnabled());
144 QVERIFY(tabWidget->currentTabPage()->secondaryViewContainer());
145
146 // Make sure the right view is the active one.
147 auto leftViewContainer = tabWidget->currentTabPage()->primaryViewContainer();
148 auto rightViewContainer = tabWidget->currentTabPage()->secondaryViewContainer();
149 QVERIFY(!leftViewContainer->isActive());
150 QVERIFY(rightViewContainer->isActive());
151
152 // Activate left view.
153 leftViewContainer->setActive(true);
154 QVERIFY(leftViewContainer->isActive());
155 QVERIFY(!rightViewContainer->isActive());
156
157 // Close split view. The secondary view (which was on the right) will become the primary one and must be active.
158 m_mainWindow->actionCollection()->action(QStringLiteral("split_view"))->trigger();
159 QVERIFY(!leftViewContainer->isActive());
160 QVERIFY(rightViewContainer->isActive());
161 QCOMPARE(rightViewContainer, tabWidget->currentTabPage()->activeViewContainer());
162
163 // Change URL and make sure we emit the currentUrlChanged signal (which triggers the window title update).
164 QSignalSpy currentUrlChangedSpy(tabWidget, &DolphinTabWidget::currentUrlChanged);
165 tabWidget->currentTabPage()->activeViewContainer()->setUrl(QUrl::fromLocalFile(QDir::rootPath()));
166 QCOMPARE(currentUrlChangedSpy.count(), 1);
167 }
168
169 // Test case for bug #402641
170 void DolphinMainWindowTest::testUpdateWindowTitleAfterChangingSplitView()
171 {
172 m_mainWindow->openDirectories({ QUrl::fromLocalFile(QDir::homePath()) }, false);
173 m_mainWindow->show();
174 QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data()));
175 QVERIFY(m_mainWindow->isVisible());
176
177 auto tabWidget = m_mainWindow->findChild<DolphinTabWidget*>("tabWidget");
178 QVERIFY(tabWidget);
179
180 // Open split view.
181 m_mainWindow->actionCollection()->action(QStringLiteral("split_view"))->trigger();
182 QVERIFY(tabWidget->currentTabPage()->splitViewEnabled());
183
184 auto leftViewContainer = tabWidget->currentTabPage()->primaryViewContainer();
185 auto rightViewContainer = tabWidget->currentTabPage()->secondaryViewContainer();
186
187 // Store old window title.
188 const auto oldTitle = m_mainWindow->windowTitle();
189
190 // Change URL in the right view and make sure the title gets updated.
191 rightViewContainer->setUrl(QUrl::fromLocalFile(QDir::rootPath()));
192 QVERIFY(m_mainWindow->windowTitle() != oldTitle);
193
194 // Activate back the left view and check whether the old title gets restored.
195 leftViewContainer->setActive(true);
196 QCOMPARE(m_mainWindow->windowTitle(), oldTitle);
197 }
198
199 // Test case for bug #397910
200 void DolphinMainWindowTest::testOpenInNewTabTitle()
201 {
202 m_mainWindow->openDirectories({ QUrl::fromLocalFile(QDir::homePath()) }, false);
203 m_mainWindow->show();
204 QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data()));
205 QVERIFY(m_mainWindow->isVisible());
206
207 auto tabWidget = m_mainWindow->findChild<DolphinTabWidget*>("tabWidget");
208 QVERIFY(tabWidget);
209
210 tabWidget->openNewTab(QUrl::fromLocalFile(QDir::tempPath()));
211 QCOMPARE(tabWidget->count(), 2);
212 QVERIFY(tabWidget->tabText(0) != tabWidget->tabText(1));
213 if (!tabWidget->tabIcon(0).isNull() && !tabWidget->tabIcon(1).isNull()) {
214 QCOMPARE(QStringLiteral("inode-directory"), tabWidget->tabIcon(0).name());
215 QCOMPARE(QStringLiteral("inode-directory"), tabWidget->tabIcon(1).name());
216 }
217 }
218
219 void DolphinMainWindowTest::testNewFileMenuEnabled_data()
220 {
221 QTest::addColumn<QUrl>("activeViewUrl");
222 QTest::addColumn<bool>("expectedEnabled");
223
224 QTest::newRow("home") << QUrl::fromLocalFile(QDir::homePath()) << true;
225 QTest::newRow("root") << QUrl::fromLocalFile(QDir::rootPath()) << false;
226 QTest::newRow("trash") << QUrl::fromUserInput(QStringLiteral("trash:/")) << false;
227 }
228
229 void DolphinMainWindowTest::testNewFileMenuEnabled()
230 {
231 QFETCH(QUrl, activeViewUrl);
232 m_mainWindow->openDirectories({ activeViewUrl }, false);
233 m_mainWindow->show();
234 QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data()));
235 QVERIFY(m_mainWindow->isVisible());
236
237 auto newFileMenu = m_mainWindow->findChild<DolphinNewFileMenu*>("new_menu");
238 QVERIFY(newFileMenu);
239
240 QFETCH(bool, expectedEnabled);
241 QTRY_COMPARE(newFileMenu->isEnabled(), expectedEnabled);
242 }
243
244 void DolphinMainWindowTest::testWindowTitle_data()
245 {
246 QTest::addColumn<QUrl>("activeViewUrl");
247 QTest::addColumn<QString>("expectedWindowTitle");
248
249 // TODO: this test should enforce the english locale.
250 QTest::newRow("home") << QUrl::fromLocalFile(QDir::homePath()) << QStringLiteral("Home");
251 QTest::newRow("home with trailing slash") << QUrl::fromLocalFile(QStringLiteral("%1/").arg(QDir::homePath())) << QStringLiteral("Home");
252 QTest::newRow("trash") << QUrl::fromUserInput(QStringLiteral("trash:/")) << QStringLiteral("Trash");
253 }
254
255 void DolphinMainWindowTest::testWindowTitle()
256 {
257 QFETCH(QUrl, activeViewUrl);
258 m_mainWindow->openDirectories({ activeViewUrl }, false);
259 m_mainWindow->show();
260 QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data()));
261 QVERIFY(m_mainWindow->isVisible());
262
263 QFETCH(QString, expectedWindowTitle);
264 QCOMPARE(m_mainWindow->windowTitle(), expectedWindowTitle);
265 }
266
267 QTEST_MAIN(DolphinMainWindowTest)
268
269 #include "dolphinmainwindowtest.moc"