| 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 | |
| 32 | #include <QStandardItem> |
| 33 | |
| 34 | class tst_QStandardItem : public QObject |
| 35 | { |
| 36 | Q_OBJECT |
| 37 | |
| 38 | private slots: |
| 39 | void ctor(); |
| 40 | void textCtor(); |
| 41 | void iconTextCtor(); |
| 42 | void rowsColumnsCtor(); |
| 43 | void getSetData(); |
| 44 | void getSetFlags(); |
| 45 | void getSetRowAndColumnCount(); |
| 46 | void getSetChild_data(); |
| 47 | void getSetChild(); |
| 48 | void parent(); |
| 49 | void insertColumn_data(); |
| 50 | void insertColumn(); |
| 51 | void insertRow_data(); |
| 52 | void insertRow(); |
| 53 | void insertRows_data(); |
| 54 | void insertRows(); |
| 55 | void appendColumn_data(); |
| 56 | void appendColumn(); |
| 57 | void appendRow_data(); |
| 58 | void appendRow(); |
| 59 | void takeChild(); |
| 60 | void takeColumn_data(); |
| 61 | void takeColumn(); |
| 62 | void takeRow_data(); |
| 63 | void takeRow(); |
| 64 | void streamItem(); |
| 65 | void deleteItem(); |
| 66 | void clone(); |
| 67 | void sortChildren(); |
| 68 | void subclassing(); |
| 69 | void lessThan(); |
| 70 | void clearData(); |
| 71 | }; |
| 72 | |
| 73 | void tst_QStandardItem::clearData() |
| 74 | { |
| 75 | QStandardItem item; |
| 76 | item.setData(QStringLiteral("Test" ), role: Qt::EditRole); |
| 77 | item.setData(value: 5, role: Qt::UserRole); |
| 78 | item.clearData(); |
| 79 | QCOMPARE(item.data(Qt::EditRole), QVariant()); |
| 80 | QCOMPARE(item.data(Qt::UserRole), QVariant()); |
| 81 | QCOMPARE(item.data(Qt::DisplayRole), QVariant()); |
| 82 | } |
| 83 | |
| 84 | void tst_QStandardItem::ctor() |
| 85 | { |
| 86 | QStandardItem item; |
| 87 | QVERIFY(!item.hasChildren()); |
| 88 | } |
| 89 | |
| 90 | void tst_QStandardItem::textCtor() |
| 91 | { |
| 92 | QLatin1String text("text" ); |
| 93 | QStandardItem item(text); |
| 94 | QCOMPARE(item.text(), text); |
| 95 | QVERIFY(!item.hasChildren()); |
| 96 | } |
| 97 | |
| 98 | void tst_QStandardItem::iconTextCtor() |
| 99 | { |
| 100 | QPixmap pixmap(32, 32); |
| 101 | pixmap.fill(fillColor: Qt::red); |
| 102 | QIcon icon(pixmap); |
| 103 | QLatin1String text("text" ); |
| 104 | QStandardItem item(icon, text); |
| 105 | QCOMPARE(item.icon(), icon); |
| 106 | QCOMPARE(item.text(), text); |
| 107 | QVERIFY(!item.hasChildren()); |
| 108 | } |
| 109 | |
| 110 | void tst_QStandardItem::rowsColumnsCtor() |
| 111 | { |
| 112 | const int rows = 5; |
| 113 | const int columns = 12; |
| 114 | QStandardItem item(rows, columns); |
| 115 | QCOMPARE(item.rowCount(), rows); |
| 116 | QCOMPARE(item.columnCount(), columns); |
| 117 | } |
| 118 | |
| 119 | void tst_QStandardItem::getSetData() |
| 120 | { |
| 121 | QStandardItem item; |
| 122 | for (int x = 0; x < 2; ++x) { |
| 123 | for (int i = 1; i <= 2; ++i) { |
| 124 | const QString iS = QString::number(i); |
| 125 | QString text = QLatin1String("text " ) + iS; |
| 126 | item.setText(text); |
| 127 | QCOMPARE(item.text(), text); |
| 128 | |
| 129 | QPixmap pixmap(32, 32); |
| 130 | pixmap.fill(fillColor: (i == 1) ? Qt::red : Qt::green); |
| 131 | QIcon icon(pixmap); |
| 132 | item.setIcon(icon); |
| 133 | QCOMPARE(item.icon(), icon); |
| 134 | |
| 135 | QString toolTip = QLatin1String("toolTip " ) + iS; |
| 136 | item.setToolTip(toolTip); |
| 137 | QCOMPARE(item.toolTip(), toolTip); |
| 138 | |
| 139 | QString statusTip = QLatin1String("statusTip " ) + iS; |
| 140 | item.setStatusTip(statusTip); |
| 141 | QCOMPARE(item.statusTip(), statusTip); |
| 142 | |
| 143 | QString whatsThis = QLatin1String("whatsThis " ) + iS; |
| 144 | item.setWhatsThis(whatsThis); |
| 145 | QCOMPARE(item.whatsThis(), whatsThis); |
| 146 | |
| 147 | QSize sizeHint(64*i, 48*i); |
| 148 | item.setSizeHint(sizeHint); |
| 149 | QCOMPARE(item.sizeHint(), sizeHint); |
| 150 | |
| 151 | QFont font; |
| 152 | item.setFont(font); |
| 153 | QCOMPARE(item.font(), font); |
| 154 | |
| 155 | Qt::Alignment textAlignment((i == 1) |
| 156 | ? Qt::AlignLeft|Qt::AlignVCenter |
| 157 | : Qt::AlignRight); |
| 158 | item.setTextAlignment(textAlignment); |
| 159 | QCOMPARE(item.textAlignment(), textAlignment); |
| 160 | |
| 161 | QColor backgroundColor((i == 1) ? Qt::blue : Qt::yellow); |
| 162 | item.setBackground(backgroundColor); |
| 163 | QCOMPARE(item.background().color(), backgroundColor); |
| 164 | |
| 165 | QColor textColor((i == 1) ? Qt::green : Qt::cyan); |
| 166 | item.setForeground(textColor); |
| 167 | QCOMPARE(item.foreground().color(), textColor); |
| 168 | |
| 169 | Qt::CheckState checkState((i == 1) ? Qt::PartiallyChecked : Qt::Checked); |
| 170 | item.setCheckState(checkState); |
| 171 | QCOMPARE(item.checkState(), checkState); |
| 172 | |
| 173 | QString accessibleText = QLatin1String("accessibleText " ) + iS; |
| 174 | item.setAccessibleText(accessibleText); |
| 175 | QCOMPARE(item.accessibleText(), accessibleText); |
| 176 | |
| 177 | QString accessibleDescription = QLatin1String("accessibleDescription " ) + iS; |
| 178 | item.setAccessibleDescription(accessibleDescription); |
| 179 | QCOMPARE(item.accessibleDescription(), accessibleDescription); |
| 180 | |
| 181 | QCOMPARE(item.text(), text); |
| 182 | QCOMPARE(item.icon(), icon); |
| 183 | QCOMPARE(item.toolTip(), toolTip); |
| 184 | QCOMPARE(item.statusTip(), statusTip); |
| 185 | QCOMPARE(item.whatsThis(), whatsThis); |
| 186 | QCOMPARE(item.sizeHint(), sizeHint); |
| 187 | QCOMPARE(item.font(), font); |
| 188 | QCOMPARE(item.textAlignment(), textAlignment); |
| 189 | QCOMPARE(item.background().color(), backgroundColor); |
| 190 | QCOMPARE(item.foreground().color(), textColor); |
| 191 | QCOMPARE(item.checkState(), checkState); |
| 192 | QCOMPARE(item.accessibleText(), accessibleText); |
| 193 | QCOMPARE(item.accessibleDescription(), accessibleDescription); |
| 194 | |
| 195 | QCOMPARE(qvariant_cast<QString>(item.data(Qt::DisplayRole)), text); |
| 196 | QCOMPARE(qvariant_cast<QIcon>(item.data(Qt::DecorationRole)), icon); |
| 197 | QCOMPARE(qvariant_cast<QString>(item.data(Qt::ToolTipRole)), toolTip); |
| 198 | QCOMPARE(qvariant_cast<QString>(item.data(Qt::StatusTipRole)), statusTip); |
| 199 | QCOMPARE(qvariant_cast<QString>(item.data(Qt::WhatsThisRole)), whatsThis); |
| 200 | QCOMPARE(qvariant_cast<QSize>(item.data(Qt::SizeHintRole)), sizeHint); |
| 201 | QCOMPARE(qvariant_cast<QFont>(item.data(Qt::FontRole)), font); |
| 202 | QCOMPARE(qvariant_cast<int>(item.data(Qt::TextAlignmentRole)), int(textAlignment)); |
| 203 | QCOMPARE(qvariant_cast<QBrush>(item.data(Qt::BackgroundRole)), QBrush(backgroundColor)); |
| 204 | QCOMPARE(qvariant_cast<QBrush>(item.data(Qt::ForegroundRole)), QBrush(textColor)); |
| 205 | QCOMPARE(qvariant_cast<int>(item.data(Qt::CheckStateRole)), int(checkState)); |
| 206 | QCOMPARE(qvariant_cast<QString>(item.data(Qt::AccessibleTextRole)), accessibleText); |
| 207 | QCOMPARE(qvariant_cast<QString>(item.data(Qt::AccessibleDescriptionRole)), accessibleDescription); |
| 208 | |
| 209 | item.setBackground(pixmap); |
| 210 | QCOMPARE(item.background().texture(), pixmap); |
| 211 | QCOMPARE(qvariant_cast<QBrush>(item.data(Qt::BackgroundRole)).texture(), pixmap); |
| 212 | } |
| 213 | item.setData(value: QVariant(), role: Qt::DisplayRole); |
| 214 | item.setData(value: QVariant(), role: Qt::DecorationRole); |
| 215 | item.setData(value: QVariant(), role: Qt::ToolTipRole); |
| 216 | item.setData(value: QVariant(), role: Qt::StatusTipRole); |
| 217 | item.setData(value: QVariant(), role: Qt::WhatsThisRole); |
| 218 | item.setData(value: QVariant(), role: Qt::SizeHintRole); |
| 219 | item.setData(value: QVariant(), role: Qt::FontRole); |
| 220 | item.setData(value: QVariant(), role: Qt::TextAlignmentRole); |
| 221 | item.setData(value: QVariant(), role: Qt::BackgroundRole); |
| 222 | item.setData(value: QVariant(), role: Qt::ForegroundRole); |
| 223 | item.setData(value: QVariant(), role: Qt::CheckStateRole); |
| 224 | item.setData(value: QVariant(), role: Qt::AccessibleTextRole); |
| 225 | item.setData(value: QVariant(), role: Qt::AccessibleDescriptionRole); |
| 226 | |
| 227 | QCOMPARE(item.data(Qt::DisplayRole), QVariant()); |
| 228 | QCOMPARE(item.data(Qt::DecorationRole), QVariant()); |
| 229 | QCOMPARE(item.data(Qt::ToolTipRole), QVariant()); |
| 230 | QCOMPARE(item.data(Qt::StatusTipRole), QVariant()); |
| 231 | QCOMPARE(item.data(Qt::WhatsThisRole), QVariant()); |
| 232 | QCOMPARE(item.data(Qt::SizeHintRole), QVariant()); |
| 233 | QCOMPARE(item.data(Qt::FontRole), QVariant()); |
| 234 | QCOMPARE(item.data(Qt::TextAlignmentRole), QVariant()); |
| 235 | QCOMPARE(item.data(Qt::BackgroundRole), QVariant()); |
| 236 | QCOMPARE(item.data(Qt::ForegroundRole), QVariant()); |
| 237 | QCOMPARE(item.data(Qt::CheckStateRole), QVariant()); |
| 238 | QCOMPARE(item.data(Qt::AccessibleTextRole), QVariant()); |
| 239 | QCOMPARE(item.data(Qt::AccessibleDescriptionRole), QVariant()); |
| 240 | } |
| 241 | } |
| 242 | |
| 243 | void tst_QStandardItem::getSetFlags() |
| 244 | { |
| 245 | QStandardItem item; |
| 246 | item.setEnabled(true); |
| 247 | QVERIFY(item.isEnabled()); |
| 248 | QVERIFY(item.flags() & Qt::ItemIsEnabled); |
| 249 | item.setEditable(true); |
| 250 | QVERIFY(item.isEditable()); |
| 251 | QVERIFY(item.flags() & Qt::ItemIsEditable); |
| 252 | item.setSelectable(true); |
| 253 | QVERIFY(item.isSelectable()); |
| 254 | QVERIFY(item.flags() & Qt::ItemIsSelectable); |
| 255 | item.setCheckable(true); |
| 256 | QVERIFY(item.isCheckable()); |
| 257 | QCOMPARE(item.checkState(), Qt::Unchecked); |
| 258 | QVERIFY(item.flags() & Qt::ItemIsUserCheckable); |
| 259 | item.setUserTristate(true); |
| 260 | QVERIFY(item.isUserTristate()); |
| 261 | QVERIFY(item.flags() & Qt::ItemIsUserTristate); |
| 262 | item.setAutoTristate(true); |
| 263 | QVERIFY(item.isAutoTristate()); |
| 264 | QVERIFY(item.flags() & Qt::ItemIsAutoTristate); |
| 265 | #if QT_CONFIG(draganddrop) |
| 266 | item.setDragEnabled(true); |
| 267 | QVERIFY(item.isDragEnabled()); |
| 268 | QVERIFY(item.flags() & Qt::ItemIsDragEnabled); |
| 269 | item.setDropEnabled(true); |
| 270 | QVERIFY(item.isDropEnabled()); |
| 271 | QVERIFY(item.flags() & Qt::ItemIsDropEnabled); |
| 272 | #endif |
| 273 | |
| 274 | QVERIFY(item.isEnabled()); |
| 275 | item.setEnabled(false); |
| 276 | QVERIFY(!item.isEnabled()); |
| 277 | QVERIFY(!(item.flags() & Qt::ItemIsEnabled)); |
| 278 | QVERIFY(item.isEditable()); |
| 279 | item.setEditable(false); |
| 280 | QVERIFY(!item.isEditable()); |
| 281 | QVERIFY(!(item.flags() & Qt::ItemIsEditable)); |
| 282 | QVERIFY(item.isSelectable()); |
| 283 | item.setSelectable(false); |
| 284 | QVERIFY(!item.isSelectable()); |
| 285 | QVERIFY(!(item.flags() & Qt::ItemIsSelectable)); |
| 286 | QVERIFY(item.isCheckable()); |
| 287 | item.setCheckable(false); |
| 288 | QVERIFY(!item.isCheckable()); |
| 289 | QVERIFY(!(item.flags() & Qt::ItemIsUserCheckable)); |
| 290 | item.setUserTristate(false); |
| 291 | QVERIFY(!item.isUserTristate()); |
| 292 | QVERIFY(!(item.flags() & Qt::ItemIsUserTristate)); |
| 293 | item.setAutoTristate(false); |
| 294 | QVERIFY(!item.isAutoTristate()); |
| 295 | QVERIFY(!(item.flags() & Qt::ItemIsAutoTristate)); |
| 296 | #if QT_CONFIG(draganddrop) |
| 297 | QVERIFY(item.isDragEnabled()); |
| 298 | item.setDragEnabled(false); |
| 299 | QVERIFY(!item.isDragEnabled()); |
| 300 | QVERIFY(!(item.flags() & Qt::ItemIsDragEnabled)); |
| 301 | QVERIFY(item.isDropEnabled()); |
| 302 | item.setDropEnabled(false); |
| 303 | QVERIFY(!item.isDropEnabled()); |
| 304 | QVERIFY(!(item.flags() & Qt::ItemIsDropEnabled)); |
| 305 | #endif |
| 306 | |
| 307 | item.setCheckable(false); |
| 308 | item.setCheckState(Qt::Checked); |
| 309 | item.setCheckable(true); |
| 310 | QCOMPARE(item.checkState(), Qt::Checked); |
| 311 | |
| 312 | #if QT_DEPRECATED_SINCE(5, 6) |
| 313 | QT_WARNING_PUSH |
| 314 | QT_WARNING_DISABLE_DEPRECATED |
| 315 | // deprecated API |
| 316 | item.setTristate(true); |
| 317 | QVERIFY(item.isTristate()); |
| 318 | QVERIFY(item.flags() & Qt::ItemIsTristate); |
| 319 | item.setTristate(false); |
| 320 | QVERIFY(!(item.flags() & Qt::ItemIsTristate)); |
| 321 | QT_WARNING_POP |
| 322 | #endif |
| 323 | } |
| 324 | |
| 325 | void tst_QStandardItem::getSetRowAndColumnCount() |
| 326 | { |
| 327 | QStandardItem item; |
| 328 | |
| 329 | item.setRowCount(-1); |
| 330 | QCOMPARE(item.rowCount(), 0); |
| 331 | |
| 332 | item.setColumnCount(-1); |
| 333 | QCOMPARE(item.columnCount(), 0); |
| 334 | |
| 335 | item.setRowCount(1); |
| 336 | QCOMPARE(item.rowCount(), 1); |
| 337 | QCOMPARE(item.columnCount(), 0); |
| 338 | |
| 339 | item.setColumnCount(1); |
| 340 | QCOMPARE(item.columnCount(), 1); |
| 341 | QCOMPARE(item.rowCount(), 1); |
| 342 | |
| 343 | item.setColumnCount(10); |
| 344 | QCOMPARE(item.columnCount(), 10); |
| 345 | QCOMPARE(item.rowCount(), 1); |
| 346 | |
| 347 | item.setRowCount(20); |
| 348 | QCOMPARE(item.rowCount(), 20); |
| 349 | QCOMPARE(item.columnCount(), 10); |
| 350 | |
| 351 | item.setRowCount(-1); |
| 352 | QCOMPARE(item.rowCount(), 20); |
| 353 | |
| 354 | item.setColumnCount(-1); |
| 355 | QCOMPARE(item.columnCount(), 10); |
| 356 | |
| 357 | item.setColumnCount(0); |
| 358 | QCOMPARE(item.columnCount(), 0); |
| 359 | QCOMPARE(item.rowCount(), 20); |
| 360 | |
| 361 | item.setRowCount(0); |
| 362 | QCOMPARE(item.rowCount(), 0); |
| 363 | } |
| 364 | |
| 365 | void tst_QStandardItem::getSetChild_data() |
| 366 | { |
| 367 | QTest::addColumn<int>(name: "rows" ); |
| 368 | QTest::addColumn<int>(name: "columns" ); |
| 369 | QTest::addColumn<int>(name: "row" ); |
| 370 | QTest::addColumn<int>(name: "column" ); |
| 371 | |
| 372 | QTest::newRow(dataTag: "0x0 children, child at (-1,-1)" ) << 0 << 0 << -1 << -1; |
| 373 | QTest::newRow(dataTag: "0x0 children, child at (0,0)" ) << 0 << 0 << 0 << 0; |
| 374 | } |
| 375 | |
| 376 | void tst_QStandardItem::getSetChild() |
| 377 | { |
| 378 | QFETCH(int, rows); |
| 379 | QFETCH(int, columns); |
| 380 | QFETCH(int, row); |
| 381 | QFETCH(int, column); |
| 382 | |
| 383 | QStandardItem item(rows, columns); |
| 384 | bool shouldHaveChildren = (rows > 0) && (columns > 0); |
| 385 | QCOMPARE(item.hasChildren(), shouldHaveChildren); |
| 386 | QCOMPARE(item.child(row, column), nullptr); |
| 387 | |
| 388 | QStandardItem *child = new QStandardItem; |
| 389 | item.setChild(row, column, item: child); |
| 390 | if ((row >= 0) && (column >= 0)) { |
| 391 | QCOMPARE(item.rowCount(), qMax(rows, row + 1)); |
| 392 | QCOMPARE(item.columnCount(), qMax(columns, column + 1)); |
| 393 | |
| 394 | QCOMPARE(item.child(row, column), child); |
| 395 | QCOMPARE(child->row(), row); |
| 396 | QCOMPARE(child->column(), column); |
| 397 | |
| 398 | QStandardItem *anotherChild = new QStandardItem; |
| 399 | item.setChild(row, column, item: anotherChild); |
| 400 | QCOMPARE(item.child(row, column), anotherChild); |
| 401 | QCOMPARE(anotherChild->row(), row); |
| 402 | QCOMPARE(anotherChild->column(), column); |
| 403 | item.setChild(row, column, item: nullptr); |
| 404 | } else { |
| 405 | delete child; |
| 406 | } |
| 407 | QCOMPARE(item.child(row, column), nullptr); |
| 408 | } |
| 409 | |
| 410 | void tst_QStandardItem::parent() |
| 411 | { |
| 412 | { |
| 413 | QStandardItem item; |
| 414 | QStandardItem *child = new QStandardItem; |
| 415 | QCOMPARE(child->parent(), nullptr); |
| 416 | item.setChild(row: 0, column: 0, item: child); |
| 417 | QCOMPARE(child->parent(), &item); |
| 418 | |
| 419 | QStandardItem *childOfChild = new QStandardItem; |
| 420 | child->setChild(row: 0, column: 0, item: childOfChild); |
| 421 | QCOMPARE(childOfChild->parent(), child); |
| 422 | } |
| 423 | |
| 424 | { |
| 425 | QStandardItemModel model; |
| 426 | QStandardItem *item = new QStandardItem; |
| 427 | model.appendRow(aitem: item); |
| 428 | // parent of a top-level item should be 0 |
| 429 | QCOMPARE(item->parent(), nullptr); |
| 430 | } |
| 431 | } |
| 432 | |
| 433 | void tst_QStandardItem::insertColumn_data() |
| 434 | { |
| 435 | QTest::addColumn<int>(name: "rows" ); |
| 436 | QTest::addColumn<int>(name: "columns" ); |
| 437 | QTest::addColumn<int>(name: "column" ); |
| 438 | QTest::addColumn<int>(name: "count" ); |
| 439 | |
| 440 | QTest::newRow(dataTag: "insert 0 at -1 in 0x0" ) << 0 << 0 << -1 << 0; |
| 441 | QTest::newRow(dataTag: "insert 0 at 0 in 0x0" ) << 0 << 0 << 0 << 0; |
| 442 | QTest::newRow(dataTag: "insert 0 at 0 in 1x0" ) << 1 << 0 << 0 << 0; |
| 443 | QTest::newRow(dataTag: "insert 0 at 0 in 0x1" ) << 0 << 1 << 0 << 0; |
| 444 | QTest::newRow(dataTag: "insert 0 at 0 in 1x1" ) << 1 << 1 << 0 << 0; |
| 445 | QTest::newRow(dataTag: "insert 1 at -1 in 0x0" ) << 0 << 0 << -1 << 1; |
| 446 | QTest::newRow(dataTag: "insert 1 at 0 in 0x0" ) << 0 << 0 << 0 << 1; |
| 447 | QTest::newRow(dataTag: "insert 1 at 0 in 1x0" ) << 1 << 0 << 0 << 1; |
| 448 | QTest::newRow(dataTag: "insert 1 at 0 in 0x1" ) << 0 << 1 << 0 << 1; |
| 449 | QTest::newRow(dataTag: "insert 1 at 0 in 1x1" ) << 1 << 1 << 0 << 1; |
| 450 | QTest::newRow(dataTag: "insert 1 at 1 in 1x1" ) << 1 << 1 << 1 << 1; |
| 451 | QTest::newRow(dataTag: "insert 1 at 0 in 2x1" ) << 2 << 1 << 0 << 1; |
| 452 | QTest::newRow(dataTag: "insert 1 at 1 in 2x1" ) << 2 << 1 << 1 << 1; |
| 453 | QTest::newRow(dataTag: "insert 1 at 0 in 1x2" ) << 1 << 2 << 0 << 1; |
| 454 | QTest::newRow(dataTag: "insert 1 at 1 in 1x2" ) << 1 << 2 << 1 << 1; |
| 455 | QTest::newRow(dataTag: "insert 1 at 0 in 8x4" ) << 8 << 4 << 0 << 1; |
| 456 | QTest::newRow(dataTag: "insert 1 at 1 in 8x4" ) << 8 << 4 << 1 << 1; |
| 457 | QTest::newRow(dataTag: "insert 1 at 2 in 8x4" ) << 8 << 4 << 2 << 1; |
| 458 | QTest::newRow(dataTag: "insert 1 at 3 in 8x4" ) << 8 << 4 << 3 << 1; |
| 459 | QTest::newRow(dataTag: "insert 1 at 4 in 8x4" ) << 8 << 4 << 4 << 1; |
| 460 | QTest::newRow(dataTag: "insert 4 at 0 in 8x4" ) << 8 << 4 << 0 << 4; |
| 461 | QTest::newRow(dataTag: "insert 4 at 4 in 8x4" ) << 8 << 4 << 4 << 4; |
| 462 | QTest::newRow(dataTag: "insert 6 at 0 in 8x4" ) << 8 << 4 << 0 << 6; |
| 463 | QTest::newRow(dataTag: "insert 6 at 4 in 8x4" ) << 8 << 4 << 4 << 6; |
| 464 | } |
| 465 | |
| 466 | void tst_QStandardItem::insertColumn() |
| 467 | { |
| 468 | QFETCH(int, rows); |
| 469 | QFETCH(int, columns); |
| 470 | QFETCH(int, column); |
| 471 | QFETCH(int, count); |
| 472 | |
| 473 | QStandardItem item(rows, columns); |
| 474 | |
| 475 | // make items for a new column |
| 476 | QList<QStandardItem*> columnItems; |
| 477 | for (int i = 0; i < count; ++i) |
| 478 | columnItems.append(t: new QStandardItem); |
| 479 | |
| 480 | item.insertColumn(column, items: columnItems); |
| 481 | |
| 482 | if (column >= 0) { |
| 483 | QCOMPARE(item.columnCount(), columns + 1); |
| 484 | QCOMPARE(item.rowCount(), qMax(rows, count)); |
| 485 | // check to make sure items were inserted in correct place |
| 486 | for (int i = 0; i < count; ++i) |
| 487 | QCOMPARE(item.child(i, column), columnItems.at(i)); |
| 488 | for (int i = count; i < item.rowCount(); ++i) |
| 489 | QCOMPARE(item.child(i, column), nullptr); |
| 490 | } else { |
| 491 | QCOMPARE(item.columnCount(), columns); |
| 492 | QCOMPARE(item.rowCount(), rows); |
| 493 | qDeleteAll(c: columnItems); |
| 494 | } |
| 495 | } |
| 496 | |
| 497 | void tst_QStandardItem::insertRow_data() |
| 498 | { |
| 499 | QTest::addColumn<int>(name: "rows" ); |
| 500 | QTest::addColumn<int>(name: "columns" ); |
| 501 | QTest::addColumn<int>(name: "row" ); |
| 502 | QTest::addColumn<int>(name: "count" ); |
| 503 | |
| 504 | QTest::newRow(dataTag: "insert 0 at -1 in 0x0" ) << 0 << 0 << -1 << 0; |
| 505 | QTest::newRow(dataTag: "insert 0 at 0 in 0x0" ) << 0 << 0 << 0 << 0; |
| 506 | QTest::newRow(dataTag: "insert 0 at 0 in 1x0" ) << 1 << 0 << 0 << 0; |
| 507 | QTest::newRow(dataTag: "insert 0 at 0 in 0x1" ) << 0 << 1 << 0 << 0; |
| 508 | QTest::newRow(dataTag: "insert 0 at 0 in 1x1" ) << 1 << 1 << 0 << 0; |
| 509 | QTest::newRow(dataTag: "insert 1 at -1 in 0x0" ) << 0 << 0 << -1 << 1; |
| 510 | QTest::newRow(dataTag: "insert 1 at 0 in 0x0" ) << 0 << 0 << 0 << 1; |
| 511 | QTest::newRow(dataTag: "insert 1 at 0 in 1x0" ) << 1 << 0 << 0 << 1; |
| 512 | QTest::newRow(dataTag: "insert 1 at 0 in 0x1" ) << 0 << 1 << 0 << 1; |
| 513 | QTest::newRow(dataTag: "insert 1 at 0 in 1x1" ) << 1 << 1 << 0 << 1; |
| 514 | QTest::newRow(dataTag: "insert 1 at 1 in 1x1" ) << 1 << 1 << 1 << 1; |
| 515 | QTest::newRow(dataTag: "insert 1 at 0 in 2x1" ) << 2 << 1 << 0 << 1; |
| 516 | QTest::newRow(dataTag: "insert 1 at 1 in 2x1" ) << 2 << 1 << 1 << 1; |
| 517 | QTest::newRow(dataTag: "insert 1 at 0 in 1x2" ) << 1 << 2 << 0 << 1; |
| 518 | QTest::newRow(dataTag: "insert 1 at 1 in 1x2" ) << 1 << 2 << 1 << 1; |
| 519 | QTest::newRow(dataTag: "insert 1 at 0 in 4x8" ) << 4 << 8 << 0 << 1; |
| 520 | QTest::newRow(dataTag: "insert 1 at 1 in 4x8" ) << 4 << 8 << 1 << 1; |
| 521 | QTest::newRow(dataTag: "insert 1 at 2 in 4x8" ) << 4 << 8 << 2 << 1; |
| 522 | QTest::newRow(dataTag: "insert 1 at 3 in 4x8" ) << 4 << 8 << 3 << 1; |
| 523 | QTest::newRow(dataTag: "insert 1 at 4 in 4x8" ) << 4 << 8 << 4 << 1; |
| 524 | QTest::newRow(dataTag: "insert 4 at 0 in 4x8" ) << 4 << 8 << 0 << 4; |
| 525 | QTest::newRow(dataTag: "insert 4 at 4 in 4x8" ) << 4 << 8 << 4 << 4; |
| 526 | QTest::newRow(dataTag: "insert 6 at 0 in 4x8" ) << 4 << 8 << 0 << 6; |
| 527 | QTest::newRow(dataTag: "insert 6 at 4 in 4x8" ) << 4 << 8 << 4 << 6; |
| 528 | } |
| 529 | |
| 530 | void tst_QStandardItem::insertRow() |
| 531 | { |
| 532 | QFETCH(int, rows); |
| 533 | QFETCH(int, columns); |
| 534 | QFETCH(int, row); |
| 535 | QFETCH(int, count); |
| 536 | |
| 537 | QStandardItem item(rows, columns); |
| 538 | |
| 539 | // make items for a new column |
| 540 | QList<QStandardItem*> rowItems; |
| 541 | for (int i = 0; i < count; ++i) |
| 542 | rowItems.append(t: new QStandardItem); |
| 543 | |
| 544 | item.insertRow(row, items: rowItems); |
| 545 | |
| 546 | if (row >= 0) { |
| 547 | QCOMPARE(item.columnCount(), qMax(columns, count)); |
| 548 | QCOMPARE(item.rowCount(), rows + 1); |
| 549 | // check to make sure items were inserted in correct place |
| 550 | for (int i = 0; i < count; ++i) |
| 551 | QCOMPARE(item.child(row, i), rowItems.at(i)); |
| 552 | for (int i = count; i < item.columnCount(); ++i) |
| 553 | QCOMPARE(item.child(row, i), nullptr); |
| 554 | } else { |
| 555 | QCOMPARE(item.columnCount(), columns); |
| 556 | QCOMPARE(item.rowCount(), rows); |
| 557 | qDeleteAll(c: rowItems); |
| 558 | } |
| 559 | } |
| 560 | |
| 561 | void tst_QStandardItem::insertRows_data() |
| 562 | { |
| 563 | QTest::addColumn<int>(name: "rows" ); |
| 564 | QTest::addColumn<int>(name: "columns" ); |
| 565 | QTest::addColumn<int>(name: "insertAt" ); |
| 566 | QTest::addColumn<int>(name: "insertCount" ); |
| 567 | |
| 568 | QTest::newRow(dataTag: "insert {0,1} at 0 in 0x0" ) << 0 << 0 << 0 << 2; |
| 569 | } |
| 570 | |
| 571 | void tst_QStandardItem::insertRows() |
| 572 | { |
| 573 | QFETCH(int, rows); |
| 574 | QFETCH(int, columns); |
| 575 | QFETCH(int, insertAt); |
| 576 | QFETCH(int, insertCount); |
| 577 | |
| 578 | QStandardItem item(rows, columns); |
| 579 | |
| 580 | QList<QStandardItem*> items; |
| 581 | for (int i = 0; i < insertCount; ++i) |
| 582 | items.append(t: new QStandardItem()); |
| 583 | item.insertRows(row: insertAt, items); |
| 584 | |
| 585 | QCOMPARE(item.rowCount(), rows + insertCount); |
| 586 | } |
| 587 | |
| 588 | void tst_QStandardItem::appendColumn_data() |
| 589 | { |
| 590 | QTest::addColumn<int>(name: "rows" ); |
| 591 | QTest::addColumn<int>(name: "columns" ); |
| 592 | QTest::addColumn<int>(name: "count" ); |
| 593 | |
| 594 | QTest::newRow(dataTag: "append 0 to 0x0" ) << 0 << 0 << 0; |
| 595 | QTest::newRow(dataTag: "append 1 to 0x0" ) << 0 << 0 << 1; |
| 596 | QTest::newRow(dataTag: "append 1 to 1x0" ) << 1 << 0 << 1; |
| 597 | QTest::newRow(dataTag: "append 1 to 0x1" ) << 0 << 1 << 1; |
| 598 | QTest::newRow(dataTag: "append 1 to 1x1" ) << 1 << 1 << 1; |
| 599 | QTest::newRow(dataTag: "append 1 to 2x0" ) << 2 << 0 << 1; |
| 600 | QTest::newRow(dataTag: "append 1 to 0x2" ) << 0 << 2 << 1; |
| 601 | QTest::newRow(dataTag: "append 1 to 2x1" ) << 2 << 1 << 1; |
| 602 | QTest::newRow(dataTag: "append 1 to 1x2" ) << 1 << 2 << 1; |
| 603 | QTest::newRow(dataTag: "append 1 to 2x2" ) << 2 << 2 << 1; |
| 604 | QTest::newRow(dataTag: "append 2 to 0x0" ) << 0 << 0 << 2; |
| 605 | QTest::newRow(dataTag: "append 2 to 1x0" ) << 1 << 0 << 2; |
| 606 | QTest::newRow(dataTag: "append 2 to 0x1" ) << 0 << 1 << 2; |
| 607 | QTest::newRow(dataTag: "append 2 to 1x1" ) << 1 << 1 << 2; |
| 608 | QTest::newRow(dataTag: "append 2 to 2x0" ) << 2 << 0 << 2; |
| 609 | QTest::newRow(dataTag: "append 2 to 0x2" ) << 0 << 2 << 2; |
| 610 | QTest::newRow(dataTag: "append 2 to 2x1" ) << 2 << 1 << 2; |
| 611 | QTest::newRow(dataTag: "append 2 to 1x2" ) << 1 << 2 << 2; |
| 612 | QTest::newRow(dataTag: "append 2 to 2x2" ) << 2 << 2 << 2; |
| 613 | QTest::newRow(dataTag: "append 3 to 2x1" ) << 2 << 1 << 3; |
| 614 | QTest::newRow(dataTag: "append 3 to 1x2" ) << 1 << 2 << 3; |
| 615 | QTest::newRow(dataTag: "append 3 to 2x2" ) << 2 << 2 << 3; |
| 616 | QTest::newRow(dataTag: "append 3 to 4x2" ) << 4 << 2 << 3; |
| 617 | QTest::newRow(dataTag: "append 3 to 2x4" ) << 2 << 4 << 3; |
| 618 | QTest::newRow(dataTag: "append 3 to 4x4" ) << 4 << 4 << 3; |
| 619 | QTest::newRow(dataTag: "append 7 to 4x2" ) << 4 << 2 << 7; |
| 620 | QTest::newRow(dataTag: "append 7 to 2x4" ) << 2 << 4 << 7; |
| 621 | QTest::newRow(dataTag: "append 7 to 4x4" ) << 4 << 4 << 7; |
| 622 | } |
| 623 | |
| 624 | void tst_QStandardItem::appendColumn() |
| 625 | { |
| 626 | QFETCH(int, rows); |
| 627 | QFETCH(int, columns); |
| 628 | QFETCH(int, count); |
| 629 | |
| 630 | QStandardItem item(rows, columns); |
| 631 | QList<QStandardItem*> originalChildren; |
| 632 | // initialize children |
| 633 | for (int i = 0; i < rows; ++i) { |
| 634 | for (int j = 0; j < columns; ++j) { |
| 635 | QStandardItem *child = new QStandardItem; |
| 636 | originalChildren.append(t: child); |
| 637 | item.setChild(row: i, column: j, item: child); |
| 638 | } |
| 639 | } |
| 640 | |
| 641 | // make items for a new column |
| 642 | QList<QStandardItem*> columnItems; |
| 643 | for (int i = 0; i < count; ++i) |
| 644 | columnItems.append(t: new QStandardItem); |
| 645 | |
| 646 | item.appendColumn(aitems: columnItems); |
| 647 | |
| 648 | QCOMPARE(item.columnCount(), columns + 1); |
| 649 | QCOMPARE(item.rowCount(), qMax(rows, count)); |
| 650 | // check to make sure items were inserted in correct place |
| 651 | for (int i = 0; i < count; ++i) |
| 652 | QCOMPARE(item.child(i, columns), columnItems.at(i)); |
| 653 | for (int i = count; i < item.rowCount(); ++i) |
| 654 | QCOMPARE(item.child(i, columns), nullptr); |
| 655 | |
| 656 | // make sure original children remained unchanged |
| 657 | for (int i = 0; i < rows; ++i) { |
| 658 | for (int j = 0; j < columns; ++j) |
| 659 | QCOMPARE(item.child(i, j), originalChildren.at(i*columns+j)); |
| 660 | } |
| 661 | } |
| 662 | |
| 663 | void tst_QStandardItem::appendRow_data() |
| 664 | { |
| 665 | QTest::addColumn<int>(name: "rows" ); |
| 666 | QTest::addColumn<int>(name: "columns" ); |
| 667 | QTest::addColumn<int>(name: "count" ); |
| 668 | |
| 669 | QTest::newRow(dataTag: "append 0 to 0x0" ) << 0 << 0 << 0; |
| 670 | QTest::newRow(dataTag: "append 1 to 0x0" ) << 0 << 0 << 1; |
| 671 | QTest::newRow(dataTag: "append 1 to 1x0" ) << 1 << 0 << 1; |
| 672 | QTest::newRow(dataTag: "append 1 to 0x1" ) << 0 << 1 << 1; |
| 673 | QTest::newRow(dataTag: "append 1 to 1x1" ) << 1 << 1 << 1; |
| 674 | QTest::newRow(dataTag: "append 1 to 2x0" ) << 2 << 0 << 1; |
| 675 | QTest::newRow(dataTag: "append 1 to 0x2" ) << 0 << 2 << 1; |
| 676 | QTest::newRow(dataTag: "append 1 to 2x1" ) << 2 << 1 << 1; |
| 677 | QTest::newRow(dataTag: "append 1 to 1x2" ) << 1 << 2 << 1; |
| 678 | QTest::newRow(dataTag: "append 1 to 2x2" ) << 2 << 2 << 1; |
| 679 | QTest::newRow(dataTag: "append 2 to 0x0" ) << 0 << 0 << 2; |
| 680 | QTest::newRow(dataTag: "append 2 to 1x0" ) << 1 << 0 << 2; |
| 681 | QTest::newRow(dataTag: "append 2 to 0x1" ) << 0 << 1 << 2; |
| 682 | QTest::newRow(dataTag: "append 2 to 1x1" ) << 1 << 1 << 2; |
| 683 | QTest::newRow(dataTag: "append 2 to 2x0" ) << 2 << 0 << 2; |
| 684 | QTest::newRow(dataTag: "append 2 to 0x2" ) << 0 << 2 << 2; |
| 685 | QTest::newRow(dataTag: "append 2 to 2x1" ) << 2 << 1 << 2; |
| 686 | QTest::newRow(dataTag: "append 2 to 1x2" ) << 1 << 2 << 2; |
| 687 | QTest::newRow(dataTag: "append 2 to 2x2" ) << 2 << 2 << 2; |
| 688 | QTest::newRow(dataTag: "append 3 to 2x1" ) << 2 << 1 << 3; |
| 689 | QTest::newRow(dataTag: "append 3 to 1x2" ) << 1 << 2 << 3; |
| 690 | QTest::newRow(dataTag: "append 3 to 2x2" ) << 2 << 2 << 3; |
| 691 | QTest::newRow(dataTag: "append 3 to 4x2" ) << 4 << 2 << 3; |
| 692 | QTest::newRow(dataTag: "append 3 to 2x4" ) << 2 << 4 << 3; |
| 693 | QTest::newRow(dataTag: "append 3 to 4x4" ) << 4 << 4 << 3; |
| 694 | QTest::newRow(dataTag: "append 7 to 4x2" ) << 4 << 2 << 7; |
| 695 | QTest::newRow(dataTag: "append 7 to 2x4" ) << 2 << 4 << 7; |
| 696 | QTest::newRow(dataTag: "append 7 to 4x4" ) << 4 << 4 << 7; |
| 697 | } |
| 698 | |
| 699 | void tst_QStandardItem::appendRow() |
| 700 | { |
| 701 | QFETCH(int, rows); |
| 702 | QFETCH(int, columns); |
| 703 | QFETCH(int, count); |
| 704 | |
| 705 | QStandardItem item(rows, columns); |
| 706 | QList<QStandardItem*> originalChildren; |
| 707 | // initialize children |
| 708 | for (int i = 0; i < rows; ++i) { |
| 709 | for (int j = 0; j < columns; ++j) { |
| 710 | QStandardItem *child = new QStandardItem; |
| 711 | originalChildren.append(t: child); |
| 712 | item.setChild(row: i, column: j, item: child); |
| 713 | } |
| 714 | } |
| 715 | |
| 716 | // make items for a new row |
| 717 | QList<QStandardItem*> rowItems; |
| 718 | for (int i = 0; i < count; ++i) |
| 719 | rowItems.append(t: new QStandardItem); |
| 720 | |
| 721 | item.appendRow(aitems: rowItems); |
| 722 | |
| 723 | QCOMPARE(item.rowCount(), rows + 1); |
| 724 | QCOMPARE(item.columnCount(), qMax(columns, count)); |
| 725 | // check to make sure items were inserted in correct place |
| 726 | for (int i = 0; i < count; ++i) |
| 727 | QCOMPARE(item.child(rows, i), rowItems.at(i)); |
| 728 | for (int i = count; i < item.columnCount(); ++i) |
| 729 | QCOMPARE(item.child(rows, i), nullptr); |
| 730 | |
| 731 | // make sure original children remained unchanged |
| 732 | for (int i = 0; i < rows; ++i) { |
| 733 | for (int j = 0; j < columns; ++j) |
| 734 | QCOMPARE(item.child(i, j), originalChildren.at(i*columns+j)); |
| 735 | } |
| 736 | } |
| 737 | |
| 738 | void tst_QStandardItem::takeChild() |
| 739 | { |
| 740 | QList<QStandardItem*> itemList; |
| 741 | for (int i = 0; i < 10; ++i) |
| 742 | itemList.append(t: new QStandardItem); |
| 743 | QStandardItem item; |
| 744 | item.appendColumn(aitems: itemList); |
| 745 | |
| 746 | for (int i = 0; i < item.rowCount(); ++i) { |
| 747 | QCOMPARE(item.takeChild(i), itemList.at(i)); |
| 748 | QCOMPARE(item.takeChild(0, 0), nullptr); |
| 749 | for (int j = i + 1; j < item.rowCount(); ++j) |
| 750 | QCOMPARE(item.child(j), itemList.at(j)); |
| 751 | } |
| 752 | qDeleteAll(c: itemList); |
| 753 | } |
| 754 | |
| 755 | void tst_QStandardItem::takeColumn_data() |
| 756 | { |
| 757 | QTest::addColumn<int>(name: "rows" ); |
| 758 | QTest::addColumn<int>(name: "columns" ); |
| 759 | QTest::addColumn<int>(name: "column" ); |
| 760 | QTest::addColumn<bool>(name: "expectSuccess" ); |
| 761 | |
| 762 | QTest::newRow(dataTag: "take -1 from 0x0" ) << 0 << 0 << -1 << false; |
| 763 | QTest::newRow(dataTag: "take 0 from 0x0" ) << 0 << 0 << 0 << false; |
| 764 | QTest::newRow(dataTag: "take 0 from 1x0" ) << 1 << 0 << 0 << false; |
| 765 | QTest::newRow(dataTag: "take 0 from 0x1" ) << 0 << 1 << 0 << true; |
| 766 | QTest::newRow(dataTag: "take 1 from 0x1" ) << 0 << 1 << 1 << false; |
| 767 | QTest::newRow(dataTag: "take 0 from 1x1" ) << 1 << 1 << 0 << true; |
| 768 | QTest::newRow(dataTag: "take 1 from 1x1" ) << 0 << 1 << 1 << false; |
| 769 | QTest::newRow(dataTag: "take 0 from 4x1" ) << 4 << 1 << 0 << true; |
| 770 | QTest::newRow(dataTag: "take 1 from 4x1" ) << 4 << 1 << 1 << false; |
| 771 | QTest::newRow(dataTag: "take 0 from 4x8" ) << 4 << 8 << 0 << true; |
| 772 | QTest::newRow(dataTag: "take 7 from 4x8" ) << 4 << 8 << 7 << true; |
| 773 | QTest::newRow(dataTag: "take 8 from 4x8" ) << 4 << 8 << 8 << false; |
| 774 | } |
| 775 | |
| 776 | void tst_QStandardItem::takeColumn() |
| 777 | { |
| 778 | QFETCH(int, rows); |
| 779 | QFETCH(int, columns); |
| 780 | QFETCH(int, column); |
| 781 | QFETCH(bool, expectSuccess); |
| 782 | |
| 783 | QStandardItem item(rows, columns); |
| 784 | QList<QStandardItem*> originalChildren; |
| 785 | // initialize children |
| 786 | for (int i = 0; i < rows; ++i) { |
| 787 | for (int j = 0; j < columns; ++j) { |
| 788 | QStandardItem *child = new QStandardItem; |
| 789 | originalChildren.append(t: child); |
| 790 | item.setChild(row: i, column: j, item: child); |
| 791 | } |
| 792 | } |
| 793 | |
| 794 | QList<QStandardItem *> taken = item.takeColumn(column); |
| 795 | if (expectSuccess) { |
| 796 | QCOMPARE(taken.count(), item.rowCount()); |
| 797 | QCOMPARE(item.columnCount(), columns - 1); |
| 798 | int index = column; |
| 799 | for (int i = 0; i < taken.count(); ++i) { |
| 800 | QCOMPARE(taken.at(i), originalChildren.takeAt(index)); |
| 801 | index += item.columnCount(); |
| 802 | } |
| 803 | index = 0; |
| 804 | for (int i = 0; i < item.rowCount(); ++i) { |
| 805 | for (int j = 0; j < item.columnCount(); ++j) { |
| 806 | QCOMPARE(item.child(i, j), originalChildren.at(index)); |
| 807 | ++index; |
| 808 | } |
| 809 | } |
| 810 | } else { |
| 811 | QVERIFY(taken.isEmpty()); |
| 812 | } |
| 813 | qDeleteAll(c: taken); |
| 814 | } |
| 815 | |
| 816 | void tst_QStandardItem::takeRow_data() |
| 817 | { |
| 818 | QTest::addColumn<int>(name: "rows" ); |
| 819 | QTest::addColumn<int>(name: "columns" ); |
| 820 | QTest::addColumn<int>(name: "row" ); |
| 821 | QTest::addColumn<bool>(name: "expectSuccess" ); |
| 822 | |
| 823 | QTest::newRow(dataTag: "take -1 from 0x0" ) << 0 << 0 << -1 << false; |
| 824 | QTest::newRow(dataTag: "take 0 from 0x0" ) << 0 << 0 << 0 << false; |
| 825 | QTest::newRow(dataTag: "take 0 from 1x0" ) << 1 << 0 << 0 << true; |
| 826 | QTest::newRow(dataTag: "take 0 from 0x1" ) << 0 << 1 << 0 << false; |
| 827 | QTest::newRow(dataTag: "take 1 from 0x1" ) << 0 << 1 << 1 << false; |
| 828 | QTest::newRow(dataTag: "take 0 from 1x1" ) << 1 << 1 << 0 << true; |
| 829 | QTest::newRow(dataTag: "take 1 from 1x1" ) << 0 << 1 << 1 << false; |
| 830 | QTest::newRow(dataTag: "take 0 from 1x4" ) << 1 << 4 << 0 << true; |
| 831 | QTest::newRow(dataTag: "take 1 from 1x4" ) << 1 << 4 << 1 << false; |
| 832 | QTest::newRow(dataTag: "take 0 from 8x4" ) << 8 << 4 << 0 << true; |
| 833 | QTest::newRow(dataTag: "take 7 from 8x4" ) << 8 << 4 << 7 << true; |
| 834 | QTest::newRow(dataTag: "take 8 from 8x4" ) << 8 << 4 << 8 << false; |
| 835 | } |
| 836 | |
| 837 | void tst_QStandardItem::takeRow() |
| 838 | { |
| 839 | QFETCH(int, rows); |
| 840 | QFETCH(int, columns); |
| 841 | QFETCH(int, row); |
| 842 | QFETCH(bool, expectSuccess); |
| 843 | |
| 844 | QStandardItem item(rows, columns); |
| 845 | QList<QStandardItem*> originalChildren; |
| 846 | // initialize children |
| 847 | for (int i = 0; i < rows; ++i) { |
| 848 | for (int j = 0; j < columns; ++j) { |
| 849 | QStandardItem *child = new QStandardItem; |
| 850 | originalChildren.append(t: child); |
| 851 | item.setChild(row: i, column: j, item: child); |
| 852 | } |
| 853 | } |
| 854 | |
| 855 | QList<QStandardItem *> taken = item.takeRow(row); |
| 856 | if (expectSuccess) { |
| 857 | QCOMPARE(taken.count(), item.columnCount()); |
| 858 | QCOMPARE(item.rowCount(), rows - 1); |
| 859 | int index = row * columns; |
| 860 | for (int i = 0; i < taken.count(); ++i) { |
| 861 | QCOMPARE(taken.at(i), originalChildren.takeAt(index)); |
| 862 | } |
| 863 | index = 0; |
| 864 | for (int i = 0; i < item.rowCount(); ++i) { |
| 865 | for (int j = 0; j < item.columnCount(); ++j) { |
| 866 | QCOMPARE(item.child(i, j), originalChildren.at(index)); |
| 867 | ++index; |
| 868 | } |
| 869 | } |
| 870 | } else { |
| 871 | QVERIFY(taken.isEmpty()); |
| 872 | } |
| 873 | qDeleteAll(c: taken); |
| 874 | } |
| 875 | |
| 876 | void tst_QStandardItem::streamItem() |
| 877 | { |
| 878 | QStandardItem item; |
| 879 | |
| 880 | item.setText(QLatin1String("text" )); |
| 881 | item.setToolTip(QLatin1String("toolTip" )); |
| 882 | item.setStatusTip(QLatin1String("statusTip" )); |
| 883 | item.setWhatsThis(QLatin1String("whatsThis" )); |
| 884 | item.setSizeHint(QSize(64, 48)); |
| 885 | item.setFont(QFont()); |
| 886 | item.setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); |
| 887 | item.setBackground(QColor(Qt::blue)); |
| 888 | item.setForeground(QColor(Qt::green)); |
| 889 | item.setCheckState(Qt::PartiallyChecked); |
| 890 | item.setAccessibleText(QLatin1String("accessibleText" )); |
| 891 | item.setAccessibleDescription(QLatin1String("accessibleDescription" )); |
| 892 | |
| 893 | QByteArray ba; |
| 894 | { |
| 895 | QDataStream ds(&ba, QIODevice::WriteOnly); |
| 896 | ds << item; |
| 897 | } |
| 898 | { |
| 899 | QStandardItem streamedItem; |
| 900 | QDataStream ds(&ba, QIODevice::ReadOnly); |
| 901 | ds >> streamedItem; |
| 902 | QCOMPARE(streamedItem.text(), item.text()); |
| 903 | QCOMPARE(streamedItem.toolTip(), item.toolTip()); |
| 904 | QCOMPARE(streamedItem.statusTip(), item.statusTip()); |
| 905 | QCOMPARE(streamedItem.whatsThis(), item.whatsThis()); |
| 906 | QCOMPARE(streamedItem.sizeHint(), item.sizeHint()); |
| 907 | QCOMPARE(streamedItem.font(), item.font()); |
| 908 | QCOMPARE(streamedItem.textAlignment(), item.textAlignment()); |
| 909 | QCOMPARE(streamedItem.background(), item.background()); |
| 910 | QCOMPARE(streamedItem.foreground(), item.foreground()); |
| 911 | QCOMPARE(streamedItem.checkState(), item.checkState()); |
| 912 | QCOMPARE(streamedItem.accessibleText(), item.accessibleText()); |
| 913 | QCOMPARE(streamedItem.accessibleDescription(), item.accessibleDescription()); |
| 914 | QCOMPARE(streamedItem.flags(), item.flags()); |
| 915 | } |
| 916 | } |
| 917 | |
| 918 | void tst_QStandardItem::deleteItem() |
| 919 | { |
| 920 | QStandardItemModel model(4, 6); |
| 921 | // initialize items |
| 922 | for (int i = 0; i < model.rowCount(); ++i) { |
| 923 | for (int j = 0; j < model.columnCount(); ++j) { |
| 924 | QStandardItem *item = new QStandardItem(); |
| 925 | model.setItem(row: i, column: j, item); |
| 926 | } |
| 927 | } |
| 928 | // delete items |
| 929 | for (int i = 0; i < model.rowCount(); ++i) { |
| 930 | for (int j = 0; j < model.columnCount(); ++j) { |
| 931 | QStandardItem *item = model.item(row: i, column: j); |
| 932 | delete item; |
| 933 | QCOMPARE(model.item(i, j), nullptr); |
| 934 | } |
| 935 | } |
| 936 | } |
| 937 | |
| 938 | void tst_QStandardItem::clone() |
| 939 | { |
| 940 | QStandardItem item; |
| 941 | item.setText(QLatin1String("text" )); |
| 942 | item.setToolTip(QLatin1String("toolTip" )); |
| 943 | item.setStatusTip(QLatin1String("statusTip" )); |
| 944 | item.setWhatsThis(QLatin1String("whatsThis" )); |
| 945 | item.setSizeHint(QSize(64, 48)); |
| 946 | item.setFont(QFont()); |
| 947 | item.setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); |
| 948 | item.setBackground(QColor(Qt::blue)); |
| 949 | item.setForeground(QColor(Qt::green)); |
| 950 | item.setCheckState(Qt::PartiallyChecked); |
| 951 | item.setAccessibleText(QLatin1String("accessibleText" )); |
| 952 | item.setAccessibleDescription(QLatin1String("accessibleDescription" )); |
| 953 | item.setFlags(Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); |
| 954 | |
| 955 | QStandardItem *clone = item.clone(); |
| 956 | QCOMPARE(clone->text(), item.text()); |
| 957 | QCOMPARE(clone->toolTip(), item.toolTip()); |
| 958 | QCOMPARE(clone->statusTip(), item.statusTip()); |
| 959 | QCOMPARE(clone->whatsThis(), item.whatsThis()); |
| 960 | QCOMPARE(clone->sizeHint(), item.sizeHint()); |
| 961 | QCOMPARE(clone->font(), item.font()); |
| 962 | QCOMPARE(clone->textAlignment(), item.textAlignment()); |
| 963 | QCOMPARE(clone->background(), item.background()); |
| 964 | QCOMPARE(clone->foreground(), item.foreground()); |
| 965 | QCOMPARE(clone->checkState(), item.checkState()); |
| 966 | QCOMPARE(clone->accessibleText(), item.accessibleText()); |
| 967 | QCOMPARE(clone->accessibleDescription(), item.accessibleDescription()); |
| 968 | QCOMPARE(clone->flags(), item.flags()); |
| 969 | QVERIFY(!(*clone < item)); |
| 970 | delete clone; |
| 971 | } |
| 972 | |
| 973 | void tst_QStandardItem::sortChildren() |
| 974 | { |
| 975 | for (int x = 0; x < 2; ++x) { |
| 976 | QStandardItemModel *model = new QStandardItemModel; |
| 977 | QStandardItem *item = (x == 0) ? new QStandardItem : model->invisibleRootItem(); |
| 978 | QStandardItem *one = new QStandardItem; |
| 979 | one->appendRow(aitem: new QStandardItem(QLatin1String("a" ))); |
| 980 | one->appendRow(aitem: new QStandardItem(QLatin1String("b" ))); |
| 981 | one->appendRow(aitem: new QStandardItem(QLatin1String("c" ))); |
| 982 | QStandardItem *two = new QStandardItem; |
| 983 | two->appendRow(aitem: new QStandardItem(QLatin1String("f" ))); |
| 984 | two->appendRow(aitem: new QStandardItem(QLatin1String("d" ))); |
| 985 | two->appendRow(aitem: new QStandardItem(QLatin1String("e" ))); |
| 986 | item->appendRow(aitem: one); |
| 987 | item->appendRow(aitem: two); |
| 988 | |
| 989 | QSignalSpy layoutAboutToBeChangedSpy( |
| 990 | model, &QAbstractItemModel::layoutAboutToBeChanged); |
| 991 | QSignalSpy layoutChangedSpy( |
| 992 | model, &QAbstractItemModel::layoutChanged); |
| 993 | |
| 994 | one->sortChildren(column: 0, order: Qt::DescendingOrder); |
| 995 | // verify sorted |
| 996 | QCOMPARE(one->child(0)->text(), QLatin1String("c" )); |
| 997 | QCOMPARE(one->child(1)->text(), QLatin1String("b" )); |
| 998 | QCOMPARE(one->child(2)->text(), QLatin1String("a" )); |
| 999 | // verify siblings unaffected |
| 1000 | QCOMPARE(two->child(0)->text(), QLatin1String("f" )); |
| 1001 | QCOMPARE(two->child(1)->text(), QLatin1String("d" )); |
| 1002 | QCOMPARE(two->child(2)->text(), QLatin1String("e" )); |
| 1003 | |
| 1004 | two->sortChildren(column: 0, order: Qt::AscendingOrder); |
| 1005 | // verify sorted |
| 1006 | QCOMPARE(two->child(0)->text(), QLatin1String("d" )); |
| 1007 | QCOMPARE(two->child(1)->text(), QLatin1String("e" )); |
| 1008 | QCOMPARE(two->child(2)->text(), QLatin1String("f" )); |
| 1009 | // verify siblings unaffected |
| 1010 | QCOMPARE(one->child(0)->text(), QLatin1String("c" )); |
| 1011 | QCOMPARE(one->child(1)->text(), QLatin1String("b" )); |
| 1012 | QCOMPARE(one->child(2)->text(), QLatin1String("a" )); |
| 1013 | |
| 1014 | item->sortChildren(column: 0, order: Qt::AscendingOrder); |
| 1015 | // verify everything sorted |
| 1016 | QCOMPARE(one->child(0)->text(), QLatin1String("a" )); |
| 1017 | QCOMPARE(one->child(1)->text(), QLatin1String("b" )); |
| 1018 | QCOMPARE(one->child(2)->text(), QLatin1String("c" )); |
| 1019 | QCOMPARE(two->child(0)->text(), QLatin1String("d" )); |
| 1020 | QCOMPARE(two->child(1)->text(), QLatin1String("e" )); |
| 1021 | QCOMPARE(two->child(2)->text(), QLatin1String("f" )); |
| 1022 | |
| 1023 | QCOMPARE(layoutAboutToBeChangedSpy.count(), (x == 0) ? 0 : 3); |
| 1024 | QCOMPARE(layoutChangedSpy.count(), (x == 0) ? 0 : 3); |
| 1025 | |
| 1026 | if (x == 0) |
| 1027 | delete item; |
| 1028 | delete model; |
| 1029 | } |
| 1030 | } |
| 1031 | |
| 1032 | class CustomItem : public QStandardItem |
| 1033 | { |
| 1034 | public: |
| 1035 | using QStandardItem::QStandardItem; |
| 1036 | |
| 1037 | int type() const override { return QStandardItem::UserType + 1; } |
| 1038 | |
| 1039 | bool operator<(const QStandardItem &other) const override { |
| 1040 | return text().length() < other.text().length(); |
| 1041 | } |
| 1042 | |
| 1043 | using QStandardItem::clone; |
| 1044 | using QStandardItem::emitDataChanged; |
| 1045 | }; |
| 1046 | |
| 1047 | Q_DECLARE_METATYPE(QStandardItem*) |
| 1048 | |
| 1049 | void tst_QStandardItem::subclassing() |
| 1050 | { |
| 1051 | qMetaTypeId<QStandardItem*>(); |
| 1052 | |
| 1053 | CustomItem *item = new CustomItem; |
| 1054 | QCOMPARE(item->type(), int(QStandardItem::UserType + 1)); |
| 1055 | |
| 1056 | item->setText(QString::fromLatin1(str: "foo" )); |
| 1057 | QCOMPARE(item->text(), QString::fromLatin1("foo" )); |
| 1058 | |
| 1059 | item->emitDataChanged(); // does nothing |
| 1060 | |
| 1061 | QStandardItemModel model; |
| 1062 | model.appendRow(aitem: item); |
| 1063 | |
| 1064 | QSignalSpy itemChangedSpy(&model, &QStandardItemModel::itemChanged); |
| 1065 | item->emitDataChanged(); |
| 1066 | QCOMPARE(itemChangedSpy.count(), 1); |
| 1067 | QCOMPARE(itemChangedSpy.at(0).count(), 1); |
| 1068 | QCOMPARE(qvariant_cast<QStandardItem*>(itemChangedSpy.at(0).at(0)), item); |
| 1069 | |
| 1070 | CustomItem *child0 = new CustomItem("cc" ); |
| 1071 | CustomItem *child1 = new CustomItem("bbb" ); |
| 1072 | CustomItem *child2 = new CustomItem("a" ); |
| 1073 | item->appendRow(aitem: child0); |
| 1074 | item->appendRow(aitem: child1); |
| 1075 | item->appendRow(aitem: child2); |
| 1076 | item->sortChildren(column: 0); |
| 1077 | QCOMPARE(item->child(0), child2); |
| 1078 | QCOMPARE(item->child(1), child0); |
| 1079 | QCOMPARE(item->child(2), child1); |
| 1080 | } |
| 1081 | |
| 1082 | void tst_QStandardItem::lessThan() |
| 1083 | { |
| 1084 | QStandardItem stringA("A" ); |
| 1085 | QStandardItem stringB("B" ); |
| 1086 | QStandardItem invalid1; |
| 1087 | QStandardItem invalid2; |
| 1088 | QVERIFY(stringA < stringB); |
| 1089 | QVERIFY(!(stringB < stringA)); |
| 1090 | // Items with invalid data go to the end. |
| 1091 | QVERIFY(stringA < invalid1); |
| 1092 | QVERIFY(!(invalid1 < stringA)); |
| 1093 | QVERIFY(!(invalid1 < invalid2)); |
| 1094 | } |
| 1095 | |
| 1096 | QTEST_MAIN(tst_QStandardItem) |
| 1097 | #include "tst_qstandarditem.moc" |
| 1098 | |