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 m_controller
= m_container
->controller();
52 m_controller
->setSelectionBehavior(KItemListController::MultiSelection
);
53 m_selectionManager
= m_controller
->selectionManager();
56 files
<< "dir1/file1";
57 files
<< "dir1/file2";
58 files
<< "dir1/file3";
59 files
<< "dir1/file4";
60 files
<< "dir1/file5";
62 files
<< "dir2/file1";
63 files
<< "dir2/file2";
64 files
<< "dir2/file3";
65 files
<< "dir2/file4";
66 files
<< "dir2/file5";
68 files
<< "dir3/file1";
69 files
<< "dir3/file2";
70 files
<< "dir3/file3";
71 files
<< "dir3/file4";
72 files
<< "dir3/file5";
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());
80 QVERIFY(QTest::qWaitForWindowExposed(m_container
));
82 void KItemListControllerExpandTest::cleanupTestCase()
85 m_container
= nullptr;
91 void KItemListControllerExpandTest::init()
93 m_selectionManager
->setCurrentItem(0);
94 QCOMPARE(m_selectionManager
->currentItem(), 0);
96 m_selectionManager
->clearSelection();
97 QVERIFY(!m_selectionManager
->hasSelection());
100 void KItemListControllerExpandTest::cleanup()
104 void KItemListControllerExpandTest::testDirExpand()
106 m_view
->setItemLayout(KFileItemListView::DetailsLayout
);
107 QCOMPARE(m_view
->itemLayout(), KFileItemListView::DetailsLayout
);
108 m_view
->setSupportsItemExpanding(true);
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);
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);
124 QTest::keyClick(m_container
, Qt::Key_Left
);
126 QCOMPARE(m_model
->count(), 3);
127 QCOMPARE(m_selectionManager
->currentItem(), 0);
128 QCOMPARE(m_selectionManager
->selectedItems().count(), 0);
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);
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);
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);
148 QCOMPARE(m_spyDirectoryLoadingCompleted
->count(), 2);
150 // expand selected folders
151 QTest::keyClick(m_container
, Qt::Key_Right
);
152 QVERIFY(QTest::qWaitFor(
154 return m_spyDirectoryLoadingCompleted
->count() == 3;
157 QCOMPARE(m_model
->count(), 8);
158 QCOMPARE(m_selectionManager
->currentItem(), 6);
159 QCOMPARE(m_selectionManager
->selectedItems().count(), 2);
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);
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);
174 QCOMPARE(m_spyDirectoryLoadingCompleted
->count(), 3);
176 // expand the three folders
177 QTest::keyClick(m_container
, Qt::Key_Right
);
179 QVERIFY(QTest::qWaitFor(
181 return m_spyDirectoryLoadingCompleted
->count() == 6;
185 QCOMPARE(m_model
->count(), 18);
186 QCOMPARE(m_selectionManager
->currentItem(), 12);
187 QCOMPARE(m_selectionManager
->selectedItems().count(), 3);
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);
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);
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);
206 QTest::keyClick(m_container
, Qt::Key_Down
, Qt::ShiftModifier
);
207 QTest::keyClick(m_container
, Qt::Key_Down
, Qt::ShiftModifier
);
209 QCOMPARE(m_model
->count(), 3);
210 QCOMPARE(m_selectionManager
->currentItem(), 2);
211 QCOMPARE(m_selectionManager
->selectedItems().count(), 3);
213 // expand the three folders with shift modifier
214 QTest::keyClick(m_container
, Qt::Key_Right
, Qt::ShiftModifier
);
216 QVERIFY(QTest::qWaitFor(
218 return m_spyDirectoryLoadingCompleted
->count() == 9;
222 QCOMPARE(m_model
->count(), 18);
223 QCOMPARE(m_selectionManager
->currentItem(), 12);
224 QCOMPARE(m_selectionManager
->selectedItems().count(), 13);
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);
233 QTEST_MAIN(KItemListControllerExpandTest
)
235 #include "kitemlistcontrollerexpandtest.moc"