|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the test suite of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 |
|
43 #include <QtTest/QtTest> |
|
44 #include <qeventloop.h> |
|
45 #include <qlist.h> |
|
46 #include <qpair.h> |
|
47 #include <qheaderview.h> |
|
48 |
|
49 #include <qtablewidget.h> |
|
50 |
|
51 //TESTED_CLASS= |
|
52 //TESTED_FILES= |
|
53 |
|
54 class QObjectTableItem : public QObject, public QTableWidgetItem |
|
55 { |
|
56 Q_OBJECT |
|
57 }; |
|
58 |
|
59 class tst_QTableWidget : public QObject |
|
60 { |
|
61 Q_OBJECT |
|
62 |
|
63 public: |
|
64 tst_QTableWidget(); |
|
65 ~tst_QTableWidget(); |
|
66 |
|
67 public slots: |
|
68 void initTestCase(); |
|
69 void cleanupTestCase(); |
|
70 void init(); |
|
71 void cleanup(); |
|
72 private slots: |
|
73 void getSetCheck(); |
|
74 void clear(); |
|
75 void clearContents(); |
|
76 void rowCount(); |
|
77 void columnCount(); |
|
78 void itemAssignment(); |
|
79 void item_data(); |
|
80 void item(); |
|
81 void takeItem_data(); |
|
82 void takeItem(); |
|
83 void selectedItems_data(); |
|
84 void selectedItems(); |
|
85 void removeRow_data(); |
|
86 void removeRow(); |
|
87 void removeColumn_data(); |
|
88 void removeColumn(); |
|
89 void insertRow_data(); |
|
90 void insertRow(); |
|
91 void insertColumn_data(); |
|
92 void insertColumn(); |
|
93 void itemStreaming_data(); |
|
94 void itemStreaming(); |
|
95 void itemOwnership(); |
|
96 void sortItems_data(); |
|
97 void sortItems(); |
|
98 void setItemWithSorting_data(); |
|
99 void setItemWithSorting(); |
|
100 void itemData(); |
|
101 void setItemData(); |
|
102 void cellWidget(); |
|
103 void task231094(); |
|
104 void task219380_removeLastRow(); |
|
105 void task262056_sortDuplicate(); |
|
106 |
|
107 private: |
|
108 QTableWidget *testWidget; |
|
109 }; |
|
110 |
|
111 typedef QPair<int, int> IntPair; |
|
112 typedef QList<int> IntList; |
|
113 typedef QList<IntPair> IntIntList; |
|
114 |
|
115 Q_DECLARE_METATYPE(IntList) |
|
116 Q_DECLARE_METATYPE(IntIntList) |
|
117 Q_DECLARE_METATYPE(QTableWidgetSelectionRange) |
|
118 Q_DECLARE_METATYPE(QModelIndex) |
|
119 |
|
120 |
|
121 // Testing get/set functions |
|
122 void tst_QTableWidget::getSetCheck() |
|
123 { |
|
124 QTableWidget obj1; |
|
125 // int QTableWidget::rowCount() |
|
126 // void QTableWidget::setRowCount(int) |
|
127 obj1.setRowCount(0); |
|
128 QCOMPARE(0, obj1.rowCount()); |
|
129 obj1.setRowCount(INT_MIN); |
|
130 QCOMPARE(0, obj1.rowCount()); // Row count can never be negative |
|
131 // obj1.setRowCount(INT_MAX); |
|
132 // QCOMPARE(INT_MAX, obj1.rowCount()); |
|
133 obj1.setRowCount(100); |
|
134 QCOMPARE(100, obj1.rowCount()); |
|
135 |
|
136 |
|
137 // int QTableWidget::columnCount() |
|
138 // void QTableWidget::setColumnCount(int) |
|
139 obj1.setColumnCount(0); |
|
140 QCOMPARE(0, obj1.columnCount()); |
|
141 obj1.setColumnCount(INT_MIN); |
|
142 QCOMPARE(0, obj1.columnCount()); // Column count can never be negative |
|
143 obj1.setColumnCount(1000); |
|
144 QCOMPARE(1000, obj1.columnCount()); |
|
145 // obj1.setColumnCount(INT_MAX); |
|
146 // QCOMPARE(INT_MAX, obj1.columnCount()); |
|
147 |
|
148 // QTableWidgetItem * QTableWidget::currentItem() |
|
149 // void QTableWidget::setCurrentItem(QTableWidgetItem *) |
|
150 QTableWidgetItem *var3 = new QTableWidgetItem("0,0"); |
|
151 obj1.setItem(0, 0, var3); |
|
152 obj1.setItem(1, 1, new QTableWidgetItem("1,1")); |
|
153 obj1.setItem(2, 2, new QTableWidgetItem("2,2")); |
|
154 obj1.setItem(3, 3, new QTableWidgetItem("3,3")); |
|
155 obj1.setCurrentItem(var3); |
|
156 QCOMPARE(var3, obj1.currentItem()); |
|
157 obj1.setCurrentItem((QTableWidgetItem *)0); |
|
158 QCOMPARE((QTableWidgetItem *)0, obj1.currentItem()); |
|
159 obj1.setItem(0, 0, 0); |
|
160 QCOMPARE((QTableWidgetItem *)0, obj1.item(0, 0)); |
|
161 |
|
162 // const QTableWidgetItem * QTableWidget::itemPrototype() |
|
163 // void QTableWidget::setItemPrototype(const QTableWidgetItem *) |
|
164 const QTableWidgetItem *var4 = new QTableWidgetItem; |
|
165 obj1.setItemPrototype(var4); |
|
166 QCOMPARE(var4, obj1.itemPrototype()); |
|
167 obj1.setItemPrototype((QTableWidgetItem *)0); |
|
168 QCOMPARE((const QTableWidgetItem *)0, obj1.itemPrototype()); |
|
169 } |
|
170 |
|
171 tst_QTableWidget::tst_QTableWidget(): testWidget(0) |
|
172 { |
|
173 } |
|
174 |
|
175 tst_QTableWidget::~tst_QTableWidget() |
|
176 { |
|
177 } |
|
178 |
|
179 void tst_QTableWidget::initTestCase() |
|
180 { |
|
181 qRegisterMetaType<QModelIndex>("QModelIndex"); |
|
182 testWidget = new QTableWidget(); |
|
183 testWidget->show(); |
|
184 } |
|
185 |
|
186 void tst_QTableWidget::cleanupTestCase() |
|
187 { |
|
188 delete testWidget; |
|
189 } |
|
190 |
|
191 void tst_QTableWidget::init() |
|
192 { |
|
193 testWidget->clear(); |
|
194 testWidget->setRowCount(5); |
|
195 testWidget->setColumnCount(5); |
|
196 |
|
197 for (int row=0; row < testWidget->rowCount(); ++row) |
|
198 testWidget->showRow(row); |
|
199 for (int column=0; column < testWidget->columnCount(); ++column) |
|
200 testWidget->showColumn(column); |
|
201 } |
|
202 |
|
203 void tst_QTableWidget::cleanup() |
|
204 { |
|
205 |
|
206 } |
|
207 |
|
208 void tst_QTableWidget::clearContents() |
|
209 { |
|
210 QTableWidgetItem *item = new QTableWidgetItem("test"); |
|
211 testWidget->setHorizontalHeaderItem(0, item); |
|
212 QVERIFY(testWidget->horizontalHeaderItem(0) == item); |
|
213 testWidget->clearContents(); |
|
214 QVERIFY(testWidget->horizontalHeaderItem(0) == item); |
|
215 } |
|
216 |
|
217 void tst_QTableWidget::clear() |
|
218 { |
|
219 QTableWidgetItem *item = new QTableWidgetItem("foo"); |
|
220 testWidget->setItem(0, 0, item); |
|
221 testWidget->setItemSelected(item, true); |
|
222 |
|
223 QVERIFY(testWidget->item(0, 0) == item); |
|
224 QVERIFY(testWidget->isItemSelected(item)); |
|
225 |
|
226 |
|
227 QPointer<QObjectTableItem> bla = new QObjectTableItem(); |
|
228 testWidget->setItem(1, 1, bla); |
|
229 |
|
230 testWidget->clear(); |
|
231 |
|
232 QVERIFY(bla.isNull()); |
|
233 |
|
234 QVERIFY(!testWidget->item(0,0)); |
|
235 QVERIFY(!testWidget->selectedRanges().count()); |
|
236 QVERIFY(!testWidget->selectedItems().count()); |
|
237 } |
|
238 |
|
239 void tst_QTableWidget::rowCount() |
|
240 { |
|
241 int rowCountBefore = 5; |
|
242 int rowCountAfter = 10; |
|
243 |
|
244 int rowCount = testWidget->rowCount(); |
|
245 QCOMPARE(rowCount, rowCountBefore); |
|
246 |
|
247 testWidget->setRowCount(rowCountAfter); |
|
248 rowCount = testWidget->rowCount(); |
|
249 QCOMPARE(rowCount, rowCountAfter); |
|
250 |
|
251 QPersistentModelIndex index(testWidget->model()->index(rowCountAfter - 1, 0, |
|
252 testWidget->rootIndex())); |
|
253 QCOMPARE(index.row(), rowCountAfter - 1); |
|
254 QCOMPARE(index.column(), 0); |
|
255 QVERIFY(index.isValid()); |
|
256 testWidget->setRowCount(rowCountBefore); |
|
257 QCOMPARE(index.row(), -1); |
|
258 QCOMPARE(index.column(), -1); |
|
259 QVERIFY(!index.isValid()); |
|
260 |
|
261 rowCountBefore = testWidget->rowCount(); |
|
262 testWidget->setRowCount(-1); |
|
263 QCOMPARE(testWidget->rowCount(), rowCountBefore); |
|
264 } |
|
265 |
|
266 void tst_QTableWidget::columnCount() |
|
267 { |
|
268 int columnCountBefore = 5; |
|
269 int columnCountAfter = 10; |
|
270 |
|
271 int columnCount = testWidget->columnCount(); |
|
272 QCOMPARE(columnCount, columnCountBefore); |
|
273 |
|
274 testWidget->setColumnCount(columnCountAfter); |
|
275 columnCount = testWidget->columnCount(); |
|
276 QCOMPARE(columnCount, columnCountAfter); |
|
277 |
|
278 QPersistentModelIndex index(testWidget->model()->index(0, columnCountAfter - 1, |
|
279 testWidget->rootIndex())); |
|
280 QCOMPARE(index.row(), 0); |
|
281 QCOMPARE(index.column(), columnCountAfter - 1); |
|
282 QVERIFY(index.isValid()); |
|
283 testWidget->setColumnCount(columnCountBefore); |
|
284 QCOMPARE(index.row(), -1); |
|
285 QCOMPARE(index.column(), -1); |
|
286 QVERIFY(!index.isValid()); |
|
287 |
|
288 columnCountBefore = testWidget->columnCount(); |
|
289 testWidget->setColumnCount(-1); |
|
290 QCOMPARE(testWidget->columnCount(), columnCountBefore); |
|
291 } |
|
292 |
|
293 void tst_QTableWidget::itemAssignment() |
|
294 { |
|
295 QTableWidgetItem itemInWidget("inWidget"); |
|
296 testWidget->setItem(0, 0, &itemInWidget); |
|
297 itemInWidget.setFlags(itemInWidget.flags() | Qt::ItemIsTristate); |
|
298 QTableWidgetItem itemOutsideWidget("outsideWidget"); |
|
299 |
|
300 QVERIFY(itemInWidget.tableWidget()); |
|
301 QCOMPARE(itemInWidget.text(), QString("inWidget")); |
|
302 QVERIFY(itemInWidget.flags() & Qt::ItemIsTristate); |
|
303 |
|
304 QVERIFY(!itemOutsideWidget.tableWidget()); |
|
305 QCOMPARE(itemOutsideWidget.text(), QString("outsideWidget")); |
|
306 QVERIFY(!(itemOutsideWidget.flags() & Qt::ItemIsTristate)); |
|
307 |
|
308 itemOutsideWidget = itemInWidget; |
|
309 QVERIFY(!itemOutsideWidget.tableWidget()); |
|
310 QCOMPARE(itemOutsideWidget.text(), QString("inWidget")); |
|
311 QVERIFY(itemOutsideWidget.flags() & Qt::ItemIsTristate); |
|
312 } |
|
313 |
|
314 void tst_QTableWidget::item_data() |
|
315 { |
|
316 QTest::addColumn<int>("rowCount"); |
|
317 QTest::addColumn<int>("columnCount"); |
|
318 QTest::addColumn<int>("row"); |
|
319 QTest::addColumn<int>("column"); |
|
320 QTest::addColumn<bool>("expectItem"); |
|
321 |
|
322 QTest::newRow("0x0 take [0,0]") << 0 << 0 << 0 << 0 << false; |
|
323 QTest::newRow("0x0 take [4,4]") << 0 << 0 << 4 << 4 << false; |
|
324 QTest::newRow("4x4 take [0,0]") << 4 << 4 << 0 << 0 << true; |
|
325 QTest::newRow("4x4 take [4,4]") << 4 << 4 << 4 << 4 << false; |
|
326 QTest::newRow("4x4 take [2,2]") << 4 << 4 << 2 << 2 << true; |
|
327 } |
|
328 |
|
329 void tst_QTableWidget::item() |
|
330 { |
|
331 QFETCH(int, rowCount); |
|
332 QFETCH(int, columnCount); |
|
333 QFETCH(int, row); |
|
334 QFETCH(int, column); |
|
335 QFETCH(bool, expectItem); |
|
336 |
|
337 testWidget->setRowCount(rowCount); |
|
338 testWidget->setColumnCount(columnCount); |
|
339 QCOMPARE(testWidget->rowCount(), rowCount); |
|
340 QCOMPARE(testWidget->columnCount(), columnCount); |
|
341 |
|
342 for (int r = 0; r < testWidget->rowCount(); ++r) |
|
343 for (int c = 0; c < testWidget->columnCount(); ++c) |
|
344 testWidget->setItem(r, c, new QTableWidgetItem(QString::number(r * c + c))); |
|
345 |
|
346 for (int r = 0; r < testWidget->rowCount(); ++r) |
|
347 for (int c = 0; c < testWidget->columnCount(); ++c) |
|
348 QCOMPARE(testWidget->item(r, c)->text(), QString::number(r * c + c)); |
|
349 |
|
350 QTableWidgetItem *item = testWidget->item(row, column); |
|
351 QCOMPARE(!!item, expectItem); |
|
352 if (expectItem) |
|
353 QCOMPARE(item->text(), QString::number(row * column + column)); |
|
354 } |
|
355 |
|
356 void tst_QTableWidget::takeItem_data() |
|
357 { |
|
358 QTest::addColumn<int>("rowCount"); |
|
359 QTest::addColumn<int>("columnCount"); |
|
360 QTest::addColumn<int>("row"); |
|
361 QTest::addColumn<int>("column"); |
|
362 QTest::addColumn<bool>("expectItem"); |
|
363 |
|
364 QTest::newRow("0x0 take [0,0]") << 0 << 0 << 0 << 0 << false; |
|
365 QTest::newRow("0x0 take [4,4]") << 0 << 0 << 4 << 4 << false; |
|
366 QTest::newRow("4x4 take [0,0]") << 4 << 4 << 0 << 0 << true; |
|
367 QTest::newRow("4x4 take [4,4]") << 4 << 4 << 4 << 4 << false; |
|
368 QTest::newRow("4x4 take [2,2]") << 4 << 4 << 2 << 2 << true; |
|
369 } |
|
370 |
|
371 void tst_QTableWidget::takeItem() |
|
372 { |
|
373 QFETCH(int, rowCount); |
|
374 QFETCH(int, columnCount); |
|
375 QFETCH(int, row); |
|
376 QFETCH(int, column); |
|
377 QFETCH(bool, expectItem); |
|
378 |
|
379 testWidget->setRowCount(rowCount); |
|
380 testWidget->setColumnCount(columnCount); |
|
381 QCOMPARE(testWidget->rowCount(), rowCount); |
|
382 QCOMPARE(testWidget->columnCount(), columnCount); |
|
383 |
|
384 for (int r = 0; r < testWidget->rowCount(); ++r) |
|
385 for (int c = 0; c < testWidget->columnCount(); ++c) |
|
386 testWidget->setItem(r, c, new QTableWidgetItem(QString::number(r * c + c))); |
|
387 |
|
388 for (int r = 0; r < testWidget->rowCount(); ++r) |
|
389 for (int c = 0; c < testWidget->columnCount(); ++c) |
|
390 QCOMPARE(testWidget->item(r, c)->text(), QString::number(r * c + c)); |
|
391 |
|
392 QTableWidgetItem *item = testWidget->takeItem(row, column); |
|
393 QCOMPARE(!!item, expectItem); |
|
394 if (expectItem) { |
|
395 QCOMPARE(item->text(), QString::number(row * column + column)); |
|
396 delete item; |
|
397 } |
|
398 QVERIFY(!testWidget->takeItem(row, column)); |
|
399 } |
|
400 |
|
401 void tst_QTableWidget::selectedItems_data() |
|
402 { |
|
403 QTest::addColumn<int>("rowCount"); |
|
404 QTest::addColumn<int>("columnCount"); |
|
405 QTest::addColumn<IntIntList>("createItems"); |
|
406 QTest::addColumn<IntList>("hiddenRows"); |
|
407 QTest::addColumn<IntList>("hiddenColumns"); |
|
408 QTest::addColumn<QTableWidgetSelectionRange>("selectionRange"); |
|
409 QTest::addColumn<IntIntList>("expectedItems"); |
|
410 |
|
411 QTest::newRow("3x3 empty cells, no hidden rows/columns, none selected") |
|
412 << 3 << 3 |
|
413 << IntIntList() |
|
414 << IntList() |
|
415 << IntList() |
|
416 << QTableWidgetSelectionRange() |
|
417 << IntIntList(); |
|
418 |
|
419 QTest::newRow("3x3 empty cells,no hidden rows/columnms, all selected") |
|
420 << 3 << 3 |
|
421 << IntIntList() |
|
422 << IntList() |
|
423 << IntList() |
|
424 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
425 << IntIntList(); |
|
426 |
|
427 QTest::newRow("3x3 (1,1) exists, no hidden rows/columnms, all selected") |
|
428 << 3 << 3 |
|
429 << (IntIntList() << IntPair(1,1)) |
|
430 << IntList() |
|
431 << IntList() |
|
432 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
433 << (IntIntList() << IntPair(1,1)); |
|
434 |
|
435 QTest::newRow("3x3 (1,1) exists, row 1 hidden, all selected") |
|
436 << 3 << 3 |
|
437 << (IntIntList() << IntPair(1,1)) |
|
438 << (IntList() << 1) |
|
439 << IntList() |
|
440 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
441 << IntIntList(); |
|
442 |
|
443 QTest::newRow("3x3 (1,1) exists, column 1 hidden, all selected") |
|
444 << 3 << 3 |
|
445 << (IntIntList() << IntPair(1,1)) |
|
446 << IntList() |
|
447 << (IntList() << 1) |
|
448 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
449 << IntIntList(); |
|
450 |
|
451 QTest::newRow("3x3 all exists, no hidden rows/columns, all selected") |
|
452 << 3 << 3 |
|
453 << (IntIntList() |
|
454 << IntPair(0,0) << IntPair(0,1) << IntPair(0,2) |
|
455 << IntPair(1,0) << IntPair(1,1) << IntPair(1,2) |
|
456 << IntPair(2,0) << IntPair(2,1) << IntPair(2,2)) |
|
457 << IntList() |
|
458 << IntList() |
|
459 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
460 << (IntIntList() |
|
461 << IntPair(0,0) << IntPair(0,1) << IntPair(0,2) |
|
462 << IntPair(1,0) << IntPair(1,1) << IntPair(1,2) |
|
463 << IntPair(2,0) << IntPair(2,1) << IntPair(2,2)); |
|
464 |
|
465 QTest::newRow("3x3 all exists, row 1 hidden, all selected") |
|
466 << 3 << 3 |
|
467 << (IntIntList() |
|
468 << IntPair(0,0) << IntPair(0,1) << IntPair(0,2) |
|
469 << IntPair(1,0) << IntPair(1,1) << IntPair(1,2) |
|
470 << IntPair(2,0) << IntPair(2,1) << IntPair(2,2)) |
|
471 << (IntList() << 1) |
|
472 << IntList() |
|
473 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
474 << (IntIntList() |
|
475 << IntPair(0,0) << IntPair(0,1) << IntPair(0,2) |
|
476 << IntPair(2,0) << IntPair(2,1) << IntPair(2,2)); |
|
477 |
|
478 QTest::newRow("3x3 all exists, column 1 hidden, all selected") |
|
479 << 3 << 3 |
|
480 << (IntIntList() |
|
481 << IntPair(0,0) << IntPair(0,1) << IntPair(0,2) |
|
482 << IntPair(1,0) << IntPair(1,1) << IntPair(1,2) |
|
483 << IntPair(2,0) << IntPair(2,1) << IntPair(2,2)) |
|
484 << IntList() |
|
485 << (IntList() << 1) |
|
486 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
487 << (IntIntList() |
|
488 << IntPair(0,0) << IntPair(0,2) |
|
489 << IntPair(1,0) << IntPair(1,2) |
|
490 << IntPair(2,0) << IntPair(2,2)); |
|
491 |
|
492 QTest::newRow("3x3 none exists, no hidden rows/columns, all selected") |
|
493 << 3 << 3 |
|
494 << IntIntList() |
|
495 << IntList() |
|
496 << IntList() |
|
497 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
498 << IntIntList(); |
|
499 // << (IntIntList() |
|
500 // << IntPair(0,0) << IntPair(0,1) << IntPair(0,2) |
|
501 // << IntPair(1,0) << IntPair(1,1) << IntPair(1,2) |
|
502 // << IntPair(2,0) << IntPair(2,1) << IntPair(2,2)); |
|
503 |
|
504 QTest::newRow("3x3 none exists, row 1 hidden, all selected, filling empty cells") |
|
505 << 3 << 3 |
|
506 << IntIntList() |
|
507 << (IntList() << 1) |
|
508 << IntList() |
|
509 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
510 << IntIntList(); |
|
511 // << (IntIntList() |
|
512 // << IntPair(0,0) << IntPair(0,1) << IntPair(0,2) |
|
513 // << IntPair(2,0) << IntPair(2,1) << IntPair(2,2)); |
|
514 |
|
515 QTest::newRow("3x3 none exists, column 1 hidden, all selected") |
|
516 << 3 << 3 |
|
517 << IntIntList() |
|
518 << IntList() |
|
519 << (IntList() << 1) |
|
520 << QTableWidgetSelectionRange(0, 0, 2, 2) |
|
521 << IntIntList(); |
|
522 // << (IntIntList() |
|
523 // << IntPair(0,0) << IntPair(0,2) |
|
524 // << IntPair(1,0) << IntPair(1,2) |
|
525 // << IntPair(2,0) << IntPair(2,2)); |
|
526 } |
|
527 |
|
528 void tst_QTableWidget::selectedItems() |
|
529 { |
|
530 QFETCH(int, rowCount); |
|
531 QFETCH(int, columnCount); |
|
532 QFETCH(IntIntList, createItems); |
|
533 QFETCH(IntList, hiddenRows); |
|
534 QFETCH(IntList, hiddenColumns); |
|
535 QFETCH(QTableWidgetSelectionRange, selectionRange); |
|
536 QFETCH(IntIntList, expectedItems); |
|
537 |
|
538 // set dimensions and test they are ok |
|
539 testWidget->setRowCount(rowCount); |
|
540 testWidget->setColumnCount(columnCount); |
|
541 QCOMPARE(testWidget->rowCount(), rowCount); |
|
542 QCOMPARE(testWidget->columnCount(), columnCount); |
|
543 |
|
544 // create and set items |
|
545 foreach (IntPair intPair, createItems) { |
|
546 testWidget->setItem(intPair.first, intPair.second, |
|
547 new QTableWidgetItem(QString("Item %1 %2") |
|
548 .arg(intPair.first).arg(intPair.second))); |
|
549 } |
|
550 // hide rows/columns |
|
551 foreach (int row, hiddenRows) |
|
552 testWidget->setRowHidden(row, true); |
|
553 foreach (int column, hiddenColumns) |
|
554 testWidget->setColumnHidden(column, true); |
|
555 |
|
556 // make sure we don't have any previous selections hanging around |
|
557 QVERIFY(!testWidget->selectedRanges().count()); |
|
558 QVERIFY(!testWidget->selectedItems().count()); |
|
559 |
|
560 // select range and check that it is set correctly |
|
561 testWidget->setRangeSelected(selectionRange, true); |
|
562 if (selectionRange.topRow() >= 0) { |
|
563 QCOMPARE(testWidget->selectedRanges().count(), 1); |
|
564 QCOMPARE(testWidget->selectedRanges().at(0).topRow(), selectionRange.topRow()); |
|
565 QCOMPARE(testWidget->selectedRanges().at(0).bottomRow(), selectionRange.bottomRow()); |
|
566 QCOMPARE(testWidget->selectedRanges().at(0).leftColumn(), selectionRange.leftColumn()); |
|
567 QCOMPARE(testWidget->selectedRanges().at(0).rightColumn(), selectionRange.rightColumn()); |
|
568 } else { |
|
569 QCOMPARE(testWidget->selectedRanges().count(), 0); |
|
570 } |
|
571 |
|
572 // check that the correct number of items and the expected items are there |
|
573 QList<QTableWidgetItem *> selectedItems = testWidget->selectedItems(); |
|
574 QCOMPARE(selectedItems.count(), expectedItems.count()); |
|
575 foreach (IntPair intPair, expectedItems) |
|
576 QVERIFY(selectedItems.contains(testWidget->item(intPair.first, intPair.second))); |
|
577 |
|
578 // check that setItemSelected agrees with selectedItems |
|
579 for (int row = 0; row<testWidget->rowCount(); ++row) { |
|
580 bool hidden = false; |
|
581 foreach (int hiddenRow, hiddenRows){ |
|
582 if(hiddenRow == row){ |
|
583 hidden = true; |
|
584 break; |
|
585 } |
|
586 } |
|
587 if (hidden) |
|
588 continue; |
|
589 |
|
590 for (int column = 0; column<testWidget->columnCount(); ++column) { |
|
591 foreach (int hiddenColumn, hiddenColumns){ |
|
592 if(hiddenColumn == column){ |
|
593 hidden = true; |
|
594 break; |
|
595 } |
|
596 } |
|
597 if (hidden) |
|
598 continue; |
|
599 |
|
600 QTableWidgetItem *item = testWidget->item(row, column); |
|
601 if (item && testWidget->isItemSelected(item)) |
|
602 QVERIFY(selectedItems.contains(item)); |
|
603 } |
|
604 } |
|
605 } |
|
606 |
|
607 void tst_QTableWidget::removeRow_data() |
|
608 { |
|
609 QTest::addColumn<int>("rowCount"); |
|
610 QTest::addColumn<int>("columnCount"); |
|
611 QTest::addColumn<int>("row"); |
|
612 QTest::addColumn<int>("expectedRowCount"); |
|
613 QTest::addColumn<int>("expectedColumnCount"); |
|
614 |
|
615 QTest::newRow("Empty") << 0 << 0 << 0 << 0 << 0; |
|
616 QTest::newRow("1x1:0") << 1 << 1 << 0 << 0 << 1; |
|
617 QTest::newRow("3x3:0") << 3 << 3 << 0 << 2 << 3; |
|
618 QTest::newRow("3x3:1") << 3 << 3 << 1 << 2 << 3; |
|
619 QTest::newRow("3x3:2") << 3 << 3 << 2 << 2 << 3; |
|
620 } |
|
621 |
|
622 void tst_QTableWidget::removeRow() |
|
623 { |
|
624 QFETCH(int, rowCount); |
|
625 QFETCH(int, columnCount); |
|
626 QFETCH(int, row); |
|
627 QFETCH(int, expectedRowCount); |
|
628 QFETCH(int, expectedColumnCount); |
|
629 |
|
630 // set dimensions and test they are ok |
|
631 testWidget->setRowCount(rowCount); |
|
632 testWidget->setColumnCount(columnCount); |
|
633 QCOMPARE(testWidget->rowCount(), rowCount); |
|
634 QCOMPARE(testWidget->columnCount(), columnCount); |
|
635 |
|
636 // fill table with items |
|
637 for (int r = 0; r < rowCount; ++r) |
|
638 for (int c = 0; c < columnCount; ++c) |
|
639 testWidget->setItem(r, c, |
|
640 new QTableWidgetItem( |
|
641 QString::number(r) + ":" + QString::number(c))); |
|
642 |
|
643 // remove and compare the results |
|
644 testWidget->removeRow(row); |
|
645 QCOMPARE(testWidget->rowCount(), expectedRowCount); |
|
646 QCOMPARE(testWidget->columnCount(), expectedColumnCount); |
|
647 |
|
648 // check if the correct items were removed |
|
649 for (int r = 0; r < expectedRowCount; ++r) |
|
650 for (int c = 0; c < expectedColumnCount; ++c) |
|
651 if (r < row) |
|
652 QCOMPARE(testWidget->item(r, c)->text(), |
|
653 QString::number(r) + ":" + QString::number(c)); |
|
654 else |
|
655 QCOMPARE(testWidget->item(r, c)->text(), |
|
656 QString::number(r + 1) + ":" + QString::number(c)); |
|
657 } |
|
658 |
|
659 void tst_QTableWidget::removeColumn_data() |
|
660 { |
|
661 QTest::addColumn<int>("rowCount"); |
|
662 QTest::addColumn<int>("columnCount"); |
|
663 QTest::addColumn<int>("column"); |
|
664 QTest::addColumn<int>("expectedRowCount"); |
|
665 QTest::addColumn<int>("expectedColumnCount"); |
|
666 |
|
667 QTest::newRow("Empty") << 0 << 0 << 0 << 0 << 0; |
|
668 QTest::newRow("1x1:0") << 1 << 1 << 0 << 1 << 0; |
|
669 QTest::newRow("3x3:0") << 3 << 3 << 0 << 3 << 2; |
|
670 QTest::newRow("3x3:1") << 3 << 3 << 1 << 3 << 2; |
|
671 QTest::newRow("3x3:2") << 3 << 3 << 2 << 3 << 2; |
|
672 } |
|
673 |
|
674 void tst_QTableWidget::removeColumn() |
|
675 { |
|
676 QFETCH(int, rowCount); |
|
677 QFETCH(int, columnCount); |
|
678 QFETCH(int, column); |
|
679 QFETCH(int, expectedRowCount); |
|
680 QFETCH(int, expectedColumnCount); |
|
681 |
|
682 // set dimensions and test they are ok |
|
683 testWidget->setRowCount(rowCount); |
|
684 testWidget->setColumnCount(columnCount); |
|
685 QCOMPARE(testWidget->rowCount(), rowCount); |
|
686 QCOMPARE(testWidget->columnCount(), columnCount); |
|
687 |
|
688 // fill table with items |
|
689 for (int r = 0; r < rowCount; ++r) |
|
690 for (int c = 0; c < columnCount; ++c) |
|
691 testWidget->setItem(r, c, |
|
692 new QTableWidgetItem( |
|
693 QString::number(r) + ":" + QString::number(c))); |
|
694 |
|
695 // remove and compare the results |
|
696 testWidget->removeColumn(column); |
|
697 QCOMPARE(testWidget->rowCount(), expectedRowCount); |
|
698 QCOMPARE(testWidget->columnCount(), expectedColumnCount); |
|
699 |
|
700 |
|
701 // check if the correct items were removed |
|
702 for (int r = 0; r < expectedRowCount; ++r) |
|
703 for (int c = 0; c < expectedColumnCount; ++c) |
|
704 if (c < column) |
|
705 QCOMPARE(testWidget->item(r, c)->text(), |
|
706 QString::number(r) + ":" + QString::number(c)); |
|
707 else |
|
708 QCOMPARE(testWidget->item(r, c)->text(), |
|
709 QString::number(r) + ":" + QString::number(c + 1)); |
|
710 } |
|
711 |
|
712 void tst_QTableWidget::insertRow_data() |
|
713 { |
|
714 QTest::addColumn<int>("rowCount"); |
|
715 QTest::addColumn<int>("columnCount"); |
|
716 QTest::addColumn<int>("row"); |
|
717 QTest::addColumn<int>("expectedRowCount"); |
|
718 QTest::addColumn<int>("expectedColumnCount"); |
|
719 |
|
720 QTest::newRow("Empty") << 0 << 0 << 0 << 1 << 0; |
|
721 QTest::newRow("1x1:0") << 1 << 1 << 0 << 2 << 1; |
|
722 QTest::newRow("3x3:-1") << 3 << 3 << -1 << 3 << 3; |
|
723 QTest::newRow("3x3:0") << 3 << 3 << 0 << 4 << 3; |
|
724 QTest::newRow("3x3:1") << 3 << 3 << 1 << 4 << 3; |
|
725 QTest::newRow("3x3:2") << 3 << 3 << 2 << 4 << 3; |
|
726 QTest::newRow("3x3:3") << 3 << 3 << 3 << 4 << 3; |
|
727 QTest::newRow("3x3:4") << 3 << 3 << 4 << 3 << 3; |
|
728 } |
|
729 |
|
730 void tst_QTableWidget::insertRow() |
|
731 { |
|
732 QFETCH(int, rowCount); |
|
733 QFETCH(int, columnCount); |
|
734 QFETCH(int, row); |
|
735 QFETCH(int, expectedRowCount); |
|
736 QFETCH(int, expectedColumnCount); |
|
737 |
|
738 // set dimensions and test they are ok |
|
739 testWidget->setRowCount(rowCount); |
|
740 testWidget->setColumnCount(columnCount); |
|
741 QCOMPARE(testWidget->rowCount(), rowCount); |
|
742 QCOMPARE(testWidget->columnCount(), columnCount); |
|
743 |
|
744 // insert and compare the results |
|
745 testWidget->insertRow(row); |
|
746 QCOMPARE(testWidget->rowCount(), expectedRowCount); |
|
747 QCOMPARE(testWidget->columnCount(), expectedColumnCount); |
|
748 } |
|
749 |
|
750 void tst_QTableWidget::insertColumn_data() |
|
751 { |
|
752 QTest::addColumn<int>("rowCount"); |
|
753 QTest::addColumn<int>("columnCount"); |
|
754 QTest::addColumn<int>("column"); |
|
755 QTest::addColumn<int>("expectedRowCount"); |
|
756 QTest::addColumn<int>("expectedColumnCount"); |
|
757 |
|
758 QTest::newRow("Empty") << 0 << 0 << 0 << 0 << 1; |
|
759 QTest::newRow("1x1:0") << 1 << 1 << 0 << 1 << 2; |
|
760 QTest::newRow("3x3:-1") << 3 << 3 << -1 << 3 << 3; |
|
761 QTest::newRow("3x3:0") << 3 << 3 << 0 << 3 << 4; |
|
762 QTest::newRow("3x3:1") << 3 << 3 << 1 << 3 << 4; |
|
763 QTest::newRow("3x3:2") << 3 << 3 << 2 << 3 << 4; |
|
764 QTest::newRow("3x3:3") << 3 << 3 << 3 << 3 << 4; |
|
765 QTest::newRow("3x3:4") << 3 << 3 << 4 << 3 << 3; |
|
766 } |
|
767 |
|
768 void tst_QTableWidget::insertColumn() |
|
769 { |
|
770 QFETCH(int, rowCount); |
|
771 QFETCH(int, columnCount); |
|
772 QFETCH(int, column); |
|
773 QFETCH(int, expectedRowCount); |
|
774 QFETCH(int, expectedColumnCount); |
|
775 |
|
776 // set dimensions and test they are ok |
|
777 testWidget->setRowCount(rowCount); |
|
778 testWidget->setColumnCount(columnCount); |
|
779 QCOMPARE(testWidget->rowCount(), rowCount); |
|
780 QCOMPARE(testWidget->columnCount(), columnCount); |
|
781 |
|
782 // insert and compare the results |
|
783 testWidget->insertColumn(column); |
|
784 QCOMPARE(testWidget->rowCount(), expectedRowCount); |
|
785 QCOMPARE(testWidget->columnCount(), expectedColumnCount); |
|
786 } |
|
787 |
|
788 void tst_QTableWidget::itemStreaming_data() |
|
789 { |
|
790 QTest::addColumn<QString>("text"); |
|
791 QTest::addColumn<QString>("toolTip"); |
|
792 |
|
793 QTest::newRow("Data") << "item text" << "tool tip text"; |
|
794 } |
|
795 |
|
796 void tst_QTableWidget::itemStreaming() |
|
797 { |
|
798 QFETCH(QString, text); |
|
799 QFETCH(QString, toolTip); |
|
800 |
|
801 QTableWidgetItem item; |
|
802 QCOMPARE(item.text(), QString()); |
|
803 QCOMPARE(item.toolTip(), QString()); |
|
804 |
|
805 item.setText(text); |
|
806 item.setToolTip(toolTip); |
|
807 QCOMPARE(item.text(), text); |
|
808 QCOMPARE(item.toolTip(), toolTip); |
|
809 |
|
810 QByteArray buffer; |
|
811 QDataStream out(&buffer, QIODevice::WriteOnly); |
|
812 out << item; |
|
813 |
|
814 QTableWidgetItem item2; |
|
815 QCOMPARE(item2.text(), QString()); |
|
816 QCOMPARE(item2.toolTip(), QString()); |
|
817 |
|
818 QVERIFY(!buffer.isEmpty()); |
|
819 |
|
820 QDataStream in(&buffer, QIODevice::ReadOnly); |
|
821 in >> item2; |
|
822 QCOMPARE(item2.text(), text); |
|
823 QCOMPARE(item2.toolTip(), toolTip); |
|
824 } |
|
825 |
|
826 void tst_QTableWidget::itemOwnership() |
|
827 { |
|
828 QPointer<QObjectTableItem> item; |
|
829 QPointer<QObjectTableItem> headerItem; |
|
830 |
|
831 //delete from outside |
|
832 item = new QObjectTableItem(); |
|
833 testWidget->setItem(0, 0, item); |
|
834 delete item; |
|
835 QCOMPARE(testWidget->item(0, 0), (QTableWidgetItem *)0); |
|
836 |
|
837 //delete vertical headeritem from outside |
|
838 headerItem = new QObjectTableItem(); |
|
839 testWidget->setVerticalHeaderItem(0, headerItem); |
|
840 delete headerItem; |
|
841 QCOMPARE(testWidget->verticalHeaderItem(0), (QTableWidgetItem *)0); |
|
842 |
|
843 //delete horizontal headeritem from outside |
|
844 headerItem = new QObjectTableItem(); |
|
845 testWidget->setHorizontalHeaderItem(0, headerItem); |
|
846 delete headerItem; |
|
847 QCOMPARE(testWidget->horizontalHeaderItem(0), (QTableWidgetItem *)0); |
|
848 |
|
849 //setItem |
|
850 item = new QObjectTableItem(); |
|
851 testWidget->setItem(0, 0, item); |
|
852 testWidget->setItem(0, 0, new QTableWidgetItem()); |
|
853 QVERIFY(item.isNull()); |
|
854 |
|
855 //setHorizontalHeaderItem |
|
856 headerItem = new QObjectTableItem(); |
|
857 testWidget->setHorizontalHeaderItem(0, headerItem); |
|
858 testWidget->setHorizontalHeaderItem(0, new QTableWidgetItem()); |
|
859 QVERIFY(headerItem.isNull()); |
|
860 |
|
861 //setVerticalHeaderItem |
|
862 headerItem = new QObjectTableItem(); |
|
863 testWidget->setVerticalHeaderItem(0, headerItem); |
|
864 testWidget->setVerticalHeaderItem(0, new QTableWidgetItem()); |
|
865 QVERIFY(headerItem.isNull()); |
|
866 |
|
867 //takeItem |
|
868 item = new QObjectTableItem(); |
|
869 testWidget->setItem(0, 0, item); |
|
870 testWidget->takeItem(0, 0); |
|
871 QVERIFY(!item.isNull()); |
|
872 delete item; |
|
873 |
|
874 // removeRow |
|
875 item = new QObjectTableItem(); |
|
876 headerItem = new QObjectTableItem(); |
|
877 testWidget->setItem(0, 0, item); |
|
878 testWidget->setVerticalHeaderItem(0, headerItem); |
|
879 testWidget->removeRow(0); |
|
880 QVERIFY(item.isNull()); |
|
881 QVERIFY(headerItem.isNull()); |
|
882 |
|
883 // removeColumn |
|
884 item = new QObjectTableItem(); |
|
885 headerItem = new QObjectTableItem(); |
|
886 testWidget->setItem(0, 0, item); |
|
887 testWidget->setHorizontalHeaderItem(0, headerItem); |
|
888 testWidget->removeColumn(0); |
|
889 QVERIFY(item.isNull()); |
|
890 QVERIFY(headerItem.isNull()); |
|
891 |
|
892 // clear |
|
893 item = new QObjectTableItem(); |
|
894 testWidget->setItem(0, 0, item); |
|
895 testWidget->clear(); |
|
896 QVERIFY(item.isNull()); |
|
897 } |
|
898 |
|
899 void tst_QTableWidget::sortItems_data() |
|
900 { |
|
901 QTest::addColumn<int>("rowCount"); |
|
902 QTest::addColumn<int>("columnCount"); |
|
903 QTest::addColumn<int>("sortOrder"); |
|
904 QTest::addColumn<int>("sortColumn"); |
|
905 QTest::addColumn<QStringList>("initial"); |
|
906 QTest::addColumn<QStringList>("expected"); |
|
907 QTest::addColumn<IntList>("rows"); |
|
908 QTest::addColumn<IntList>("initialHidden"); |
|
909 QTest::addColumn<IntList>("expectedHidden"); |
|
910 |
|
911 QTest::newRow("ascending") |
|
912 << 4 << 5 |
|
913 << static_cast<int>(Qt::AscendingOrder) |
|
914 << 0 |
|
915 << (QStringList() |
|
916 << "0" << "a" << "o" << "8" << "k" |
|
917 << "3" << "d" << "k" << "o" << "6" |
|
918 << "2" << "c" << "9" << "y" << "8" |
|
919 << "1" << "b" << "7" << "3" << "u") |
|
920 << (QStringList() |
|
921 << "0" << "a" << "o" << "8" << "k" |
|
922 << "1" << "b" << "7" << "3" << "u" |
|
923 << "2" << "c" << "9" << "y" << "8" |
|
924 << "3" << "d" << "k" << "o" << "6") |
|
925 << (IntList() << 0 << 3 << 2 << 1) |
|
926 << IntList() |
|
927 << IntList(); |
|
928 |
|
929 QTest::newRow("descending") |
|
930 << 4 << 5 |
|
931 << static_cast<int>(Qt::DescendingOrder) |
|
932 << 0 |
|
933 << (QStringList() |
|
934 << "0" << "a" << "o" << "8" << "k" |
|
935 << "3" << "d" << "k" << "o" << "6" |
|
936 << "2" << "c" << "9" << "y" << "8" |
|
937 << "1" << "b" << "7" << "3" << "u") |
|
938 << (QStringList() |
|
939 << "3" << "d" << "k" << "o" << "6" |
|
940 << "2" << "c" << "9" << "y" << "8" |
|
941 << "1" << "b" << "7" << "3" << "u" |
|
942 << "0" << "a" << "o" << "8" << "k") |
|
943 << (IntList() << 3 << 0 << 1 << 2) |
|
944 << IntList() |
|
945 << IntList(); |
|
946 |
|
947 QTest::newRow("empty table") |
|
948 << 4 << 5 |
|
949 << static_cast<int>(Qt::AscendingOrder) |
|
950 << 0 |
|
951 << (QStringList() |
|
952 << 0 << 0 << 0 << 0 << 0 |
|
953 << 0 << 0 << 0 << 0 << 0 |
|
954 << 0 << 0 << 0 << 0 << 0 |
|
955 << 0 << 0 << 0 << 0 << 0) |
|
956 << (QStringList() |
|
957 << 0 << 0 << 0 << 0 << 0 |
|
958 << 0 << 0 << 0 << 0 << 0 |
|
959 << 0 << 0 << 0 << 0 << 0 |
|
960 << 0 << 0 << 0 << 0 << 0) |
|
961 << IntList() |
|
962 << IntList() |
|
963 << IntList(); |
|
964 |
|
965 |
|
966 QTest::newRow("half-empty table") |
|
967 << 4 << 5 |
|
968 << static_cast<int>(Qt::AscendingOrder) |
|
969 << 0 |
|
970 << (QStringList() |
|
971 << "0" << 0 << 0 << 0 << 0 |
|
972 << "3" << "d" << 0 << 0 << 0 |
|
973 << "2" << "c" << 0 << 0 << 0 |
|
974 << 0 << 0 << 0 << 0 << 0) |
|
975 << (QStringList() |
|
976 << "0" << 0 << 0 << 0 << 0 |
|
977 << "2" << "c" << 0 << 0 << 0 |
|
978 << "3" << "d" << 0 << 0 << 0 |
|
979 << 0 << 0 << 0 << 0 << 0) |
|
980 << (IntList() << 0 << 2 << 1) |
|
981 << IntList() |
|
982 << IntList(); |
|
983 |
|
984 QTest::newRow("empty column, should not sort.") |
|
985 << 4 << 5 |
|
986 << static_cast<int>(Qt::AscendingOrder) |
|
987 << 3 |
|
988 << (QStringList() |
|
989 << "0" << 0 << 0 << 0 << 0 |
|
990 << "3" << "d" << 0 << 0 << 0 |
|
991 << "2" << "c" << 0 << 0 << 0 |
|
992 << 0 << 0 << 0 << 0 << 0) |
|
993 << (QStringList() |
|
994 << "0" << 0 << 0 << 0 << 0 |
|
995 << "3" << "d" << 0 << 0 << 0 |
|
996 << "2" << "c" << 0 << 0 << 0 |
|
997 << 0 << 0 << 0 << 0 << 0) |
|
998 << IntList() |
|
999 << IntList() |
|
1000 << IntList(); |
|
1001 |
|
1002 QTest::newRow("descending with null cell, the null cell should be placed at the bottom") |
|
1003 << 4 << 5 |
|
1004 << static_cast<int>(Qt::DescendingOrder) |
|
1005 << 0 |
|
1006 << (QStringList() |
|
1007 << "0" << "a" << "o" << "8" << "k" |
|
1008 << "3" << "d" << "k" << "o" << "6" |
|
1009 << "2" << "c" << "9" << "y" << "8" |
|
1010 << 0 << "b" << "7" << "3" << "u") |
|
1011 << (QStringList() |
|
1012 << "3" << "d" << "k" << "o" << "6" |
|
1013 << "2" << "c" << "9" << "y" << "8" |
|
1014 << "0" << "a" << "o" << "8" << "k" |
|
1015 << 0 << "b" << "7" << "3" << "u") |
|
1016 << (IntList() << 2 << 0 << 1) |
|
1017 << IntList() |
|
1018 << IntList(); |
|
1019 |
|
1020 QTest::newRow("ascending with null cell, the null cell should be placed at the bottom") |
|
1021 << 4 << 5 |
|
1022 << static_cast<int>(Qt::AscendingOrder) |
|
1023 << 0 |
|
1024 << (QStringList() |
|
1025 << "0" << "a" << "o" << "8" << "k" |
|
1026 << "3" << "d" << "k" << "o" << "6" |
|
1027 << "2" << "c" << "9" << "y" << "8" |
|
1028 << 0 << "b" << "7" << "3" << "u") |
|
1029 << (QStringList() |
|
1030 << "0" << "a" << "o" << "8" << "k" |
|
1031 << "2" << "c" << "9" << "y" << "8" |
|
1032 << "3" << "d" << "k" << "o" << "6" |
|
1033 << 0 << "b" << "7" << "3" << "u") |
|
1034 << (IntList() << 0 << 2 << 1) |
|
1035 << IntList() |
|
1036 << IntList(); |
|
1037 |
|
1038 QTest::newRow("ascending with null cells, the null cells should be placed at the bottom") |
|
1039 << 4 << 5 |
|
1040 << static_cast<int>(Qt::AscendingOrder) |
|
1041 << 0 |
|
1042 << (QStringList() |
|
1043 << "3" << "d" << "k" << "o" << "6" |
|
1044 << "0" << "a" << "o" << "8" << "k" |
|
1045 << 0 << "c" << "9" << "y" << "8" |
|
1046 << 0 << "b" << "7" << "3" << "u") |
|
1047 << (QStringList() |
|
1048 << "0" << "a" << "o" << "8" << "k" |
|
1049 << "3" << "d" << "k" << "o" << "6" |
|
1050 << 0 << "c" << "9" << "y" << "8" |
|
1051 << 0 << "b" << "7" << "3" << "u") |
|
1052 << (IntList() << 1 << 0) |
|
1053 << IntList() |
|
1054 << IntList(); |
|
1055 |
|
1056 QTest::newRow("ascending... Check a bug in PersistentIndexes") |
|
1057 << 4 << 5 |
|
1058 << static_cast<int>(Qt::AscendingOrder) |
|
1059 << 0 |
|
1060 << (QStringList() |
|
1061 << "3" << "c" << "9" << "y" << "8" |
|
1062 << "2" << "b" << "7" << "3" << "u" |
|
1063 << "4" << "d" << "k" << "o" << "6" |
|
1064 << "1" << "a" << "o" << "8" << "k" |
|
1065 ) |
|
1066 << (QStringList() |
|
1067 << "1" << "a" << "o" << "8" << "k" |
|
1068 << "2" << "b" << "7" << "3" << "u" |
|
1069 << "3" << "c" << "9" << "y" << "8" |
|
1070 << "4" << "d" << "k" << "o" << "6" |
|
1071 ) |
|
1072 << (IntList() << 2 << 1 << 3 << 0) |
|
1073 << IntList() |
|
1074 << IntList(); |
|
1075 |
|
1076 QTest::newRow("ascending with some null cells inbetween") |
|
1077 << 4 << 5 |
|
1078 << static_cast<int>(Qt::AscendingOrder) |
|
1079 << 0 |
|
1080 << (QStringList() |
|
1081 << 0 << "a" << "o" << "8" << "k" |
|
1082 << "2" << "c" << "9" << "y" << "8" |
|
1083 << 0 << "d" << "k" << "o" << "6" |
|
1084 << "1" << "b" << "7" << "3" << "u") |
|
1085 << (QStringList() |
|
1086 << "1" << "b" << "7" << "3" << "u" |
|
1087 << "2" << "c" << "9" << "y" << "8" |
|
1088 << 0 << "a" << "o" << "8" << "k" |
|
1089 << 0 << "d" << "k" << "o" << "6") |
|
1090 << (IntList() << 1 << 0) |
|
1091 << IntList() |
|
1092 << IntList(); |
|
1093 |
|
1094 QTest::newRow("ascending hidden") |
|
1095 << 4 << 5 |
|
1096 << static_cast<int>(Qt::AscendingOrder) |
|
1097 << 0 |
|
1098 << (QStringList() |
|
1099 << "0" << "a" << "o" << "8" << "k" |
|
1100 << "3" << "d" << "k" << "o" << "6" |
|
1101 << "2" << "c" << "9" << "y" << "8" |
|
1102 << "1" << "b" << "7" << "3" << "u") |
|
1103 << (QStringList() |
|
1104 << "0" << "a" << "o" << "8" << "k" |
|
1105 << "1" << "b" << "7" << "3" << "u" |
|
1106 << "2" << "c" << "9" << "y" << "8" |
|
1107 << "3" << "d" << "k" << "o" << "6") |
|
1108 << (IntList() << 0 << 3 << 2 << 1) |
|
1109 << (IntList() << 0 << 2) |
|
1110 << (IntList() << 0 << 2); |
|
1111 |
|
1112 QTest::newRow("descending hidden") |
|
1113 << 4 << 5 |
|
1114 << static_cast<int>(Qt::DescendingOrder) |
|
1115 << 0 |
|
1116 << (QStringList() |
|
1117 << "0" << "a" << "o" << "8" << "k" |
|
1118 << "3" << "d" << "k" << "o" << "6" |
|
1119 << "2" << "c" << "9" << "y" << "8" |
|
1120 << "1" << "b" << "7" << "3" << "u") |
|
1121 << (QStringList() |
|
1122 << "3" << "d" << "k" << "o" << "6" |
|
1123 << "2" << "c" << "9" << "y" << "8" |
|
1124 << "1" << "b" << "7" << "3" << "u" |
|
1125 << "0" << "a" << "o" << "8" << "k") |
|
1126 << (IntList() << 3 << 0 << 1 << 2) |
|
1127 << (IntList() << 0 << 2) |
|
1128 << (IntList() << 3 << 1); |
|
1129 } |
|
1130 |
|
1131 void tst_QTableWidget::sortItems() |
|
1132 { |
|
1133 QFETCH(int, rowCount); |
|
1134 QFETCH(int, columnCount); |
|
1135 QFETCH(int, sortOrder); |
|
1136 QFETCH(int, sortColumn); |
|
1137 QFETCH(QStringList, initial); |
|
1138 QFETCH(QStringList, expected); |
|
1139 QFETCH(IntList, rows); |
|
1140 QFETCH(IntList, initialHidden); |
|
1141 QFETCH(IntList, expectedHidden); |
|
1142 |
|
1143 testWidget->setRowCount(rowCount); |
|
1144 testWidget->setColumnCount(columnCount); |
|
1145 |
|
1146 QAbstractItemModel *model = testWidget->model(); |
|
1147 QList<QPersistentModelIndex> persistent; |
|
1148 |
|
1149 int ti = 0; |
|
1150 for (int r = 0; r < rowCount; ++r) { |
|
1151 for (int c = 0; c < columnCount; ++c) { |
|
1152 QString str = initial.at(ti++); |
|
1153 if (!str.isNull()) { |
|
1154 testWidget->setItem(r, c, new QTableWidgetItem(str)); |
|
1155 } |
|
1156 } |
|
1157 if (testWidget->item(r, sortColumn)) |
|
1158 persistent << model->index(r, sortColumn, QModelIndex()); |
|
1159 } |
|
1160 |
|
1161 for (int h = 0; h < initialHidden.count(); ++h) |
|
1162 testWidget->hideRow(initialHidden.at(h)); |
|
1163 |
|
1164 QCOMPARE(testWidget->verticalHeader()->hiddenSectionCount(), initialHidden.count()); |
|
1165 |
|
1166 testWidget->sortItems(sortColumn, static_cast<Qt::SortOrder>(sortOrder)); |
|
1167 |
|
1168 int te = 0; |
|
1169 for (int i = 0; i < rows.count(); ++i) { |
|
1170 for (int j = 0; j < columnCount; ++j) { |
|
1171 QString value; |
|
1172 QTableWidgetItem *itm = testWidget->item(i, j); |
|
1173 if (itm) { |
|
1174 value = itm->text(); |
|
1175 } |
|
1176 QCOMPARE(value, expected.at(te++)); |
|
1177 } |
|
1178 QCOMPARE(persistent.at(i).row(), rows.at(i)); |
|
1179 //qDebug() << "persistent" << persistent.at(i).row() |
|
1180 // << "expected" << rows.at(i); |
|
1181 } |
|
1182 |
|
1183 for (int k = 0; k < expectedHidden.count(); ++k) |
|
1184 QVERIFY(testWidget->isRowHidden(expectedHidden.at(k))); |
|
1185 } |
|
1186 |
|
1187 void tst_QTableWidget::setItemWithSorting_data() |
|
1188 { |
|
1189 QTest::addColumn<int>("rowCount"); |
|
1190 QTest::addColumn<int>("columnCount"); |
|
1191 QTest::addColumn<int>("sortOrder"); |
|
1192 QTest::addColumn<int>("sortColumn"); |
|
1193 QTest::addColumn<QStringList>("initialValues"); |
|
1194 QTest::addColumn<int>("row"); |
|
1195 QTest::addColumn<int>("column"); |
|
1196 QTest::addColumn<QString>("newValue"); |
|
1197 QTest::addColumn<QStringList>("expectedValues"); |
|
1198 QTest::addColumn<IntList>("expectedRows"); |
|
1199 QTest::addColumn<bool>("reorderingExpected"); |
|
1200 |
|
1201 QTest::newRow("2x1 no change (ascending)") |
|
1202 << 2 << 1 |
|
1203 << static_cast<int>(Qt::AscendingOrder) << 0 |
|
1204 << (QStringList() << "0" << "1") |
|
1205 << 1 << 0 << "2" |
|
1206 << (QStringList() << "0" << "2") |
|
1207 << (IntList() << 0 << 1) |
|
1208 << false; |
|
1209 QTest::newRow("2x1 no change (descending)") |
|
1210 << 2 << 1 |
|
1211 << static_cast<int>(Qt::DescendingOrder) << 0 |
|
1212 << (QStringList() << "1" << "0") |
|
1213 << 0 << 0 << "2" |
|
1214 << (QStringList() << "2" << "0") |
|
1215 << (IntList() << 0 << 1) |
|
1216 << false; |
|
1217 QTest::newRow("2x1 reorder (ascending)") |
|
1218 << 2 << 1 |
|
1219 << static_cast<int>(Qt::AscendingOrder) << 0 |
|
1220 << (QStringList() << "0" << "1") |
|
1221 << 0 << 0 << "2" |
|
1222 << (QStringList() << "1" << "2") |
|
1223 << (IntList() << 1 << 0) |
|
1224 << true; |
|
1225 QTest::newRow("2x1 reorder (descending)") |
|
1226 << 2 << 1 |
|
1227 << static_cast<int>(Qt::DescendingOrder) << 0 |
|
1228 << (QStringList() << "1" << "0") |
|
1229 << 1 << 0 << "2" |
|
1230 << (QStringList() << "2" << "1") |
|
1231 << (IntList() << 1 << 0) |
|
1232 << true; |
|
1233 QTest::newRow("2x2 no change (ascending)") |
|
1234 << 2 << 2 |
|
1235 << static_cast<int>(Qt::AscendingOrder) << 0 |
|
1236 << (QStringList() |
|
1237 << "0" << "00" |
|
1238 << "1" << "11") |
|
1239 << 1 << 0 << "2" |
|
1240 << (QStringList() |
|
1241 << "0" << "00" |
|
1242 << "2" << "11") |
|
1243 << (IntList() << 0 << 1) |
|
1244 << false; |
|
1245 QTest::newRow("2x2 reorder (ascending)") |
|
1246 << 2 << 2 |
|
1247 << static_cast<int>(Qt::AscendingOrder) << 0 |
|
1248 << (QStringList() |
|
1249 << "0" << "00" |
|
1250 << "1" << "11") |
|
1251 << 0 << 0 << "2" |
|
1252 << (QStringList() |
|
1253 << "1" << "11" |
|
1254 << "2" << "00") |
|
1255 << (IntList() << 1 << 0) |
|
1256 << true; |
|
1257 QTest::newRow("2x2 reorder (ascending, sortColumn = 1)") |
|
1258 << 2 << 2 |
|
1259 << static_cast<int>(Qt::AscendingOrder) << 1 |
|
1260 << (QStringList() |
|
1261 << "00" << "0" |
|
1262 << "11" << "1") |
|
1263 << 0 << 1 << "2" |
|
1264 << (QStringList() |
|
1265 << "11" << "1" |
|
1266 << "00" << "2") |
|
1267 << (IntList() << 1 << 0) |
|
1268 << true; |
|
1269 QTest::newRow("2x2 no change (column != sortColumn)") |
|
1270 << 2 << 2 |
|
1271 << static_cast<int>(Qt::AscendingOrder) << 1 |
|
1272 << (QStringList() |
|
1273 << "00" << "0" |
|
1274 << "11" << "1") |
|
1275 << 0 << 0 << "22" |
|
1276 << (QStringList() |
|
1277 << "22" << "0" |
|
1278 << "11" << "1") |
|
1279 << (IntList() << 0 << 1) |
|
1280 << false; |
|
1281 QTest::newRow("8x4 reorder (ascending, sortColumn = 3)") |
|
1282 << 8 << 4 |
|
1283 << static_cast<int>(Qt::AscendingOrder) << 3 |
|
1284 << (QStringList() |
|
1285 << "q" << "v" << "u" << "0" |
|
1286 << "e" << "j" << "i" << "10" |
|
1287 << "h" << "d" << "c" << "12" |
|
1288 << "k" << "g" << "f" << "14" |
|
1289 << "w" << "y" << "x" << "2" |
|
1290 << "t" << "s" << "o" << "4" |
|
1291 << "z" << "p" << "r" << "6" |
|
1292 << "n" << "m" << "l" << "8") |
|
1293 << 2 << 3 << "5" |
|
1294 << (QStringList() |
|
1295 << "q" << "v" << "u" << "0" |
|
1296 << "e" << "j" << "i" << "10" |
|
1297 << "k" << "g" << "f" << "14" |
|
1298 << "w" << "y" << "x" << "2" |
|
1299 << "t" << "s" << "o" << "4" |
|
1300 << "h" << "d" << "c" << "5" |
|
1301 << "z" << "p" << "r" << "6" |
|
1302 << "n" << "m" << "l" << "8") |
|
1303 << (IntList() << 0 << 1 << 5 << 2 << 3 << 4 << 6 << 7) |
|
1304 << true; |
|
1305 } |
|
1306 |
|
1307 void tst_QTableWidget::setItemWithSorting() |
|
1308 { |
|
1309 QFETCH(int, rowCount); |
|
1310 QFETCH(int, columnCount); |
|
1311 QFETCH(int, sortOrder); |
|
1312 QFETCH(int, sortColumn); |
|
1313 QFETCH(QStringList, initialValues); |
|
1314 QFETCH(int, row); |
|
1315 QFETCH(int, column); |
|
1316 QFETCH(QString, newValue); |
|
1317 QFETCH(QStringList, expectedValues); |
|
1318 QFETCH(IntList, expectedRows); |
|
1319 QFETCH(bool, reorderingExpected); |
|
1320 |
|
1321 for (int i = 0; i < 2; ++i) { |
|
1322 QTableWidget w(rowCount, columnCount); |
|
1323 |
|
1324 QAbstractItemModel *model = w.model(); |
|
1325 QList<QPersistentModelIndex> persistent; |
|
1326 |
|
1327 int ti = 0; |
|
1328 for (int r = 0; r < rowCount; ++r) { |
|
1329 for (int c = 0; c < columnCount; ++c) { |
|
1330 QString str = initialValues.at(ti++); |
|
1331 w.setItem(r, c, new QTableWidgetItem(str)); |
|
1332 } |
|
1333 persistent << model->index(r, sortColumn); |
|
1334 } |
|
1335 |
|
1336 w.sortItems(sortColumn, static_cast<Qt::SortOrder>(sortOrder)); |
|
1337 w.setSortingEnabled(true); |
|
1338 |
|
1339 QSignalSpy dataChangedSpy(model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &))); |
|
1340 QSignalSpy layoutChangedSpy(model, SIGNAL(layoutChanged())); |
|
1341 |
|
1342 if (i == 0) { |
|
1343 // set a new item |
|
1344 QTableWidgetItem *item = new QTableWidgetItem(newValue); |
|
1345 w.setItem(row, column, item); |
|
1346 } else { |
|
1347 // change the data of existing item |
|
1348 QTableWidgetItem *item = w.item(row, column); |
|
1349 item->setText(newValue); |
|
1350 } |
|
1351 |
|
1352 ti = 0; |
|
1353 for (int r = 0; r < rowCount; ++r) { |
|
1354 for (int c = 0; c < columnCount; ++c) { |
|
1355 QString str = expectedValues.at(ti++); |
|
1356 QCOMPARE(w.item(r, c)->text(), str); |
|
1357 } |
|
1358 } |
|
1359 |
|
1360 for (int k = 0; k < persistent.count(); ++k) { |
|
1361 QCOMPARE(persistent.at(k).row(), expectedRows.at(k)); |
|
1362 int i = (persistent.at(k).row() * columnCount) + sortColumn; |
|
1363 QCOMPARE(persistent.at(k).data().toString(), expectedValues.at(i)); |
|
1364 } |
|
1365 |
|
1366 if (i == 0) |
|
1367 QCOMPARE(dataChangedSpy.count(), reorderingExpected ? 0 : 1); |
|
1368 else |
|
1369 QCOMPARE(dataChangedSpy.count(), 1); |
|
1370 |
|
1371 QCOMPARE(layoutChangedSpy.count(), reorderingExpected ? 1 : 0); |
|
1372 } |
|
1373 } |
|
1374 |
|
1375 void tst_QTableWidget::itemData() |
|
1376 { |
|
1377 QTableWidget widget(2, 2); |
|
1378 widget.setItem(0, 0, new QTableWidgetItem()); |
|
1379 QTableWidgetItem *item = widget.item(0, 0); |
|
1380 QVERIFY(item); |
|
1381 item->setFlags(item->flags() | Qt::ItemIsEditable); |
|
1382 item->setData(Qt::DisplayRole, QString("0")); |
|
1383 item->setData(Qt::CheckStateRole, Qt::PartiallyChecked); |
|
1384 item->setData(Qt::UserRole + 0, QString("1")); |
|
1385 item->setData(Qt::UserRole + 1, QString("2")); |
|
1386 item->setData(Qt::UserRole + 2, QString("3")); |
|
1387 item->setData(Qt::UserRole + 3, QString("4")); |
|
1388 QMap<int, QVariant> flags = widget.model()->itemData(widget.model()->index(0, 0)); |
|
1389 QCOMPARE(flags.count(), 6); |
|
1390 QCOMPARE(flags[(Qt::UserRole + 0)].toString(), QString("1")); |
|
1391 } |
|
1392 |
|
1393 void tst_QTableWidget::setItemData() |
|
1394 { |
|
1395 QTableWidget table(10, 10); |
|
1396 table.setSortingEnabled(false); |
|
1397 QSignalSpy dataChangedSpy(table.model(), SIGNAL(dataChanged(QModelIndex,QModelIndex))); |
|
1398 |
|
1399 QTableWidgetItem *item = new QTableWidgetItem; |
|
1400 table.setItem(0, 0, item); |
|
1401 QCOMPARE(dataChangedSpy.count(), 1); |
|
1402 QModelIndex idx = qvariant_cast<QModelIndex>(dataChangedSpy.takeFirst().at(0)); |
|
1403 |
|
1404 QMap<int, QVariant> data; |
|
1405 data.insert(Qt::DisplayRole, QLatin1String("Display")); |
|
1406 data.insert(Qt::ToolTipRole, QLatin1String("ToolTip")); |
|
1407 table.model()->setItemData(idx, data); |
|
1408 |
|
1409 QCOMPARE(table.model()->data(idx, Qt::DisplayRole).toString(), QLatin1String("Display")); |
|
1410 QCOMPARE(table.model()->data(idx, Qt::ToolTipRole).toString(), QLatin1String("ToolTip")); |
|
1411 QCOMPARE(dataChangedSpy.count(), 1); |
|
1412 QCOMPARE(idx, qvariant_cast<QModelIndex>(dataChangedSpy.takeFirst().at(0))); |
|
1413 |
|
1414 table.model()->setItemData(idx, data); |
|
1415 QCOMPARE(dataChangedSpy.count(), 0); |
|
1416 |
|
1417 data.clear(); |
|
1418 data.insert(Qt::DisplayRole, QLatin1String("dizplaye")); |
|
1419 table.model()->setItemData(idx, data); |
|
1420 QCOMPARE(table.model()->data(idx, Qt::DisplayRole).toString(), QLatin1String("dizplaye")); |
|
1421 QCOMPARE(dataChangedSpy.count(), 1); |
|
1422 } |
|
1423 |
|
1424 void tst_QTableWidget::cellWidget() |
|
1425 { |
|
1426 QTableWidget table(10, 10); |
|
1427 QWidget widget; |
|
1428 |
|
1429 QCOMPARE(table.cellWidget(5, 5), static_cast<QWidget*>(0)); |
|
1430 table.setCellWidget(5, 5, &widget); |
|
1431 QCOMPARE(table.cellWidget(5, 5), &widget); |
|
1432 table.removeCellWidget(5, 5); |
|
1433 QCOMPARE(table.cellWidget(5, 5), static_cast<QWidget*>(0)); |
|
1434 } |
|
1435 |
|
1436 void tst_QTableWidget::task231094() |
|
1437 { |
|
1438 QTableWidget tw(5, 3); |
|
1439 for (int x = 0; x < 3; x++) { |
|
1440 for (int y = 0; y < 5; y++) { |
|
1441 QTableWidgetItem *twi = new QTableWidgetItem(QLatin1String("1")); |
|
1442 if (y == 1) |
|
1443 twi->setFlags(Qt::ItemIsEnabled); |
|
1444 else |
|
1445 twi->setFlags(0); |
|
1446 tw.setItem(y, x, twi); |
|
1447 } |
|
1448 } |
|
1449 |
|
1450 tw.setCurrentCell(1, 1); |
|
1451 QCOMPARE(tw.currentRow(), 1); |
|
1452 QCOMPARE(tw.currentColumn(), 1); |
|
1453 |
|
1454 //this would provoke a end-less loop |
|
1455 QTest::keyClick(&tw, '1'); |
|
1456 |
|
1457 //all the items are disabled: the current item shouldn't have changed |
|
1458 QCOMPARE(tw.currentRow(), 1); |
|
1459 QCOMPARE(tw.currentColumn(), 1); |
|
1460 } |
|
1461 |
|
1462 void tst_QTableWidget::task219380_removeLastRow() |
|
1463 { |
|
1464 testWidget->setColumnCount(1); |
|
1465 testWidget->setRowCount(20); |
|
1466 QTableWidgetItem item; |
|
1467 testWidget->setItem(18, 0, &item); //we put the item in the the second last row |
|
1468 testWidget->openPersistentEditor(&item); |
|
1469 |
|
1470 testWidget->scrollToBottom(); |
|
1471 |
|
1472 testWidget->removeRow(19); //we remove the last row |
|
1473 |
|
1474 //we make sure the editor is at the cell position |
|
1475 QCOMPARE(testWidget->cellWidget(18, 0)->geometry(), testWidget->visualItemRect(&item)); |
|
1476 } |
|
1477 |
|
1478 void tst_QTableWidget::task262056_sortDuplicate() |
|
1479 { |
|
1480 testWidget->setColumnCount(2); |
|
1481 testWidget->setRowCount(8); |
|
1482 testWidget->setSortingEnabled(true); |
|
1483 QStringList items = (QStringList() << "AAA" << "BBB" << "CCC" << "CCC" << "DDD"\ |
|
1484 << "EEE" << "FFF" << "GGG"); |
|
1485 for (int i = 0; i<8; i++ ) { |
|
1486 QTableWidgetItem *twi = new QTableWidgetItem(items.at(i)); |
|
1487 testWidget->setItem(i,0,twi); |
|
1488 testWidget->setItem(i,1,new QTableWidgetItem(QString("item %1").arg(i))); |
|
1489 } |
|
1490 testWidget->sortItems(0, Qt::AscendingOrder); |
|
1491 QSignalSpy layoutChangedSpy(testWidget->model(), SIGNAL(layoutChanged())); |
|
1492 testWidget->item(3,0)->setBackgroundColor(Qt::red); |
|
1493 |
|
1494 QCOMPARE(layoutChangedSpy.count(),0); |
|
1495 |
|
1496 } |
|
1497 |
|
1498 |
|
1499 QTEST_MAIN(tst_QTableWidget) |
|
1500 #include "tst_qtablewidget.moc" |