1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the test suite of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29
30#include <QtTest/QtTest>
31#include <QtWidgets/private/qsidebar_p.h>
32#include <QtWidgets/private/qfilesystemmodel_p.h>
33
34class tst_QSidebar : public QObject {
35 Q_OBJECT
36
37private slots:
38 void setUrls();
39 void selectUrls();
40 void addUrls();
41
42 void goToUrl();
43};
44
45void tst_QSidebar::setUrls()
46{
47 QList<QUrl> urls;
48 QFileSystemModel fsmodel;
49 QSidebar qsidebar;
50 qsidebar.setModelAndUrls(model: &fsmodel, newUrls: urls);
51 QAbstractItemModel *model = qsidebar.model();
52
53 urls << QUrl::fromLocalFile(localfile: QDir::rootPath())
54 << QUrl::fromLocalFile(localfile: QDir::temp().absolutePath());
55
56 QCOMPARE(model->rowCount(), 0);
57 qsidebar.setUrls(urls);
58#ifdef Q_OS_WINRT
59 QEXPECT_FAIL("", "One of the URLs is not seen as valid on WinRT - QTBUG-68297", Abort);
60#endif
61 QCOMPARE(qsidebar.urls(), urls);
62 QCOMPARE(model->rowCount(), urls.count());
63 qsidebar.setUrls(urls);
64 QCOMPARE(model->rowCount(), urls.count());
65}
66
67void tst_QSidebar::selectUrls()
68{
69 QList<QUrl> urls;
70 urls << QUrl::fromLocalFile(localfile: QDir::rootPath())
71 << QUrl::fromLocalFile(localfile: QDir::temp().absolutePath());
72 QFileSystemModel fsmodel;
73 QSidebar qsidebar;
74 qsidebar.setModelAndUrls(model: &fsmodel, newUrls: urls);
75
76 QSignalSpy spy(&qsidebar, SIGNAL(goToUrl(QUrl)));
77 qsidebar.selectUrl(url: urls.at(i: 0));
78 QCOMPARE(spy.count(), 0);
79}
80
81void tst_QSidebar::addUrls()
82{
83 QList<QUrl> emptyUrls;
84 QFileSystemModel fsmodel;
85 QSidebar qsidebar;
86 qsidebar.setModelAndUrls(model: &fsmodel, newUrls: emptyUrls);
87 QAbstractItemModel *model = qsidebar.model();
88 QDir testDir = QDir::home();
89
90#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
91 // temp and home is the same directory on Android
92 testDir.mkdir(QStringLiteral("test"));
93 QVERIFY(testDir.cd(QStringLiteral("test")));
94#endif
95
96 // default
97 QCOMPARE(model->rowCount(), 0);
98
99 QList<QUrl> urls;
100 urls << QUrl::fromLocalFile(localfile: QDir::rootPath())
101 << QUrl::fromLocalFile(localfile: QDir::temp().absolutePath());
102
103 // test < 0
104 qsidebar.addUrls(list: urls, row: -1);
105#ifdef Q_OS_WINRT
106 QEXPECT_FAIL("", "One of the URLs is not seen as valid on WinRT - QTBUG-68297", Abort);
107#endif
108 QCOMPARE(model->rowCount(), 2);
109
110 // test = 0
111 qsidebar.setUrls(emptyUrls);
112 qsidebar.addUrls(list: urls, row: 0);
113 QCOMPARE(model->rowCount(), 2);
114
115 // test > 0
116 qsidebar.setUrls(emptyUrls);
117 qsidebar.addUrls(list: urls, row: 100);
118 QCOMPARE(model->rowCount(), 2);
119
120 // test inserting with already existing rows
121 QList<QUrl> moreUrls;
122 moreUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath());
123 qsidebar.addUrls(list: moreUrls, row: -1);
124 QCOMPARE(model->rowCount(), 3);
125
126 // make sure invalid urls are still added
127 QList<QUrl> badUrls;
128 badUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath() + "/I used to exist");
129 qsidebar.addUrls(list: badUrls, row: 0);
130 QCOMPARE(model->rowCount(), 4);
131
132 // check that every item has text and an icon including the above invalid one
133 for (int i = 0; i < model->rowCount(); ++i) {
134 QVERIFY(!model->index(i, 0).data().toString().isEmpty());
135 QIcon icon = qvariant_cast<QIcon>(v: model->index(row: i, column: 0).data(arole: Qt::DecorationRole));
136 QVERIFY(!icon.isNull());
137 }
138
139 // test moving up the list
140 qsidebar.setUrls(emptyUrls);
141 qsidebar.addUrls(list: urls, row: 100);
142 qsidebar.addUrls(list: moreUrls, row: 100);
143 QCOMPARE(model->rowCount(), 3);
144 qsidebar.addUrls(list: moreUrls, row: 1);
145 QCOMPARE(qsidebar.urls()[1], moreUrls[0]);
146
147 // test appending with -1
148 qsidebar.setUrls(emptyUrls);
149 qsidebar.addUrls(list: urls, row: -1);
150 qsidebar.addUrls(list: moreUrls, row: -1);
151 QCOMPARE(qsidebar.urls()[0], urls[0]);
152
153 QList<QUrl> doubleUrls;
154 //tow exact same paths, we have only one entry
155 doubleUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath());
156 doubleUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath());
157 qsidebar.setUrls(emptyUrls);
158 qsidebar.addUrls(list: doubleUrls, row: 1);
159 QCOMPARE(qsidebar.urls().size(), 1);
160
161 // Two paths that are effectively pointing to the same location
162 doubleUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath());
163 doubleUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath() + "/.");
164 qsidebar.setUrls(emptyUrls);
165 qsidebar.addUrls(list: doubleUrls, row: 1);
166 QCOMPARE(qsidebar.urls().size(), 1);
167
168 doubleUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath());
169 doubleUrls << QUrl::fromLocalFile(localfile: testDir.absolutePath().toUpper());
170 qsidebar.setUrls(emptyUrls);
171 qsidebar.addUrls(list: doubleUrls, row: 1);
172
173#ifdef Q_OS_WIN
174 //Windows is case insensitive so no duplicate entries in that case
175 QCOMPARE(qsidebar.urls().size(), 1);
176#else
177 //Two different paths we should have two entries
178 QCOMPARE(qsidebar.urls().size(), 2);
179#endif
180}
181
182void tst_QSidebar::goToUrl()
183{
184 QList<QUrl> urls;
185 urls << QUrl::fromLocalFile(localfile: QDir::rootPath())
186 << QUrl::fromLocalFile(localfile: QDir::temp().absolutePath());
187 QFileSystemModel fsmodel;
188 QSidebar qsidebar;
189 qsidebar.setModelAndUrls(model: &fsmodel, newUrls: urls);
190 qsidebar.show();
191
192 QSignalSpy spy(&qsidebar, SIGNAL(goToUrl(QUrl)));
193 QTest::mousePress(widget: qsidebar.viewport(), button: Qt::LeftButton, stateKey: {},
194 pos: qsidebar.visualRect(index: qsidebar.model()->index(row: 0, column: 0)).center());
195#ifdef Q_OS_WINRT
196 QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort);
197#endif
198 QCOMPARE(spy.count(), 1);
199 QCOMPARE((spy.value(0)).at(0).toUrl(), urls.first());
200}
201
202QTEST_MAIN(tst_QSidebar)
203#include "tst_qsidebar.moc"
204
205

source code of qtbase/tests/auto/widgets/dialogs/qsidebar/tst_qsidebar.cpp