]> cloud.milkyroute.net Git - dolphin.git/blob - src/tests/kitemlistcontrollerexpandtest.cpp
Merge remote-tracking branch 'origin/master' into kf6
[dolphin.git] / src / tests / kitemlistcontrollerexpandtest.cpp
1 /*
2 * SPDX-FileCopyrightText: 2023 Méven Car <meven@kde.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "kitemviews/kfileitemlistview.h"
8 #include "kitemviews/kfileitemmodel.h"
9 #include "kitemviews/kitemlistcontainer.h"
10 #include "kitemviews/kitemlistcontroller.h"
11 #include "kitemviews/kitemlistselectionmanager.h"
12 #include "testdir.h"
13
14 #include <QSignalSpy>
15 #include <QStandardPaths>
16 #include <QTest>
17
18 class KItemListControllerExpandTest : public QObject
19 {
20 Q_OBJECT
21
22 private Q_SLOTS:
23 void initTestCase();
24 void cleanupTestCase();
25
26 void init();
27 void cleanup();
28
29 void testDirExpand();
30
31 private:
32 KFileItemListView *m_view;
33 KItemListController *m_controller;
34 KItemListSelectionManager *m_selectionManager;
35 KFileItemModel *m_model;
36 TestDir *m_testDir;
37 KItemListContainer *m_container;
38 QSignalSpy *m_spyDirectoryLoadingCompleted;
39 };
40
41 void KItemListControllerExpandTest::initTestCase()
42 {
43 QStandardPaths::setTestModeEnabled(true);
44 qRegisterMetaType<KItemSet>("KItemSet");
45
46 m_testDir = new TestDir();
47 m_model = new KFileItemModel();
48 m_view = new KFileItemListView();
49 m_controller = new KItemListController(m_model, m_view, this);
50 m_container = new KItemListContainer(m_controller);
51 m_controller = m_container->controller();
52 m_controller->setSelectionBehavior(KItemListController::MultiSelection);
53 m_selectionManager = m_controller->selectionManager();
54
55 QStringList files;
56 files << "dir1/file1";
57 files << "dir1/file2";
58 files << "dir1/file3";
59 files << "dir1/file4";
60 files << "dir1/file5";
61
62 files << "dir2/file1";
63 files << "dir2/file2";
64 files << "dir2/file3";
65 files << "dir2/file4";
66 files << "dir2/file5";
67
68 files << "dir3/file1";
69 files << "dir3/file2";
70 files << "dir3/file3";
71 files << "dir3/file4";
72 files << "dir3/file5";
73
74 m_testDir->createFiles(files);
75 m_model->loadDirectory(m_testDir->url());
76 m_spyDirectoryLoadingCompleted = new QSignalSpy(m_model, &KFileItemModel::directoryLoadingCompleted);
77 QVERIFY(m_spyDirectoryLoadingCompleted->wait());
78
79 m_container->show();
80 QVERIFY(QTest::qWaitForWindowExposed(m_container));
81 }
82 void KItemListControllerExpandTest::cleanupTestCase()
83 {
84 delete m_container;
85 m_container = nullptr;
86
87 delete m_testDir;
88 m_testDir = nullptr;
89 }
90
91 void KItemListControllerExpandTest::init()
92 {
93 m_selectionManager->setCurrentItem(0);
94 QCOMPARE(m_selectionManager->currentItem(), 0);
95
96 m_selectionManager->clearSelection();
97 QVERIFY(!m_selectionManager->hasSelection());
98 }
99
100 void KItemListControllerExpandTest::cleanup()
101 {
102 }
103
104 void KItemListControllerExpandTest::testDirExpand()
105 {
106 m_view->setItemLayout(KFileItemListView::DetailsLayout);
107 QCOMPARE(m_view->itemLayout(), KFileItemListView::DetailsLayout);
108 m_view->setSupportsItemExpanding(true);
109
110 // intial state
111 QCOMPARE(m_spyDirectoryLoadingCompleted->count(), 1);
112 QCOMPARE(m_model->count(), 3);
113 QCOMPARE(m_selectionManager->currentItem(), 0);
114 QCOMPARE(m_selectionManager->selectedItems().count(), 0);
115
116 // extend first folder
117 QTest::keyClick(m_container, Qt::Key_Right);
118 QVERIFY(m_spyDirectoryLoadingCompleted->wait());
119 QCOMPARE(m_model->count(), 8);
120 QCOMPARE(m_selectionManager->currentItem(), 0);
121 QCOMPARE(m_selectionManager->selectedItems().count(), 0);
122
123 // collapse folder
124 QTest::keyClick(m_container, Qt::Key_Left);
125
126 QCOMPARE(m_model->count(), 3);
127 QCOMPARE(m_selectionManager->currentItem(), 0);
128 QCOMPARE(m_selectionManager->selectedItems().count(), 0);
129
130 // make the first folder selected
131 QTest::keyClick(m_container, Qt::Key_Down);
132 QCOMPARE(m_model->count(), 3);
133 QCOMPARE(m_selectionManager->currentItem(), 1);
134 QCOMPARE(m_selectionManager->selectedItems().count(), 1);
135
136 QTest::keyClick(m_container, Qt::Key_Up);
137 QCOMPARE(m_model->count(), 3);
138 QCOMPARE(m_selectionManager->currentItem(), 0);
139 QCOMPARE(m_selectionManager->selectedItems().count(), 1);
140
141 // expand the two first folders
142 QTest::keyClick(m_container, Qt::Key_Down, Qt::ShiftModifier);
143 QCOMPARE(m_model->count(), 3);
144 QCOMPARE(m_selectionManager->currentItem(), 1);
145 QCOMPARE(m_selectionManager->selectedItems().count(), 2);
146
147 // precondition
148 QCOMPARE(m_spyDirectoryLoadingCompleted->count(), 2);
149
150 // expand selected folders
151 QTest::keyClick(m_container, Qt::Key_Right);
152 QVERIFY(QTest::qWaitFor(
153 [this]() {
154 return m_spyDirectoryLoadingCompleted->count() == 3;
155 },
156 100));
157 QCOMPARE(m_model->count(), 8);
158 QCOMPARE(m_selectionManager->currentItem(), 6);
159 QCOMPARE(m_selectionManager->selectedItems().count(), 2);
160
161 // collapse the folders
162 QTest::keyClick(m_container, Qt::Key_Left);
163 QCOMPARE(m_model->count(), 3);
164 QCOMPARE(m_selectionManager->currentItem(), 1);
165 QCOMPARE(m_selectionManager->selectedItems().count(), 2);
166
167 // select third folder
168 QTest::keyClick(m_container, Qt::Key_Down, Qt::ShiftModifier);
169 QCOMPARE(m_model->count(), 3);
170 QCOMPARE(m_selectionManager->currentItem(), 2);
171 QCOMPARE(m_selectionManager->selectedItems().count(), 3);
172
173 // precondition
174 QCOMPARE(m_spyDirectoryLoadingCompleted->count(), 3);
175
176 // expand the three folders
177 QTest::keyClick(m_container, Qt::Key_Right);
178
179 QVERIFY(QTest::qWaitFor(
180 [this]() {
181 return m_spyDirectoryLoadingCompleted->count() == 6;
182 },
183 300));
184
185 QCOMPARE(m_model->count(), 18);
186 QCOMPARE(m_selectionManager->currentItem(), 12);
187 QCOMPARE(m_selectionManager->selectedItems().count(), 3);
188
189 // collapse the folders
190 QTest::keyClick(m_container, Qt::Key_Left);
191 QCOMPARE(m_model->count(), 3);
192 QCOMPARE(m_selectionManager->currentItem(), 2);
193 QCOMPARE(m_selectionManager->selectedItems().count(), 3);
194
195 // shift select the directories
196 QTest::keyClick(m_container, Qt::Key_Up);
197 QCOMPARE(m_model->count(), 3);
198 QCOMPARE(m_selectionManager->currentItem(), 1);
199 QCOMPARE(m_selectionManager->selectedItems().count(), 1);
200
201 QTest::keyClick(m_container, Qt::Key_Up);
202 QCOMPARE(m_model->count(), 3);
203 QCOMPARE(m_selectionManager->currentItem(), 0);
204 QCOMPARE(m_selectionManager->selectedItems().count(), 1);
205
206 QTest::keyClick(m_container, Qt::Key_Down, Qt::ShiftModifier);
207 QTest::keyClick(m_container, Qt::Key_Down, Qt::ShiftModifier);
208
209 QCOMPARE(m_model->count(), 3);
210 QCOMPARE(m_selectionManager->currentItem(), 2);
211 QCOMPARE(m_selectionManager->selectedItems().count(), 3);
212
213 // expand the three folders with shift modifier
214 QTest::keyClick(m_container, Qt::Key_Right, Qt::ShiftModifier);
215
216 QVERIFY(QTest::qWaitFor(
217 [this]() {
218 return m_spyDirectoryLoadingCompleted->count() == 9;
219 },
220 100));
221
222 QCOMPARE(m_model->count(), 18);
223 QCOMPARE(m_selectionManager->currentItem(), 12);
224 QCOMPARE(m_selectionManager->selectedItems().count(), 13);
225
226 // collapse the folders
227 QTest::keyClick(m_container, Qt::Key_Left);
228 QCOMPARE(m_model->count(), 3);
229 QCOMPARE(m_selectionManager->currentItem(), 2);
230 QCOMPARE(m_selectionManager->selectedItems().count(), 3);
231 }
232
233 QTEST_MAIN(KItemListControllerExpandTest)
234
235 #include "kitemlistcontrollerexpandtest.moc"