Changeset View
Changeset View
Standalone View
Standalone View
containments/desktop/plugins/folder/autotests/positionertest.cpp
Show All 23 Lines | |||||
24 | #include <QTest> | 24 | #include <QTest> | ||
25 | 25 | | |||
26 | #include <QTest> | 26 | #include <QTest> | ||
27 | #include <QTemporaryDir> | 27 | #include <QTemporaryDir> | ||
28 | #include <QSignalSpy> | 28 | #include <QSignalSpy> | ||
29 | 29 | | |||
30 | #include "foldermodel.h" | 30 | #include "foldermodel.h" | ||
31 | #include "positioner.h" | 31 | #include "positioner.h" | ||
32 | #include "screenmapper.h" | ||||
32 | 33 | | |||
33 | QTEST_MAIN(PositionerTest) | 34 | QTEST_MAIN(PositionerTest) | ||
34 | 35 | | |||
35 | static const QLatin1String desktop(QLatin1String("Desktop")); | 36 | static const QLatin1String desktop(QLatin1String("Desktop")); | ||
36 | 37 | | |||
37 | void PositionerTest::initTestCase() | 38 | void PositionerTest::initTestCase() | ||
38 | { | 39 | { | ||
39 | m_folderDir = new QTemporaryDir(); | 40 | m_folderDir = new QTemporaryDir(); | ||
Show All 13 Lines | |||||
53 | void PositionerTest::cleanupTestCase() | 54 | void PositionerTest::cleanupTestCase() | ||
54 | { | 55 | { | ||
55 | delete m_folderDir; | 56 | delete m_folderDir; | ||
56 | } | 57 | } | ||
57 | 58 | | |||
58 | void PositionerTest::init() | 59 | void PositionerTest::init() | ||
59 | { | 60 | { | ||
60 | m_folderModel = new FolderModel(this); | 61 | m_folderModel = new FolderModel(this); | ||
62 | m_folderModel->setScreen(0); | ||||
63 | m_folderModel->setScreenMapper(ScreenMapper::instance()); | ||||
64 | m_folderModel->setUsedByContainment(true); | ||||
61 | m_positioner = new Positioner(this); | 65 | m_positioner = new Positioner(this); | ||
62 | m_positioner->setEnabled(true); | 66 | m_positioner->setEnabled(true); | ||
63 | m_positioner->setFolderModel(m_folderModel); | 67 | m_positioner->setFolderModel(m_folderModel); | ||
64 | m_positioner->setPerStripe(3); | 68 | m_positioner->setPerStripe(3); | ||
65 | 69 | | |||
66 | m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop ); | 70 | m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop ); | ||
67 | QSignalSpy s(m_folderModel, &FolderModel::listingCompleted); | 71 | QSignalSpy s(m_folderModel, &FolderModel::listingCompleted); | ||
68 | s.wait(1000); | 72 | s.wait(1000); | ||
▲ Show 20 Lines • Show All 135 Lines • ▼ Show 20 Line(s) | 201 | { | |||
204 | //No change | 208 | //No change | ||
205 | positioner.setPerStripe(1); | 209 | positioner.setPerStripe(1); | ||
206 | QCOMPARE(s.count(), 1); | 210 | QCOMPARE(s.count(), 1); | ||
207 | 211 | | |||
208 | positioner.setPerStripe(4); | 212 | positioner.setPerStripe(4); | ||
209 | QCOMPARE(s.count(), 2); | 213 | QCOMPARE(s.count(), 2); | ||
210 | } | 214 | } | ||
211 | 215 | | |||
216 | void PositionerTest::tst_proxyMapping() | ||||
217 | { | ||||
218 | auto *screenMapper = ScreenMapper::instance(); | ||||
219 | FolderModel secondFolderModel; | ||||
220 | secondFolderModel.setUrl(m_folderDir->path() + QDir::separator() + desktop ); | ||||
221 | secondFolderModel.setUsedByContainment(true); | ||||
222 | secondFolderModel.setScreenMapper(screenMapper); | ||||
223 | secondFolderModel.setScreen(1); | ||||
224 | Positioner secondPositioner; | ||||
225 | secondPositioner.setEnabled(true); | ||||
226 | secondPositioner.setFolderModel(&secondFolderModel); | ||||
227 | secondPositioner.setPerStripe(3); | ||||
228 | | ||||
229 | QSignalSpy s2(&secondFolderModel, &FolderModel::listingCompleted); | ||||
230 | QVERIFY(s2.wait(1000)); | ||||
231 | | ||||
232 | QHash<int, int> expectedSource2ProxyScreen0; | ||||
233 | QHash<int, int> expectedProxy2SourceScreen0; | ||||
234 | QHash<int, int> expectedProxy2SourceScreen1; | ||||
235 | QHash<int, int> expectedSource2ProxyScreen1; | ||||
236 | | ||||
237 | for (int i = 0; i < m_folderModel->rowCount(); i++) { | ||||
238 | expectedSource2ProxyScreen0[i] = i; | ||||
239 | expectedProxy2SourceScreen0[i] = i; | ||||
240 | } | ||||
241 | | ||||
242 | // swap items 1 and 2 in the positioner | ||||
243 | m_positioner->move({1, 2, 2, 1}); | ||||
244 | expectedSource2ProxyScreen0[1] = 2; | ||||
245 | expectedSource2ProxyScreen0[2] = 1; | ||||
246 | expectedProxy2SourceScreen0[1] = 2; | ||||
247 | expectedProxy2SourceScreen0[2] = 1; | ||||
248 | | ||||
249 | auto savedSource2ProxyScreen0 = expectedSource2ProxyScreen0; | ||||
250 | auto savedProxy2SourceScreen0 = expectedProxy2SourceScreen0; | ||||
251 | | ||||
252 | auto verifyMapping = [](const QHash<int, int> &actual, const QHash<int, int> &expected) { | ||||
253 | | ||||
254 | auto ensureUnique = [](const QHash<int, int> mapping) { | ||||
255 | auto values = mapping.values(); | ||||
256 | qSort(values); | ||||
257 | auto uniqueValues = values.toSet().toList(); | ||||
258 | qSort(uniqueValues); | ||||
259 | QVERIFY(uniqueValues == values); | ||||
260 | }; | ||||
261 | | ||||
262 | ensureUnique(actual); | ||||
263 | QCOMPARE(actual, expected); | ||||
264 | }; | ||||
265 | | ||||
266 | verifyMapping(m_positioner->proxyToSourceMapping(), expectedProxy2SourceScreen0); | ||||
267 | verifyMapping(m_positioner->sourceToProxyMapping(), expectedSource2ProxyScreen0); | ||||
268 | verifyMapping(secondPositioner.proxyToSourceMapping(), expectedProxy2SourceScreen1); | ||||
269 | verifyMapping(secondPositioner.sourceToProxyMapping(), expectedSource2ProxyScreen1); | ||||
270 | | ||||
271 | const auto movedItem = m_folderModel->index(1, 0).data(FolderModel::UrlRole).toString(); | ||||
272 | | ||||
273 | // move the item 1 from source (now in position 2) to the second screen | ||||
274 | screenMapper->addMapping(movedItem, 1); | ||||
275 | | ||||
276 | expectedProxy2SourceScreen1[0] = 0; | ||||
277 | expectedSource2ProxyScreen1[0] = 0; | ||||
278 | expectedSource2ProxyScreen0.clear(); | ||||
279 | expectedProxy2SourceScreen0.clear(); | ||||
280 | for (int i = 0; i < m_folderModel->rowCount(); i++) { | ||||
281 | // as item 1 disappeared, the mapping of all items after that are shifted | ||||
282 | auto proxyIndex = (i <= 1) ? i : i + 1; | ||||
283 | expectedProxy2SourceScreen0[proxyIndex] = i; | ||||
284 | expectedSource2ProxyScreen0[i] = proxyIndex; | ||||
285 | } | ||||
286 | | ||||
287 | verifyMapping(m_positioner->proxyToSourceMapping(), expectedProxy2SourceScreen0); | ||||
288 | verifyMapping(m_positioner->sourceToProxyMapping(), expectedSource2ProxyScreen0); | ||||
289 | verifyMapping(secondPositioner.proxyToSourceMapping(), expectedProxy2SourceScreen1); | ||||
290 | verifyMapping(secondPositioner.sourceToProxyMapping(), expectedSource2ProxyScreen1); | ||||
291 | | ||||
292 | // move back the same item to the first screen | ||||
293 | screenMapper->addMapping(movedItem, 0); | ||||
294 | | ||||
295 | // nothing on the second screen | ||||
296 | expectedSource2ProxyScreen1.clear(); | ||||
297 | expectedProxy2SourceScreen1.clear(); | ||||
298 | // first screen should look like in the beginning | ||||
299 | expectedSource2ProxyScreen0 = savedSource2ProxyScreen0; | ||||
300 | expectedProxy2SourceScreen0 = savedProxy2SourceScreen0; | ||||
301 | | ||||
302 | verifyMapping(m_positioner->proxyToSourceMapping(), expectedProxy2SourceScreen0); | ||||
303 | verifyMapping(m_positioner->sourceToProxyMapping(), expectedSource2ProxyScreen0); | ||||
304 | verifyMapping(secondPositioner.proxyToSourceMapping(), expectedProxy2SourceScreen1); | ||||
305 | verifyMapping(secondPositioner.sourceToProxyMapping(), expectedSource2ProxyScreen1); | ||||
306 | } | ||||
307 | | ||||
212 | void PositionerTest::checkPositions(int perStripe) | 308 | void PositionerTest::checkPositions(int perStripe) | ||
213 | { | 309 | { | ||
214 | QSignalSpy s(m_positioner, &Positioner::positionsChanged); | 310 | QSignalSpy s(m_positioner, &Positioner::positionsChanged); | ||
215 | s.wait(500); | 311 | s.wait(500); | ||
216 | 312 | | |||
217 | const auto positions = m_positioner->positions(); | 313 | const auto positions = m_positioner->positions(); | ||
218 | struct Pos { | 314 | struct Pos { | ||
219 | int x; | 315 | int x; | ||
Show All 25 Lines |