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