2 * SPDX-FileCopyrightText: 2023 Méven Car <meven@kde.org>
4 * SPDX-License-Identifier: GPL-2.0-or-later
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"
15 #include <QStandardPaths>
18 class KItemListControllerExpandTest
: public QObject
24 void cleanupTestCase();
32 KFileItemListView
*m_view
;
33 KItemListController
*m_controller
;
34 KItemListSelectionManager
*m_selectionManager
;
35 KFileItemModel
*m_model
;
37 KItemListContainer
*m_container
;
38 QSignalSpy
*m_spyDirectoryLoadingCompleted
;
41 void KItemListControllerExpandTest::initTestCase()
43 QStandardPaths::setTestModeEnabled(true);
44 qRegisterMetaType
<KItemSet
>("KItemSet");
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 #ifndef QT_NO_ACCESSIBILITY
52 m_view
->setAccessibleParentsObject(m_container
);
54 m_controller
= m_container
->controller();
55 m_controller
->setSelectionBehavior(KItemListController::MultiSelection
);
56 m_selectionManager
= m_controller
->selectionManager();
59 files
<< "dir1/file1";
60 files
<< "dir1/file2";
61 files
<< "dir1/file3";
62 files
<< "dir1/file4";
63 files
<< "dir1/file5";
65 files
<< "dir2/file1";
66 files
<< "dir2/file2";
67 files
<< "dir2/file3";
68 files
<< "dir2/file4";
69 files
<< "dir2/file5";
71 files
<< "dir3/file1";
72 files
<< "dir3/file2";
73 files
<< "dir3/file3";
74 files
<< "dir3/file4";
75 files
<< "dir3/file5";
77 m_testDir
->createFiles(files
);
78 m_model
->loadDirectory(m_testDir
->url());
79 m_spyDirectoryLoadingCompleted
= new QSignalSpy(m_model
, &KFileItemModel::directoryLoadingCompleted
);
80 QVERIFY(m_spyDirectoryLoadingCompleted
->wait());
83 QVERIFY(QTest::qWaitForWindowExposed(m_container
));
85 void KItemListControllerExpandTest::cleanupTestCase()
88 m_container
= nullptr;
94 void KItemListControllerExpandTest::init()
96 m_selectionManager
->setCurrentItem(0);
97 QCOMPARE(m_selectionManager
->currentItem(), 0);
99 m_selectionManager
->clearSelection();
100 QVERIFY(!m_selectionManager
->hasSelection());
103 void KItemListControllerExpandTest::cleanup()
107 void KItemListControllerExpandTest::testDirExpand()
109 m_view
->setItemLayout(KFileItemListView::DetailsLayout
);
110 QCOMPARE(m_view
->itemLayout(), KFileItemListView::DetailsLayout
);
111 m_view
->setSupportsItemExpanding(true);
114 QCOMPARE(m_spyDirectoryLoadingCompleted
->count(), 1);
115 QCOMPARE(m_model
->count(), 3);
116 QCOMPARE(m_selectionManager
->currentItem(), 0);
117 QCOMPARE(m_selectionManager
->selectedItems().count(), 0);
119 // extend first folder
120 QTest::keyClick(m_container
, Qt::Key_Right
);
121 QVERIFY(m_spyDirectoryLoadingCompleted
->wait());
122 QCOMPARE(m_model
->count(), 8);
123 QCOMPARE(m_selectionManager
->currentItem(), 0);
124 QCOMPARE(m_selectionManager
->selectedItems().count(), 0);
127 QTest::keyClick(m_container
, Qt::Key_Left
);
129 QCOMPARE(m_model
->count(), 3);
130 QCOMPARE(m_selectionManager
->currentItem(), 0);
131 QCOMPARE(m_selectionManager
->selectedItems().count(), 0);
133 // make the first folder selected
134 QTest::keyClick(m_container
, Qt::Key_Down
);
135 QCOMPARE(m_model
->count(), 3);
136 QCOMPARE(m_selectionManager
->currentItem(), 1);
137 QCOMPARE(m_selectionManager
->selectedItems().count(), 1);
139 QTest::keyClick(m_container
, Qt::Key_Up
);
140 QCOMPARE(m_model
->count(), 3);
141 QCOMPARE(m_selectionManager
->currentItem(), 0);
142 QCOMPARE(m_selectionManager
->selectedItems().count(), 1);
144 // expand the two first folders
145 QTest::keyClick(m_container
, Qt::Key_Down
, Qt::ShiftModifier
);
146 QCOMPARE(m_model
->count(), 3);
147 QCOMPARE(m_selectionManager
->currentItem(), 1);
148 QCOMPARE(m_selectionManager
->selectedItems().count(), 2);
151 QCOMPARE(m_spyDirectoryLoadingCompleted
->count(), 2);
153 // expand selected folders
154 QTest::keyClick(m_container
, Qt::Key_Right
);
155 QVERIFY(QTest::qWaitFor(
157 return m_spyDirectoryLoadingCompleted
->count() == 3;
160 QCOMPARE(m_model
->count(), 8);
161 QCOMPARE(m_selectionManager
->currentItem(), 6);
162 QCOMPARE(m_selectionManager
->selectedItems().count(), 2);
164 // collapse the folders
165 QTest::keyClick(m_container
, Qt::Key_Left
);
166 QCOMPARE(m_model
->count(), 3);
167 QCOMPARE(m_selectionManager
->currentItem(), 1);
168 QCOMPARE(m_selectionManager
->selectedItems().count(), 2);
170 // select third folder
171 QTest::keyClick(m_container
, Qt::Key_Down
, Qt::ShiftModifier
);
172 QCOMPARE(m_model
->count(), 3);
173 QCOMPARE(m_selectionManager
->currentItem(), 2);
174 QCOMPARE(m_selectionManager
->selectedItems().count(), 3);
177 QCOMPARE(m_spyDirectoryLoadingCompleted
->count(), 3);
179 // expand the three folders
180 QTest::keyClick(m_container
, Qt::Key_Right
);
182 QVERIFY(QTest::qWaitFor(
184 return m_spyDirectoryLoadingCompleted
->count() == 6;
188 QCOMPARE(m_model
->count(), 18);
189 QCOMPARE(m_selectionManager
->currentItem(), 12);
190 QCOMPARE(m_selectionManager
->selectedItems().count(), 3);
192 // collapse the folders
193 QTest::keyClick(m_container
, Qt::Key_Left
);
194 QCOMPARE(m_model
->count(), 3);
195 QCOMPARE(m_selectionManager
->currentItem(), 2);
196 QCOMPARE(m_selectionManager
->selectedItems().count(), 3);
198 // shift select the directories
199 QTest::keyClick(m_container
, Qt::Key_Up
);
200 QCOMPARE(m_model
->count(), 3);
201 QCOMPARE(m_selectionManager
->currentItem(), 1);
202 QCOMPARE(m_selectionManager
->selectedItems().count(), 1);
204 QTest::keyClick(m_container
, Qt::Key_Up
);
205 QCOMPARE(m_model
->count(), 3);
206 QCOMPARE(m_selectionManager
->currentItem(), 0);
207 QCOMPARE(m_selectionManager
->selectedItems().count(), 1);
209 QTest::keyClick(m_container
, Qt::Key_Down
, Qt::ShiftModifier
);
210 QTest::keyClick(m_container
, Qt::Key_Down
, Qt::ShiftModifier
);
212 QCOMPARE(m_model
->count(), 3);
213 QCOMPARE(m_selectionManager
->currentItem(), 2);
214 QCOMPARE(m_selectionManager
->selectedItems().count(), 3);
216 // expand the three folders with shift modifier
217 QTest::keyClick(m_container
, Qt::Key_Right
, Qt::ShiftModifier
);
219 QVERIFY(QTest::qWaitFor(
221 return m_spyDirectoryLoadingCompleted
->count() == 9;
225 QCOMPARE(m_model
->count(), 18);
226 QCOMPARE(m_selectionManager
->currentItem(), 12);
227 QCOMPARE(m_selectionManager
->selectedItems().count(), 13);
229 // collapse the folders
230 QTest::keyClick(m_container
, Qt::Key_Left
);
231 QCOMPARE(m_model
->count(), 3);
232 QCOMPARE(m_selectionManager
->currentItem(), 2);
233 QCOMPARE(m_selectionManager
->selectedItems().count(), 3);
236 QTEST_MAIN(KItemListControllerExpandTest
)
238 #include "kitemlistcontrollerexpandtest.moc"