1 /* ============================================================
2 * Falkon - Qt web browser
3 * Copyright (C) 2018 David Rosca <nowrep@gmail.com>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 * ============================================================ */
18 #include "tabmodeltest.h"
19 #include "autotests.h"
20 #include "tabmodel.h"
21 #include "tabtreemodel.h"
22 #include "tabmrumodel.h"
23 #include "webtab.h"
24 #include "tabwidget.h"
25 #include "mainapplication.h"
26 #include "browserwindow.h"
27
28 #include "modeltest.h"
29
initTestCase()30 void TabModelTest::initTestCase()
31 {
32 }
33
cleanupTestCase()34 void TabModelTest::cleanupTestCase()
35 {
36 }
37
basicTest()38 void TabModelTest::basicTest()
39 {
40 BrowserWindow *w = mApp->createWindow(Qz::BW_NewWindow);
41
42 TabModel model1(w);
43 ModelTest modelTest(&model1);
44
45 QSignalSpy rowsInsertedSpy(&model1, &TabModel::rowsInserted);
46 QSignalSpy rowsRemovedSpy(&model1, &TabModel::rowsRemoved);
47
48 QCOMPARE(model1.rowCount(), 0);
49
50 rowsInsertedSpy.wait();
51
52 QCOMPARE(rowsInsertedSpy.count(), 1);
53 WebTab *tab0 = w->tabWidget()->webTab(0);
54 QCOMPARE(rowsInsertedSpy.at(0).at(0).value<QModelIndex>(), QModelIndex());
55 QCOMPARE(rowsInsertedSpy.at(0).at(1).toInt(), 0);
56 QCOMPARE(rowsInsertedSpy.at(0).at(2).toInt(), 0);
57 QCOMPARE(model1.data(model1.index(0, 0), TabModel::WebTabRole).value<WebTab*>(), tab0);
58
59 rowsInsertedSpy.clear();
60
61 w->tabWidget()->addView(QUrl("http://test.com"));
62
63 QCOMPARE(rowsInsertedSpy.count(), 1);
64 WebTab *tab1 = w->tabWidget()->webTab(1);
65 QCOMPARE(rowsInsertedSpy.at(0).at(0).value<QModelIndex>(), QModelIndex());
66 QCOMPARE(rowsInsertedSpy.at(0).at(1).toInt(), 1);
67 QCOMPARE(rowsInsertedSpy.at(0).at(2).toInt(), 1);
68 QCOMPARE(model1.data(model1.index(1, 0), TabModel::WebTabRole).value<WebTab*>(), tab1);
69
70 w->tabWidget()->moveTab(0, 1);
71 QCOMPARE(w->tabWidget()->webTab(0), tab1);
72 QCOMPARE(w->tabWidget()->webTab(1), tab0);
73
74 w->tabWidget()->moveTab(1, 0);
75 QCOMPARE(w->tabWidget()->webTab(0), tab0);
76 QCOMPARE(w->tabWidget()->webTab(1), tab1);
77
78 w->tabWidget()->moveTab(0, 1);
79 QCOMPARE(w->tabWidget()->webTab(0), tab1);
80 QCOMPARE(w->tabWidget()->webTab(1), tab0);
81
82 QCOMPARE(rowsRemovedSpy.count(), 0);
83
84 w->tabWidget()->closeTab(1);
85
86 QCOMPARE(rowsRemovedSpy.count(), 1);
87 QCOMPARE(rowsRemovedSpy.at(0).at(0).value<QModelIndex>(), QModelIndex());
88 QCOMPARE(rowsRemovedSpy.at(0).at(1).toInt(), 1);
89 QCOMPARE(rowsRemovedSpy.at(0).at(2).toInt(), 1);
90
91 QCOMPARE(model1.rowCount(), 1);
92
93 TabModel model2(w);
94 ModelTest modelTest2(&model2);
95 QCOMPARE(model2.rowCount(), 1);
96
97 delete w;
98 }
99
dataTest()100 void TabModelTest::dataTest()
101 {
102 BrowserWindow *w = mApp->createWindow(Qz::BW_NewWindow);
103 TabModel model(w);
104 ModelTest modelTest(&model);
105
106 QTRY_COMPARE(model.rowCount(), 1);
107
108 WebTab *tab0 = w->tabWidget()->webTab(0);
109 QCOMPARE(model.index(0, 0).data(TabModel::TitleRole).toString(), tab0->title());
110 QCOMPARE(model.index(0, 0).data(Qt::DisplayRole).toString(), tab0->title());
111 QCOMPARE(model.index(0, 0).data(TabModel::IconRole).value<QIcon>().pixmap(16), tab0->icon().pixmap(16));
112 QCOMPARE(model.index(0, 0).data(Qt::DecorationRole).value<QIcon>().pixmap(16), tab0->icon().pixmap(16));
113 QCOMPARE(model.index(0, 0).data(TabModel::PinnedRole).toBool(), tab0->isPinned());
114 QCOMPARE(model.index(0, 0).data(TabModel::RestoredRole).toBool(), tab0->isRestored());
115 QCOMPARE(model.index(0, 0).data(TabModel::CurrentTabRole).toBool(), true);
116
117 w->tabWidget()->addView(QUrl("http://test.com"));
118
119 delete w;
120 }
pinTabTest()121 void TabModelTest::pinTabTest()
122 {
123 BrowserWindow *w = mApp->createWindow(Qz::BW_NewWindow);
124
125 TabModel model(w);
126 ModelTest modelTest(&model);
127
128 w->tabWidget()->addView(QUrl("http://test.com"));
129
130 QTRY_COMPARE(model.rowCount(), 2);
131
132 WebTab *tab0 = w->tabWidget()->webTab(0);
133 WebTab *tab1 = w->tabWidget()->webTab(1);
134
135 QCOMPARE(model.data(model.index(0, 0), TabModel::WebTabRole).value<WebTab*>(), tab0);
136 QCOMPARE(model.data(model.index(1, 0), TabModel::WebTabRole).value<WebTab*>(), tab1);
137
138 tab1->togglePinned();
139
140 QCOMPARE(model.data(model.index(0, 0), TabModel::WebTabRole).value<WebTab*>(), tab1);
141 QCOMPARE(model.data(model.index(1, 0), TabModel::WebTabRole).value<WebTab*>(), tab0);
142
143 delete w;
144 }
145
treeModelTest()146 void TabModelTest::treeModelTest()
147 {
148 BrowserWindow *w = mApp->createWindow(Qz::BW_NewWindow);
149
150 TabModel sourceModel(w);
151 TabTreeModel model(w);
152 model.setSourceModel(&sourceModel);
153 ModelTest modelTest(&model);
154
155 w->tabWidget()->addView(QUrl());
156 w->tabWidget()->addView(QUrl());
157 w->tabWidget()->addView(QUrl());
158 w->tabWidget()->addView(QUrl());
159 w->tabWidget()->addView(QUrl());
160
161 QTRY_COMPARE(model.rowCount(QModelIndex()), 6);
162
163 WebTab *tab1 = w->tabWidget()->webTab(0);
164 WebTab *tab2 = w->tabWidget()->webTab(1);
165 WebTab *tab3 = w->tabWidget()->webTab(2);
166 WebTab *tab4 = w->tabWidget()->webTab(3);
167 WebTab *tab5 = w->tabWidget()->webTab(4);
168 WebTab *tab6 = w->tabWidget()->webTab(5);
169
170 QCOMPARE(model.index(0, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab1);
171 QCOMPARE(model.index(1, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
172 QCOMPARE(model.index(2, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
173 QCOMPARE(model.index(3, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab4);
174 QCOMPARE(model.index(4, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
175 QCOMPARE(model.index(5, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab6);
176
177 QPersistentModelIndex tab1index = model.index(0, 0);
178 QPersistentModelIndex tab2index = model.index(1, 0);
179 QPersistentModelIndex tab3index = model.index(2, 0);
180 QPersistentModelIndex tab4index = model.index(3, 0);
181 QPersistentModelIndex tab5index = model.index(4, 0);
182 QPersistentModelIndex tab6index = model.index(5, 0);
183
184 QCOMPARE(model.rowCount(tab1index), 0);
185 tab1->addChildTab(tab2);
186
187 QCOMPARE(model.rowCount(tab1index), 1);
188 QCOMPARE(model.index(0, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
189
190 tab1->addChildTab(tab3);
191 QCOMPARE(model.rowCount(tab1index), 2);
192 QCOMPARE(model.index(0, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
193 QCOMPARE(model.index(1, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
194
195 tab1->addChildTab(tab4, 1);
196 QCOMPARE(model.rowCount(tab1index), 3);
197 QCOMPARE(model.index(0, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
198 QCOMPARE(model.index(1, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab4);
199 QCOMPARE(model.index(2, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
200
201 tab4->addChildTab(tab5);
202 tab4->addChildTab(tab6);
203
204 QCOMPARE(model.rowCount(tab4index), 2);
205 QCOMPARE(model.index(0, 0, tab4index).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
206 QCOMPARE(model.index(1, 0, tab4index).data(TabModel::WebTabRole).value<WebTab*>(), tab6);
207
208 w->tabWidget()->closeTab(tab4->tabIndex());
209
210 QCOMPARE(model.rowCount(tab1index), 4);
211 QCOMPARE(model.index(0, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
212 QCOMPARE(model.index(1, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
213 QCOMPARE(model.index(2, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab6);
214 QCOMPARE(model.index(3, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
215
216 tab1->addChildTab(tab3, 0);
217
218 QCOMPARE(model.rowCount(tab1index), 4);
219 QCOMPARE(model.index(0, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
220 QCOMPARE(model.index(1, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
221 QCOMPARE(model.index(2, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
222 QCOMPARE(model.index(3, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab6);
223
224 tab2->setParentTab(nullptr);
225
226 QCOMPARE(model.rowCount(tab1index), 3);
227 QCOMPARE(model.index(0, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
228 QCOMPARE(model.index(0, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
229 QCOMPARE(model.index(1, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
230 QCOMPARE(model.index(2, 0, tab1index).data(TabModel::WebTabRole).value<WebTab*>(), tab6);
231
232 w->tabWidget()->closeTab(tab1->tabIndex());
233
234 QCOMPARE(model.rowCount(QModelIndex()), 4);
235 QCOMPARE(model.index(0, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
236 QCOMPARE(model.index(1, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
237 QCOMPARE(model.index(2, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
238 QCOMPARE(model.index(3, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab6);
239
240 delete w;
241 }
242
resetTreeModelTest()243 void TabModelTest::resetTreeModelTest()
244 {
245 BrowserWindow *w = mApp->createWindow(Qz::BW_NewWindow);
246
247 TabModel sourceModel(w);
248 TabTreeModel model(w);
249 model.setSourceModel(&sourceModel);
250 ModelTest modelTest(&model);
251
252 QTRY_COMPARE(model.rowCount(QModelIndex()), 1);
253
254 delete w;
255
256 QCOMPARE(model.rowCount(QModelIndex()), 0);
257 }
mruModelTest()258 void TabModelTest::mruModelTest()
259 {
260 BrowserWindow *w = mApp->createWindow(Qz::BW_NewWindow);
261
262 TabModel sourceModel(w);
263 TabMruModel model(w);
264 model.setSourceModel(&sourceModel);
265 ModelTest modelTest(&model);
266
267 w->tabWidget()->addView(QUrl());
268 w->tabWidget()->addView(QUrl());
269 w->tabWidget()->addView(QUrl());
270 w->tabWidget()->addView(QUrl());
271 w->tabWidget()->addView(QUrl());
272
273 QTRY_COMPARE(model.rowCount(QModelIndex()), 6);
274
275 WebTab *tab0 = w->tabWidget()->webTab(0);
276 WebTab *tab1 = w->tabWidget()->webTab(1);
277 WebTab *tab2 = w->tabWidget()->webTab(2);
278 WebTab *tab3 = w->tabWidget()->webTab(3);
279 WebTab *tab4 = w->tabWidget()->webTab(4);
280 WebTab *tab5 = w->tabWidget()->webTab(5);
281
282 QCOMPARE(model.index(0, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab0);
283 QCOMPARE(model.index(1, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab1);
284 QCOMPARE(model.index(2, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
285 QCOMPARE(model.index(3, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
286 QCOMPARE(model.index(4, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab4);
287 QCOMPARE(model.index(5, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
288
289 w->tabWidget()->setCurrentIndex(2);
290 QCOMPARE(model.index(0, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
291 QCOMPARE(model.index(1, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab0);
292 QCOMPARE(model.index(2, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab1);
293 QCOMPARE(model.index(3, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
294 QCOMPARE(model.index(4, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab4);
295 QCOMPARE(model.index(5, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
296 w->tabWidget()->setCurrentIndex(2);
297
298 w->tabWidget()->setCurrentIndex(4);
299 QCOMPARE(model.index(0, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab4);
300 QCOMPARE(model.index(1, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
301 QCOMPARE(model.index(2, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab0);
302 QCOMPARE(model.index(3, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab1);
303 QCOMPARE(model.index(4, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
304 QCOMPARE(model.index(5, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
305
306 w->tabWidget()->setCurrentIndex(5);
307 QCOMPARE(model.index(0, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab5);
308 QCOMPARE(model.index(1, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab4);
309 QCOMPARE(model.index(2, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab2);
310 QCOMPARE(model.index(3, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab0);
311 QCOMPARE(model.index(4, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab1);
312 QCOMPARE(model.index(5, 0).data(TabModel::WebTabRole).value<WebTab*>(), tab3);
313
314 delete w;
315 }
316
317 FALKONTEST_MAIN(TabModelTest)
318