tests/auto/qheaderview/tst_qheaderview.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     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 <QStandardItemModel>
       
    45 #include <QStringListModel>
       
    46 
       
    47 #include <qabstractitemmodel.h>
       
    48 #include <qapplication.h>
       
    49 #include <qheaderview.h>
       
    50 #include <private/qheaderview_p.h>
       
    51 #include <qitemdelegate.h>
       
    52 #include <qtreewidget.h>
       
    53 #include <qdebug.h>
       
    54 
       
    55 typedef QList<int> IntList;
       
    56 Q_DECLARE_METATYPE(IntList)
       
    57 
       
    58 typedef QList<bool> BoolList;
       
    59 Q_DECLARE_METATYPE(BoolList)
       
    60 
       
    61 //TESTED_CLASS=
       
    62 //TESTED_FILES=
       
    63 
       
    64 // Will try to wait for the condition while allowing event processing
       
    65 // for a maximum of 2 seconds.
       
    66 #define WAIT_FOR_CONDITION(expr, expected) \
       
    67     do { \
       
    68         const int step = 100; \
       
    69         for (int i = 0; i < 2000 && expr != expected; i+=step) { \
       
    70             QTest::qWait(step); \
       
    71         } \
       
    72     } while(0)
       
    73 
       
    74 class protected_QHeaderView : public QHeaderView
       
    75 {
       
    76     Q_OBJECT
       
    77 public:
       
    78     protected_QHeaderView(Qt::Orientation orientation) : QHeaderView(orientation) {
       
    79         resizeSections();
       
    80     };
       
    81 
       
    82     void testEvent();
       
    83     void testhorizontalOffset();
       
    84     void testverticalOffset();
       
    85     friend class tst_QHeaderView;
       
    86 };
       
    87 
       
    88 class tst_QHeaderView : public QObject
       
    89 {
       
    90     Q_OBJECT
       
    91 
       
    92 public:
       
    93     tst_QHeaderView();
       
    94     virtual ~tst_QHeaderView();
       
    95 
       
    96 public slots:
       
    97     void initTestCase();
       
    98     void cleanupTestCase();
       
    99     void init();
       
   100     void cleanup();
       
   101 
       
   102 private slots:
       
   103     void getSetCheck();
       
   104     void visualIndex();
       
   105 
       
   106     void visualIndexAt_data();
       
   107     void visualIndexAt();
       
   108 
       
   109     void noModel();
       
   110     void emptyModel();
       
   111     void removeRows();
       
   112     void removeCols();
       
   113 
       
   114     void clickable();
       
   115     void movable();
       
   116     void hidden();
       
   117     void stretch();
       
   118 
       
   119     void sectionSize_data();
       
   120     void sectionSize();
       
   121 
       
   122     void length();
       
   123     void offset();
       
   124     void sectionSizeHint();
       
   125     void logicalIndex();
       
   126     void logicalIndexAt();
       
   127     void swapSections();
       
   128 
       
   129     void moveSection_data();
       
   130     void moveSection();
       
   131 
       
   132     void resizeMode();
       
   133 
       
   134     void resizeSection_data();
       
   135     void resizeSection();
       
   136 
       
   137     void resizeAndMoveSection_data();
       
   138     void resizeAndMoveSection();
       
   139     void resizeHiddenSection_data();
       
   140     void resizeHiddenSection();
       
   141     void resizeAndInsertSection_data();
       
   142     void resizeAndInsertSection();
       
   143     void resizeWithResizeModes_data();
       
   144     void resizeWithResizeModes();
       
   145     void moveAndInsertSection_data();
       
   146     void moveAndInsertSection();
       
   147     void highlightSections();
       
   148     void showSortIndicator();
       
   149     void sortIndicatorTracking();
       
   150     void removeAndInsertRow();
       
   151     void unhideSection();
       
   152     void event();
       
   153     void headerDataChanged();
       
   154     void currentChanged();
       
   155     void horizontalOffset();
       
   156     void verticalOffset();
       
   157     void stretchSectionCount();
       
   158     void hiddenSectionCount();
       
   159     void focusPolicy();
       
   160     void moveSectionAndReset();
       
   161     void moveSectionAndRemove();
       
   162     void saveRestore();
       
   163 
       
   164     void defaultAlignment_data();
       
   165     void defaultAlignment();
       
   166 
       
   167     void globalResizeMode_data();
       
   168     void globalResizeMode();
       
   169 
       
   170     void sectionPressedSignal_data();
       
   171     void sectionPressedSignal();
       
   172     void sectionClickedSignal_data() { sectionPressedSignal_data(); }
       
   173     void sectionClickedSignal();
       
   174 
       
   175     void defaultSectionSize_data();
       
   176     void defaultSectionSize();
       
   177 
       
   178     void oneSectionSize();
       
   179 
       
   180     void hideAndInsert_data();
       
   181     void hideAndInsert();
       
   182 
       
   183     void removeSection();
       
   184     void preserveHiddenSectionWidth();
       
   185     void invisibleStretchLastSection();
       
   186 
       
   187     void emptySectionSpan();
       
   188     void task236450_hidden_data();
       
   189     void task236450_hidden();
       
   190     void task248050_hideRow();
       
   191 
       
   192 protected:
       
   193     QHeaderView *view;
       
   194     QStandardItemModel *model;
       
   195 };
       
   196 
       
   197 class QtTestModel: public QAbstractTableModel
       
   198 {
       
   199 
       
   200 Q_OBJECT
       
   201 
       
   202 public:
       
   203     QtTestModel(QObject *parent = 0): QAbstractTableModel(parent),
       
   204        cols(0), rows(0), wrongIndex(false) {}
       
   205     int rowCount(const QModelIndex&) const { return rows; }
       
   206     int columnCount(const QModelIndex&) const { return cols; }
       
   207     bool isEditable(const QModelIndex &) const { return true; }
       
   208 
       
   209     QVariant data(const QModelIndex &idx, int) const
       
   210     {
       
   211         if (idx.row() < 0 || idx.column() < 0 || idx.column() >= cols || idx.row() >= rows) {
       
   212             wrongIndex = true;
       
   213             qWarning("Invalid modelIndex [%d,%d,%p]", idx.row(), idx.column(), idx.internalPointer());
       
   214         }
       
   215         return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0);//idx.data());
       
   216     }
       
   217 
       
   218     void insertOneColumn(int col)
       
   219     {
       
   220         beginInsertColumns(QModelIndex(), col, col);
       
   221         --cols;
       
   222         endInsertColumns();
       
   223     }
       
   224 
       
   225     void removeLastRow()
       
   226     {
       
   227         beginRemoveRows(QModelIndex(), rows - 1, rows - 1);
       
   228         --rows;
       
   229         endRemoveRows();
       
   230     }
       
   231 
       
   232     void removeAllRows()
       
   233     {
       
   234         beginRemoveRows(QModelIndex(), 0, rows - 1);
       
   235         rows = 0;
       
   236         endRemoveRows();
       
   237     }
       
   238 
       
   239     void removeOneColumn(int col)
       
   240     {
       
   241         beginRemoveColumns(QModelIndex(), col, col);
       
   242         --cols;
       
   243         endRemoveColumns();
       
   244     }
       
   245 
       
   246     void removeLastColumn()
       
   247     {
       
   248         beginRemoveColumns(QModelIndex(), cols - 1, cols - 1);
       
   249         --cols;
       
   250         endRemoveColumns();
       
   251     }
       
   252 
       
   253     void removeAllColumns()
       
   254     {
       
   255         beginRemoveColumns(QModelIndex(), 0, cols - 1);
       
   256         cols = 0;
       
   257         endRemoveColumns();
       
   258     }
       
   259 
       
   260     void cleanup()
       
   261     {
       
   262         cols = 3;
       
   263         rows = 3;
       
   264         emit layoutChanged();
       
   265     }
       
   266 
       
   267     int cols, rows;
       
   268     mutable bool wrongIndex;
       
   269 };
       
   270 
       
   271 // Testing get/set functions
       
   272 void tst_QHeaderView::getSetCheck()
       
   273 {
       
   274     protected_QHeaderView obj1(Qt::Horizontal);
       
   275     // bool QHeaderView::highlightSections()
       
   276     // void QHeaderView::setHighlightSections(bool)
       
   277     obj1.setHighlightSections(false);
       
   278     QCOMPARE(false, obj1.highlightSections());
       
   279     obj1.setHighlightSections(true);
       
   280     QCOMPARE(true, obj1.highlightSections());
       
   281 
       
   282     // bool QHeaderView::stretchLastSection()
       
   283     // void QHeaderView::setStretchLastSection(bool)
       
   284     obj1.setStretchLastSection(false);
       
   285     QCOMPARE(false, obj1.stretchLastSection());
       
   286     obj1.setStretchLastSection(true);
       
   287     QCOMPARE(true, obj1.stretchLastSection());
       
   288 
       
   289     // int QHeaderView::defaultSectionSize()
       
   290     // void QHeaderView::setDefaultSectionSize(int)
       
   291     obj1.setDefaultSectionSize(0);
       
   292     QCOMPARE(0, obj1.defaultSectionSize());
       
   293     obj1.setDefaultSectionSize(INT_MIN);
       
   294     QCOMPARE(INT_MIN, obj1.defaultSectionSize());
       
   295     obj1.setDefaultSectionSize(INT_MAX);
       
   296     QCOMPARE(INT_MAX, obj1.defaultSectionSize());
       
   297     // ### the test above does not make sense for values below 0
       
   298 
       
   299     // int QHeaderView::minimumSectionSize()
       
   300     // void QHeaderView::setMinimumSectionSize(int)
       
   301     obj1.setMinimumSectionSize(0);
       
   302     QCOMPARE(0, obj1.minimumSectionSize());
       
   303     obj1.setMinimumSectionSize(INT_MIN);
       
   304     QCOMPARE(INT_MIN, obj1.minimumSectionSize());
       
   305     obj1.setMinimumSectionSize(INT_MAX);
       
   306     QCOMPARE(INT_MAX, obj1.minimumSectionSize());
       
   307     // ### the test above does not make sense for values below 0
       
   308 
       
   309     // int QHeaderView::offset()
       
   310     // void QHeaderView::setOffset(int)
       
   311     obj1.setOffset(0);
       
   312     QCOMPARE(0, obj1.offset());
       
   313     obj1.setOffset(INT_MIN);
       
   314     QCOMPARE(INT_MIN, obj1.offset());
       
   315     obj1.setOffset(INT_MAX);
       
   316     QCOMPARE(INT_MAX, obj1.offset());
       
   317 
       
   318 }
       
   319 
       
   320 tst_QHeaderView::tst_QHeaderView()
       
   321 {
       
   322     qRegisterMetaType<int>("Qt::SortOrder");
       
   323 }
       
   324 
       
   325 tst_QHeaderView::~tst_QHeaderView()
       
   326 {
       
   327 }
       
   328 
       
   329 void tst_QHeaderView::initTestCase()
       
   330 {
       
   331 #ifdef Q_OS_WINCE //disable magic for WindowsCE
       
   332     qApp->setAutoMaximizeThreshold(-1);
       
   333 #endif
       
   334 }
       
   335 
       
   336 void tst_QHeaderView::cleanupTestCase()
       
   337 {
       
   338 }
       
   339 
       
   340 void tst_QHeaderView::init()
       
   341 {
       
   342     view = new QHeaderView(Qt::Vertical);
       
   343     // Some initial value tests before a model is added
       
   344     QCOMPARE(view->length(), 0);
       
   345     QVERIFY(view->sizeHint() == QSize(0,0));
       
   346     QCOMPARE(view->sectionSizeHint(0), -1);
       
   347 
       
   348     /*
       
   349     model = new QStandardItemModel(1, 1);
       
   350     view->setModel(model);
       
   351     //qDebug() << view->count();
       
   352     view->sizeHint();
       
   353     */
       
   354 
       
   355     int rows = 4;
       
   356     int columns = 4;
       
   357     model = new QStandardItemModel(rows, columns);
       
   358     /*
       
   359     for (int row = 0; row < rows; ++row) {
       
   360         for (int column = 0; column < columns; ++column) {
       
   361             QModelIndex index = model->index(row, column, QModelIndex());
       
   362             model->setData(index, QVariant((row+1) * (column+1)));
       
   363         }
       
   364     }
       
   365     */
       
   366 
       
   367     QSignalSpy spy(view, SIGNAL(sectionCountChanged(int, int)));
       
   368     view->setModel(model);
       
   369     QCOMPARE(spy.count(), 1);
       
   370     view->show();
       
   371 }
       
   372 
       
   373 void tst_QHeaderView::cleanup()
       
   374 {
       
   375     delete view;
       
   376     view = 0;
       
   377     delete model;
       
   378     model = 0;
       
   379 }
       
   380 
       
   381 void tst_QHeaderView::noModel()
       
   382 {
       
   383     QHeaderView emptyView(Qt::Vertical);
       
   384     QCOMPARE(emptyView.count(), 0);
       
   385 }
       
   386 
       
   387 void tst_QHeaderView::emptyModel()
       
   388 {
       
   389     QtTestModel testmodel;
       
   390     view->setModel(&testmodel);
       
   391     QVERIFY(!testmodel.wrongIndex);
       
   392     QCOMPARE(view->count(), testmodel.rows);
       
   393     view->setModel(model);
       
   394 }
       
   395 
       
   396 void tst_QHeaderView::removeRows()
       
   397 {
       
   398     QtTestModel model;
       
   399     model.rows = model.cols = 10;
       
   400 
       
   401     QHeaderView vertical(Qt::Vertical);
       
   402     QHeaderView horizontal(Qt::Horizontal);
       
   403 
       
   404     vertical.setModel(&model);
       
   405     horizontal.setModel(&model);
       
   406     vertical.show();
       
   407     horizontal.show();
       
   408     QCOMPARE(vertical.count(), model.rows);
       
   409     QCOMPARE(horizontal.count(), model.cols);
       
   410 
       
   411     model.removeLastRow();
       
   412     QVERIFY(!model.wrongIndex);
       
   413     QCOMPARE(vertical.count(), model.rows);
       
   414     QCOMPARE(horizontal.count(), model.cols);
       
   415 
       
   416     model.removeAllRows();
       
   417     QVERIFY(!model.wrongIndex);
       
   418     QCOMPARE(vertical.count(), model.rows);
       
   419     QCOMPARE(horizontal.count(), model.cols);
       
   420 }
       
   421 
       
   422 
       
   423 void tst_QHeaderView::removeCols()
       
   424 {
       
   425     QtTestModel model;
       
   426     model.rows = model.cols = 10;
       
   427 
       
   428     QHeaderView vertical(Qt::Vertical);
       
   429     QHeaderView horizontal(Qt::Horizontal);
       
   430     vertical.setModel(&model);
       
   431     horizontal.setModel(&model);
       
   432     vertical.show();
       
   433     horizontal.show();
       
   434     QCOMPARE(vertical.count(), model.rows);
       
   435     QCOMPARE(horizontal.count(), model.cols);
       
   436 
       
   437     model.removeLastColumn();
       
   438     QVERIFY(!model.wrongIndex);
       
   439     QCOMPARE(vertical.count(), model.rows);
       
   440     QCOMPARE(horizontal.count(), model.cols);
       
   441 
       
   442     model.removeAllColumns();
       
   443     QVERIFY(!model.wrongIndex);
       
   444     QCOMPARE(vertical.count(), model.rows);
       
   445     QCOMPARE(horizontal.count(), model.cols);
       
   446 }
       
   447 
       
   448 void tst_QHeaderView::movable()
       
   449 {
       
   450     QCOMPARE(view->isMovable(), false);
       
   451     view->setMovable(false);
       
   452     QCOMPARE(view->isMovable(), false);
       
   453     view->setMovable(true);
       
   454     QCOMPARE(view->isMovable(), true);
       
   455 }
       
   456 
       
   457 void tst_QHeaderView::clickable()
       
   458 {
       
   459     QCOMPARE(view->isClickable(), false);
       
   460     view->setClickable(false);
       
   461     QCOMPARE(view->isClickable(), false);
       
   462     view->setClickable(true);
       
   463     QCOMPARE(view->isClickable(), true);
       
   464 }
       
   465 
       
   466 void tst_QHeaderView::hidden()
       
   467 {
       
   468     //hideSection() & showSection call setSectionHidden
       
   469     // Test bad arguments
       
   470     QCOMPARE(view->isSectionHidden(-1), false);
       
   471     QCOMPARE(view->isSectionHidden(view->count()), false);
       
   472     QCOMPARE(view->isSectionHidden(999999), false);
       
   473 
       
   474     view->setSectionHidden(-1, true);
       
   475     view->setSectionHidden(view->count(), true);
       
   476     view->setSectionHidden(999999, true);
       
   477     view->setSectionHidden(-1, false);
       
   478     view->setSectionHidden(view->count(), false);
       
   479     view->setSectionHidden(999999, false);
       
   480 
       
   481     // Hidden sections shouldn't have visual properties (except position)
       
   482     int pos = view->defaultSectionSize();
       
   483     view->setSectionHidden(1, true);
       
   484     QCOMPARE(view->sectionSize(1), 0);
       
   485     QCOMPARE(view->sectionPosition(1), pos);
       
   486     view->resizeSection(1, 100);
       
   487     QCOMPARE(view->sectionViewportPosition(1), pos);
       
   488     QCOMPARE(view->sectionSize(1), 0);
       
   489     view->setSectionHidden(1, false);
       
   490     QCOMPARE(view->isSectionHidden(0), false);
       
   491     QCOMPARE(view->sectionSize(0), view->defaultSectionSize());
       
   492 }
       
   493 
       
   494 void tst_QHeaderView::stretch()
       
   495 {
       
   496     // Show before resize and setStrechLastSection
       
   497 #if defined(Q_OS_WINCE)
       
   498     QSize viewSize(200,300);
       
   499 #else
       
   500     QSize viewSize(500, 500);
       
   501 #endif
       
   502     view->resize(viewSize);
       
   503     view->setStretchLastSection(true);
       
   504     QCOMPARE(view->stretchLastSection(), true);
       
   505     view->show();
       
   506     QCOMPARE(view->width(), viewSize.width());
       
   507     QCOMPARE(view->visualIndexAt(view->viewport()->height() - 5), 3);
       
   508 
       
   509     view->setSectionHidden(3, true);
       
   510     QCOMPARE(view->visualIndexAt(view->viewport()->height() - 5), 2);
       
   511 
       
   512     view->setStretchLastSection(false);
       
   513     QCOMPARE(view->stretchLastSection(), false);
       
   514 }
       
   515 
       
   516 void tst_QHeaderView::oneSectionSize()
       
   517 {
       
   518     //this ensures that if there is only one section, it gets a correct width (more than 0)
       
   519     QHeaderView view (Qt::Vertical);
       
   520     QtTestModel model;
       
   521     model.cols = 1;
       
   522     model.rows = 1;
       
   523 
       
   524     view.setResizeMode(QHeaderView::Interactive);
       
   525     view.setModel(&model);
       
   526 
       
   527     view.show();
       
   528 
       
   529     QVERIFY(view.sectionSize(0) > 0);
       
   530 }
       
   531 
       
   532 
       
   533 void tst_QHeaderView::sectionSize_data()
       
   534 {
       
   535     QTest::addColumn<QList<int> >("boundsCheck");
       
   536     QTest::addColumn<QList<int> >("defaultSizes");
       
   537     QTest::addColumn<int>("initialDefaultSize");
       
   538     QTest::addColumn<int>("lastVisibleSectionSize");
       
   539     QTest::addColumn<int>("persistentSectionSize");
       
   540 
       
   541     QTest::newRow("data set one")
       
   542         << (QList<int>() << -1 << 0 << 4 << 9999)
       
   543         << (QList<int>() << 10 << 30 << 30)
       
   544         << 30
       
   545         << 300
       
   546         << 20;
       
   547 }
       
   548 
       
   549 void tst_QHeaderView::sectionSize()
       
   550 {
       
   551     QFETCH(QList<int>, boundsCheck);
       
   552     QFETCH(QList<int>, defaultSizes);
       
   553     QFETCH(int, initialDefaultSize);
       
   554     QFETCH(int, lastVisibleSectionSize);
       
   555     QFETCH(int, persistentSectionSize);
       
   556 
       
   557 #ifdef Q_OS_WINCE
       
   558     // We test on a device with doubled pixels. Therefore we need to specify
       
   559     // different boundaries.
       
   560     initialDefaultSize = qMax(view->minimumSectionSize(), 30);
       
   561 #endif
       
   562 
       
   563     // bounds check
       
   564     foreach (int val, boundsCheck)
       
   565         view->sectionSize(val);
       
   566 
       
   567     // default size
       
   568     QCOMPARE(view->defaultSectionSize(), initialDefaultSize);
       
   569     foreach (int def, defaultSizes) {
       
   570         view->setDefaultSectionSize(def);
       
   571         QCOMPARE(view->defaultSectionSize(), def);
       
   572     }
       
   573 
       
   574     view->setDefaultSectionSize(initialDefaultSize);
       
   575     for (int s = 0; s < view->count(); ++s)
       
   576         QCOMPARE(view->sectionSize(s), initialDefaultSize);
       
   577     view->doItemsLayout();
       
   578 
       
   579     // stretch last section
       
   580     view->setStretchLastSection(true);
       
   581     int lastSection = view->count() - 1;
       
   582 
       
   583     //test that when hiding the last column,
       
   584     //resizing the new last visible columns still works
       
   585     view->hideSection(lastSection);
       
   586     view->resizeSection(lastSection - 1, lastVisibleSectionSize);
       
   587     QCOMPARE(view->sectionSize(lastSection - 1), lastVisibleSectionSize);
       
   588     view->showSection(lastSection);
       
   589 
       
   590     // turn off stretching
       
   591     view->setStretchLastSection(false);
       
   592     QCOMPARE(view->sectionSize(lastSection), initialDefaultSize);
       
   593 
       
   594     // test persistence
       
   595     int sectionCount = view->count();
       
   596     for (int i = 0; i < sectionCount; ++i)
       
   597         view->resizeSection(i, persistentSectionSize);
       
   598     QtTestModel model;
       
   599     model.cols = sectionCount * 2;
       
   600     model.rows = sectionCount * 2;
       
   601     view->setModel(&model);
       
   602     for (int j = 0; j < sectionCount; ++j)
       
   603         QCOMPARE(view->sectionSize(j), persistentSectionSize);
       
   604     for (int k = sectionCount; k < view->count(); ++k)
       
   605         QCOMPARE(view->sectionSize(k), initialDefaultSize);
       
   606 }
       
   607 
       
   608 void tst_QHeaderView::visualIndex()
       
   609 {
       
   610     // Test bad arguments
       
   611     QCOMPARE(view->visualIndex(999999), -1);
       
   612     QCOMPARE(view->visualIndex(-1), -1);
       
   613     QCOMPARE(view->visualIndex(1), 1);
       
   614     view->setSectionHidden(1, true);
       
   615     QCOMPARE(view->visualIndex(1), 1);
       
   616     QCOMPARE(view->visualIndex(2), 2);
       
   617 
       
   618     view->setSectionHidden(1, false);
       
   619     QCOMPARE(view->visualIndex(1), 1);
       
   620     QCOMPARE(view->visualIndex(2), 2);
       
   621 }
       
   622 
       
   623 void tst_QHeaderView::visualIndexAt_data()
       
   624 {
       
   625     QTest::addColumn<QList<int> >("hidden");
       
   626     QTest::addColumn<QList<int> >("from");
       
   627     QTest::addColumn<QList<int> >("to");
       
   628     QTest::addColumn<QList<int> >("coordinate");
       
   629     QTest::addColumn<QList<int> >("visual");
       
   630 
       
   631     QList<int> coordinateList;
       
   632 #ifndef Q_OS_WINCE
       
   633     coordinateList << -1 << 0 << 31 << 91 << 99999;
       
   634 #else
       
   635     // We test on a device with doubled pixels. Therefore we need to specify
       
   636     // different boundaries.
       
   637     coordinateList << -1 << 0 << 33 << 97 << 99999;
       
   638 #endif
       
   639 
       
   640     QTest::newRow("no hidden, no moved sections")
       
   641         << QList<int>()
       
   642         << QList<int>()
       
   643         << QList<int>()
       
   644         << coordinateList
       
   645         << (QList<int>() << -1 << 0 << 1 << 3 << -1);
       
   646 
       
   647     QTest::newRow("no hidden, moved sections")
       
   648         << QList<int>()
       
   649         << (QList<int>() << 0)
       
   650         << (QList<int>() << 1)
       
   651         << coordinateList
       
   652         << (QList<int>() << -1 << 0 << 1 << 3 << -1);
       
   653 
       
   654     QTest::newRow("hidden, no moved sections")
       
   655         << (QList<int>() << 0)
       
   656         << QList<int>()
       
   657         << QList<int>()
       
   658         << coordinateList
       
   659         << (QList<int>() << -1 << 1 << 2 << 3 << -1);
       
   660 }
       
   661 
       
   662 void tst_QHeaderView::visualIndexAt()
       
   663 {
       
   664     QFETCH(QList<int>, hidden);
       
   665     QFETCH(QList<int>, from);
       
   666     QFETCH(QList<int>, to);
       
   667     QFETCH(QList<int>, coordinate);
       
   668     QFETCH(QList<int>, visual);
       
   669 
       
   670     view->setStretchLastSection(true);
       
   671     view->show();
       
   672 
       
   673     for (int i = 0; i < hidden.count(); ++i)
       
   674         view->setSectionHidden(hidden.at(i), true);
       
   675 
       
   676     for (int j = 0; j < from.count(); ++j)
       
   677         view->moveSection(from.at(j), to.at(j));
       
   678 
       
   679     for (int k = 0; k < coordinate.count(); ++k)
       
   680         QCOMPARE(view->visualIndexAt(coordinate.at(k)), visual.at(k));
       
   681 }
       
   682 
       
   683 void tst_QHeaderView::length()
       
   684 {
       
   685 #if defined(Q_OS_WINCE)
       
   686     QFont font(QLatin1String("Tahoma"), 7);
       
   687     view->setFont(font);
       
   688 #elif defined(Q_OS_SYMBIAN)
       
   689     QFont font(QLatin1String("Series 60 Sans"), 6);
       
   690     view->setFont(font);
       
   691 #endif
       
   692     view->setStretchLastSection(true);
       
   693     view->show();
       
   694 
       
   695     //minimumSectionSize should be the size of the last section of the widget is not tall enough
       
   696     int length = view->minimumSectionSize();
       
   697     for (int i=0; i < view->count()-1; i++) {
       
   698         length += view->sectionSize(i);
       
   699     }
       
   700 
       
   701     length = qMax(length, view->viewport()->height());
       
   702     QCOMPARE(length, view->length());
       
   703 
       
   704     view->setStretchLastSection(false);
       
   705     view->show();
       
   706 
       
   707     QVERIFY(length != view->length());
       
   708 
       
   709     // layoutChanged might mean rows have been removed
       
   710     QtTestModel model;
       
   711     model.cols = 10;
       
   712     model.rows = 10;
       
   713     view->setModel(&model);
       
   714     int oldLength = view->length();
       
   715     model.cleanup();
       
   716     QCOMPARE(model.rows, view->count());
       
   717     QVERIFY(oldLength != view->length());
       
   718 }
       
   719 
       
   720 void tst_QHeaderView::offset()
       
   721 {
       
   722     QCOMPARE(view->offset(), 0);
       
   723     view->setOffset(10);
       
   724     QCOMPARE(view->offset(), 10);
       
   725     view->setOffset(0);
       
   726     QCOMPARE(view->offset(), 0);
       
   727 
       
   728     // Test odd arguments
       
   729     view->setOffset(-1);
       
   730 }
       
   731 
       
   732 void tst_QHeaderView::sectionSizeHint()
       
   733 {
       
   734     // Test bad arguments
       
   735     view->sectionSizeHint(-1);
       
   736     view->sectionSizeHint(99999);
       
   737 
       
   738     // TODO how to test the return value?
       
   739 }
       
   740 
       
   741 void tst_QHeaderView::logicalIndex()
       
   742 {
       
   743     // Test bad arguments
       
   744     QCOMPARE(view->logicalIndex(-1), -1);
       
   745     QCOMPARE(view->logicalIndex(99999), -1);
       
   746 }
       
   747 
       
   748 void tst_QHeaderView::logicalIndexAt()
       
   749 {
       
   750     // Test bad arguments
       
   751     view->logicalIndexAt(-1);
       
   752     view->logicalIndexAt(99999);
       
   753     QCOMPARE(view->logicalIndexAt(0), 0);
       
   754     QCOMPARE(view->logicalIndexAt(1), 0);
       
   755 
       
   756     view->show();
       
   757     view->setStretchLastSection(true);
       
   758     // First item
       
   759     QCOMPARE(view->logicalIndexAt(0), 0);
       
   760     QCOMPARE(view->logicalIndexAt(view->sectionSize(0)-1), 0);
       
   761     QCOMPARE(view->logicalIndexAt(view->sectionSize(0)+1), 1);
       
   762     // Last item
       
   763     int last = view->length() - 1;//view->viewport()->height() - 10;
       
   764     QCOMPARE(view->logicalIndexAt(last), 3);
       
   765     // Not in widget
       
   766     int outofbounds = view->length() + 1;//view->viewport()->height() + 1;
       
   767     QCOMPARE(view->logicalIndexAt(outofbounds), -1);
       
   768 
       
   769     view->moveSection(0,1);
       
   770     // First item
       
   771     QCOMPARE(view->logicalIndexAt(0), 1);
       
   772     QCOMPARE(view->logicalIndexAt(view->sectionSize(0)-1), 1);
       
   773     QCOMPARE(view->logicalIndexAt(view->sectionSize(0)+1), 0);
       
   774     // Last item
       
   775     QCOMPARE(view->logicalIndexAt(last), 3);
       
   776     view->moveSection(1,0);
       
   777 
       
   778 }
       
   779 
       
   780 void tst_QHeaderView::swapSections()
       
   781 {
       
   782     view->swapSections(-1, 1);
       
   783     view->swapSections(99999, 1);
       
   784     view->swapSections(1, -1);
       
   785     view->swapSections(1, 99999);
       
   786 
       
   787     QVector<int> logical = (QVector<int>() << 0 << 1 << 2 << 3);
       
   788 
       
   789     QSignalSpy spy1(view, SIGNAL(sectionMoved(int, int, int)));
       
   790 
       
   791     QCOMPARE(view->sectionsMoved(), false);
       
   792     view->swapSections(1, 1);
       
   793     QCOMPARE(view->sectionsMoved(), false);
       
   794     view->swapSections(1, 2);
       
   795     QCOMPARE(view->sectionsMoved(), true);
       
   796     view->swapSections(2, 1);
       
   797     QCOMPARE(view->sectionsMoved(), true);
       
   798     for (int i = 0; i < view->count(); ++i)
       
   799         QCOMPARE(view->logicalIndex(i), logical.at(i));
       
   800     QCOMPARE(spy1.count(), 4);
       
   801 
       
   802     logical = (QVector<int>()  << 3 << 1 << 2 << 0);
       
   803     view->swapSections(3, 0);
       
   804     QCOMPARE(view->sectionsMoved(), true);
       
   805     for (int j = 0; j < view->count(); ++j)
       
   806         QCOMPARE(view->logicalIndex(j), logical.at(j));
       
   807     QCOMPARE(spy1.count(), 6);
       
   808 }
       
   809 
       
   810 void tst_QHeaderView::moveSection_data()
       
   811 {
       
   812     QTest::addColumn<QList<int> >("hidden");
       
   813     QTest::addColumn<QList<int> >("from");
       
   814     QTest::addColumn<QList<int> >("to");
       
   815     QTest::addColumn<QList<bool> >("moved");
       
   816     QTest::addColumn<QList<int> >("logical");
       
   817     QTest::addColumn<int>("count");
       
   818 
       
   819     QTest::newRow("bad args, no hidden")
       
   820         << QList<int>()
       
   821         << (QList<int>() << -1 << 1 << 99999 << 1)
       
   822         << (QList<int>() << 1 << -1 << 1 << 99999)
       
   823         << (QList<bool>() << false << false << false << false)
       
   824         << (QList<int>() << 0 << 1 << 2 << 3)
       
   825         << 0;
       
   826 
       
   827     QTest::newRow("good args, no hidden")
       
   828         << QList<int>()
       
   829         << (QList<int>() << 1 << 1 << 2 << 1)
       
   830         << (QList<int>() << 1 << 2 << 1 << 2)
       
   831         << (QList<bool>() << false << true << true << true)
       
   832         << (QList<int>() << 0 << 2 << 1 << 3)
       
   833         << 3;
       
   834 
       
   835     QTest::newRow("hidden sections")
       
   836         << (QList<int>() << 0 << 3)
       
   837         << (QList<int>() << 1 << 1 << 2 << 1)
       
   838         << (QList<int>() << 1 << 2 << 1 << 2)
       
   839         << (QList<bool>() << false << true << true << true)
       
   840         << (QList<int>() << 0 << 2 << 1 << 3)
       
   841         << 3;
       
   842 }
       
   843 
       
   844 void tst_QHeaderView::moveSection()
       
   845 {
       
   846     QFETCH(QList<int>, hidden);
       
   847     QFETCH(QList<int>, from);
       
   848     QFETCH(QList<int>, to);
       
   849     QFETCH(QList<bool>, moved);
       
   850     QFETCH(QList<int>, logical);
       
   851     QFETCH(int, count);
       
   852 
       
   853     QVERIFY(from.count() == to.count());
       
   854     QVERIFY(from.count() == moved.count());
       
   855     QVERIFY(view->count() == logical.count());
       
   856 
       
   857     QSignalSpy spy1(view, SIGNAL(sectionMoved(int, int, int)));
       
   858     QCOMPARE(view->sectionsMoved(), false);
       
   859 
       
   860     for (int h = 0; h < hidden.count(); ++h)
       
   861         view->setSectionHidden(hidden.at(h), true);
       
   862 
       
   863     for (int i = 0; i < from.count(); ++i) {
       
   864         view->moveSection(from.at(i), to.at(i));
       
   865         QCOMPARE(view->sectionsMoved(), moved.at(i));
       
   866     }
       
   867 
       
   868     for (int j = 0; j < view->count(); ++j)
       
   869         QCOMPARE(view->logicalIndex(j), logical.at(j));
       
   870 
       
   871     QCOMPARE(spy1.count(), count);
       
   872 }
       
   873 
       
   874 void tst_QHeaderView::resizeAndMoveSection_data()
       
   875 {
       
   876     QTest::addColumn<IntList>("logicalIndexes");
       
   877     QTest::addColumn<IntList>("sizes");
       
   878     QTest::addColumn<int>("logicalFrom");
       
   879     QTest::addColumn<int>("logicalTo");
       
   880 
       
   881     QTest::newRow("resizeAndMove-1")
       
   882         << (IntList() << 0 << 1)
       
   883         << (IntList() << 20 << 40)
       
   884         << 0 << 1;
       
   885 
       
   886     QTest::newRow("resizeAndMove-2")
       
   887         << (IntList() << 0 << 1 << 2 << 3)
       
   888         << (IntList() << 20 << 60 << 10 << 80)
       
   889         << 0 << 2;
       
   890 
       
   891     QTest::newRow("resizeAndMove-3")
       
   892         << (IntList() << 0 << 1 << 2 << 3)
       
   893         << (IntList() << 100 << 60 << 40 << 10)
       
   894         << 0 << 3;
       
   895 
       
   896     QTest::newRow("resizeAndMove-4")
       
   897         << (IntList() << 0 << 1 << 2 << 3)
       
   898         << (IntList() << 10 << 40 << 80 << 30)
       
   899         << 1 << 2;
       
   900 
       
   901     QTest::newRow("resizeAndMove-5")
       
   902         << (IntList() << 2 << 3)
       
   903         << (IntList() << 100 << 200)
       
   904         << 3 << 2;
       
   905 }
       
   906 
       
   907 void tst_QHeaderView::resizeAndMoveSection()
       
   908 {
       
   909     QFETCH(IntList, logicalIndexes);
       
   910     QFETCH(IntList, sizes);
       
   911     QFETCH(int, logicalFrom);
       
   912     QFETCH(int, logicalTo);
       
   913 
       
   914     // Save old visual indexes and sizes
       
   915     IntList oldVisualIndexes;
       
   916     IntList oldSizes;
       
   917     foreach (int logical, logicalIndexes) {
       
   918         oldVisualIndexes.append(view->visualIndex(logical));
       
   919         oldSizes.append(view->sectionSize(logical));
       
   920     }
       
   921 
       
   922     // Resize sections
       
   923     for (int i = 0; i < logicalIndexes.size(); ++i) {
       
   924         int logical = logicalIndexes.at(i);
       
   925         view->resizeSection(logical, sizes.at(i));
       
   926     }
       
   927 
       
   928     // Move sections
       
   929     int visualFrom = view->visualIndex(logicalFrom);
       
   930     int visualTo = view->visualIndex(logicalTo);
       
   931     view->moveSection(visualFrom, visualTo);
       
   932     QCOMPARE(view->visualIndex(logicalFrom), visualTo);
       
   933 
       
   934     // Check that sizes are still correct
       
   935     for (int i = 0; i < logicalIndexes.size(); ++i) {
       
   936         int logical = logicalIndexes.at(i);
       
   937         QCOMPARE(view->sectionSize(logical), sizes.at(i));
       
   938     }
       
   939 
       
   940     // Move sections back
       
   941     view->moveSection(visualTo, visualFrom);
       
   942 
       
   943     // Check that sizes are still correct
       
   944     for (int i = 0; i < logicalIndexes.size(); ++i) {
       
   945         int logical = logicalIndexes.at(i);
       
   946         QCOMPARE(view->sectionSize(logical), sizes.at(i));
       
   947     }
       
   948 
       
   949     // Put everything back as it was
       
   950     for (int i = 0; i < logicalIndexes.size(); ++i) {
       
   951         int logical = logicalIndexes.at(i);
       
   952         view->resizeSection(logical, oldSizes.at(i));
       
   953         QCOMPARE(view->visualIndex(logical), oldVisualIndexes.at(i));
       
   954     }
       
   955 }
       
   956 
       
   957 void tst_QHeaderView::resizeHiddenSection_data()
       
   958 {
       
   959     QTest::addColumn<int>("section");
       
   960     QTest::addColumn<int>("initialSize");
       
   961     QTest::addColumn<int>("finalSize");
       
   962 
       
   963     QTest::newRow("section 0 resize 50 to 20")
       
   964         << 0 << 50 << 20;
       
   965 
       
   966     QTest::newRow("section 1 resize 50 to 20")
       
   967         << 1 << 50 << 20;
       
   968 
       
   969     QTest::newRow("section 2 resize 50 to 20")
       
   970         << 2 << 50 << 20;
       
   971 
       
   972     QTest::newRow("section 3 resize 50 to 20")
       
   973         << 3 << 50 << 20;
       
   974 }
       
   975 
       
   976 void tst_QHeaderView::resizeHiddenSection()
       
   977 {
       
   978     QFETCH(int, section);
       
   979     QFETCH(int, initialSize);
       
   980     QFETCH(int, finalSize);
       
   981 
       
   982     view->resizeSection(section, initialSize);
       
   983     view->setSectionHidden(section, true);
       
   984     QCOMPARE(view->sectionSize(section), 0);
       
   985 
       
   986     view->resizeSection(section, finalSize);
       
   987     QCOMPARE(view->sectionSize(section), 0);
       
   988 
       
   989     view->setSectionHidden(section, false);
       
   990     QCOMPARE(view->sectionSize(section), finalSize);
       
   991 }
       
   992 
       
   993 void tst_QHeaderView::resizeAndInsertSection_data()
       
   994 {
       
   995     QTest::addColumn<int>("section");
       
   996     QTest::addColumn<int>("size");
       
   997     QTest::addColumn<int>("insert");
       
   998     QTest::addColumn<int>("compare");
       
   999     QTest::addColumn<int>("expected");
       
  1000 
       
  1001     QTest::newRow("section 0 size 50 insert 0")
       
  1002         << 0 << 50 << 0 << 1 << 50;
       
  1003 
       
  1004     QTest::newRow("section 1 size 50 insert 1")
       
  1005         << 0 << 50 << 1 << 0 << 50;
       
  1006 
       
  1007     QTest::newRow("section 1 size 50 insert 0")
       
  1008         << 1 << 50 << 0 << 2 << 50;
       
  1009 
       
  1010 }
       
  1011 
       
  1012 void tst_QHeaderView::resizeAndInsertSection()
       
  1013 {
       
  1014     QFETCH(int, section);
       
  1015     QFETCH(int, size);
       
  1016     QFETCH(int, insert);
       
  1017     QFETCH(int, compare);
       
  1018     QFETCH(int, expected);
       
  1019 
       
  1020     view->setStretchLastSection(false);
       
  1021 
       
  1022     view->resizeSection(section, size);
       
  1023     QCOMPARE(view->sectionSize(section), size);
       
  1024 
       
  1025     model->insertRow(insert);
       
  1026 
       
  1027     QCOMPARE(view->sectionSize(compare), expected);
       
  1028 }
       
  1029 
       
  1030 void tst_QHeaderView::resizeWithResizeModes_data()
       
  1031 {
       
  1032     QTest::addColumn<int>("size");
       
  1033     QTest::addColumn<QList<int> >("sections");
       
  1034     QTest::addColumn<QList<int> >("modes");
       
  1035     QTest::addColumn<QList<int> >("expected");
       
  1036 
       
  1037     QTest::newRow("stretch first section")
       
  1038         << 600
       
  1039         << (QList<int>() << 100 << 100 << 100 << 100)
       
  1040         << (QList<int>() << ((int)QHeaderView::Stretch)
       
  1041                          << ((int)QHeaderView::Interactive)
       
  1042                          << ((int)QHeaderView::Interactive)
       
  1043                          << ((int)QHeaderView::Interactive))
       
  1044         << (QList<int>() << 300 << 100 << 100 << 100);
       
  1045 }
       
  1046 
       
  1047 void  tst_QHeaderView::resizeWithResizeModes()
       
  1048 {
       
  1049     QFETCH(int, size);
       
  1050     QFETCH(QList<int>, sections);
       
  1051     QFETCH(QList<int>, modes);
       
  1052     QFETCH(QList<int>, expected);
       
  1053 
       
  1054     view->setStretchLastSection(false);
       
  1055     for (int i = 0; i < sections.count(); ++i) {
       
  1056         view->resizeSection(i, sections.at(i));
       
  1057         view->setResizeMode(i, (QHeaderView::ResizeMode)modes.at(i));
       
  1058     }
       
  1059     view->show();
       
  1060     view->resize(size, size);
       
  1061     for (int j = 0; j < expected.count(); ++j)
       
  1062         QCOMPARE(view->sectionSize(j), expected.at(j));
       
  1063 }
       
  1064 
       
  1065 void tst_QHeaderView::moveAndInsertSection_data()
       
  1066 {
       
  1067     QTest::addColumn<int>("from");
       
  1068     QTest::addColumn<int>("to");
       
  1069     QTest::addColumn<int>("insert");
       
  1070     QTest::addColumn<QList<int> >("mapping");
       
  1071 
       
  1072     QTest::newRow("move from 1 to 3, insert 0")
       
  1073         << 1 << 3 << 0 <<(QList<int>() << 0 << 1 << 3 << 4 << 2);
       
  1074 
       
  1075 }
       
  1076 
       
  1077 void tst_QHeaderView::moveAndInsertSection()
       
  1078 {
       
  1079     QFETCH(int, from);
       
  1080     QFETCH(int, to);
       
  1081     QFETCH(int, insert);
       
  1082     QFETCH(QList<int>, mapping);
       
  1083 
       
  1084     view->setStretchLastSection(false);
       
  1085 
       
  1086     view->moveSection(from, to);
       
  1087 
       
  1088     model->insertRow(insert);
       
  1089 
       
  1090     for (int i = 0; i < mapping.count(); ++i)
       
  1091         QCOMPARE(view->logicalIndex(i), mapping.at(i));
       
  1092 }
       
  1093 
       
  1094 void tst_QHeaderView::resizeMode()
       
  1095 {
       
  1096     // Q_ASSERT's when resizeMode is called with an invalid index
       
  1097     int last = view->count() - 1;
       
  1098     view->setResizeMode(QHeaderView::Interactive);
       
  1099     QCOMPARE(view->resizeMode(last), QHeaderView::Interactive);
       
  1100     QCOMPARE(view->resizeMode(1), QHeaderView::Interactive);
       
  1101     view->setResizeMode(QHeaderView::Stretch);
       
  1102     QCOMPARE(view->resizeMode(last), QHeaderView::Stretch);
       
  1103     QCOMPARE(view->resizeMode(1), QHeaderView::Stretch);
       
  1104     view->setResizeMode(QHeaderView::Custom);
       
  1105     QCOMPARE(view->resizeMode(last), QHeaderView::Custom);
       
  1106     QCOMPARE(view->resizeMode(1), QHeaderView::Custom);
       
  1107 
       
  1108     // test when sections have been moved
       
  1109     view->setStretchLastSection(false);
       
  1110     for (int i=0; i < (view->count() - 1); ++i)
       
  1111         view->setResizeMode(i, QHeaderView::Interactive);
       
  1112     int logicalIndex = view->count() / 2;
       
  1113     view->setResizeMode(logicalIndex, QHeaderView::Stretch);
       
  1114     view->moveSection(view->visualIndex(logicalIndex), 0);
       
  1115     for (int i=0; i < (view->count() - 1); ++i) {
       
  1116         if (i == logicalIndex)
       
  1117             QCOMPARE(view->resizeMode(i), QHeaderView::Stretch);
       
  1118         else
       
  1119             QCOMPARE(view->resizeMode(i), QHeaderView::Interactive);
       
  1120     }
       
  1121 }
       
  1122 
       
  1123 void tst_QHeaderView::resizeSection_data()
       
  1124 {
       
  1125     QTest::addColumn<int>("initial");
       
  1126     QTest::addColumn<QList<int> >("logical");
       
  1127     QTest::addColumn<QList<int> >("size");
       
  1128     QTest::addColumn<QList<int> >("mode");
       
  1129     QTest::addColumn<int>("resized");
       
  1130     QTest::addColumn<QList<int> >("expected");
       
  1131 
       
  1132     QTest::newRow("bad args")
       
  1133         << 100
       
  1134         << (QList<int>() << -1 << -1 << 99999 << 99999 << 4)
       
  1135         << (QList<int>() << -1 << 0 << 99999 << -1 << -1)
       
  1136         << (QList<int>()
       
  1137             << int(QHeaderView::Interactive)
       
  1138             << int(QHeaderView::Interactive)
       
  1139             << int(QHeaderView::Interactive)
       
  1140             << int(QHeaderView::Interactive))
       
  1141         << 0
       
  1142         << (QList<int>() << 0 << 0 << 0 << 0 << 0);
       
  1143 }
       
  1144 
       
  1145 void tst_QHeaderView::resizeSection()
       
  1146 {
       
  1147 
       
  1148     QFETCH(int, initial);
       
  1149     QFETCH(QList<int>, logical);
       
  1150     QFETCH(QList<int>, size);
       
  1151     QFETCH(QList<int>, mode);
       
  1152     QFETCH(int, resized);
       
  1153     QFETCH(QList<int>, expected);
       
  1154 
       
  1155     view->resize(400, 400);
       
  1156 
       
  1157     view->show();
       
  1158     view->setMovable(true);
       
  1159     view->setStretchLastSection(false);
       
  1160 
       
  1161     for (int i = 0; i < logical.count(); ++i)
       
  1162         if (logical.at(i) > -1 && logical.at(i) < view->count()) // for now
       
  1163             view->setResizeMode(logical.at(i), (QHeaderView::ResizeMode)mode.at(i));
       
  1164 
       
  1165     for (int j = 0; j < logical.count(); ++j)
       
  1166         view->resizeSection(logical.at(j), initial);
       
  1167 
       
  1168     QSignalSpy spy(view, SIGNAL(sectionResized(int, int, int)));
       
  1169 
       
  1170     for (int k = 0; k < logical.count(); ++k)
       
  1171         view->resizeSection(logical.at(k), size.at(k));
       
  1172 
       
  1173     QCOMPARE(spy.count(), resized);
       
  1174 
       
  1175     for (int l = 0; l < logical.count(); ++l)
       
  1176         QCOMPARE(view->sectionSize(logical.at(l)), expected.at(l));
       
  1177 }
       
  1178 
       
  1179 void tst_QHeaderView::highlightSections()
       
  1180 {
       
  1181     view->setHighlightSections(true);
       
  1182     QCOMPARE(view->highlightSections(), true);
       
  1183     view->setHighlightSections(false);
       
  1184     QCOMPARE(view->highlightSections(), false);
       
  1185 }
       
  1186 
       
  1187 void tst_QHeaderView::showSortIndicator()
       
  1188 {
       
  1189     view->setSortIndicatorShown(true);
       
  1190     QCOMPARE(view->isSortIndicatorShown(), true);
       
  1191     QCOMPARE(view->sortIndicatorOrder(), Qt::DescendingOrder);
       
  1192     view->setSortIndicator(1, Qt::AscendingOrder);
       
  1193     QCOMPARE(view->sortIndicatorOrder(), Qt::AscendingOrder);
       
  1194     view->setSortIndicator(1, Qt::DescendingOrder);
       
  1195     QCOMPARE(view->sortIndicatorOrder(), Qt::DescendingOrder);
       
  1196     view->setSortIndicatorShown(false);
       
  1197     QCOMPARE(view->isSortIndicatorShown(), false);
       
  1198 
       
  1199     view->setSortIndicator(999999, Qt::DescendingOrder);
       
  1200     // Don't segfault baby :)
       
  1201     view->setSortIndicatorShown(true);
       
  1202 
       
  1203     view->setSortIndicator(0, Qt::DescendingOrder);
       
  1204     // Don't assert baby :)
       
  1205 }
       
  1206 
       
  1207 void tst_QHeaderView::sortIndicatorTracking()
       
  1208 {
       
  1209     QtTestModel model;
       
  1210     model.rows = model.cols = 10;
       
  1211 
       
  1212     QHeaderView hv(Qt::Horizontal);
       
  1213 
       
  1214     hv.setModel(&model);
       
  1215     hv.show();
       
  1216     hv.setSortIndicatorShown(true);
       
  1217     hv.setSortIndicator(1, Qt::DescendingOrder);
       
  1218 
       
  1219     model.removeOneColumn(8);
       
  1220     QCOMPARE(hv.sortIndicatorSection(), 1);
       
  1221 
       
  1222     model.removeOneColumn(2);
       
  1223     QCOMPARE(hv.sortIndicatorSection(), 1);
       
  1224 
       
  1225     model.insertOneColumn(2);
       
  1226     QCOMPARE(hv.sortIndicatorSection(), 1);
       
  1227 
       
  1228     model.insertOneColumn(1);
       
  1229     QCOMPARE(hv.sortIndicatorSection(), 2);
       
  1230 
       
  1231     model.removeOneColumn(0);
       
  1232     QCOMPARE(hv.sortIndicatorSection(), 1);
       
  1233 
       
  1234     model.removeOneColumn(1);
       
  1235     QCOMPARE(hv.sortIndicatorSection(), -1);
       
  1236 }
       
  1237 
       
  1238 void tst_QHeaderView::removeAndInsertRow()
       
  1239 {
       
  1240     // Check if logicalIndex returns the correct value after we have removed a row
       
  1241     // we might as well te
       
  1242     for (int i = 0; i < model->rowCount(); ++i) {
       
  1243         QCOMPARE(i, view->logicalIndex(i));
       
  1244     }
       
  1245 
       
  1246     while (model->removeRow(0)) {
       
  1247         for (int i = 0; i < model->rowCount(); ++i) {
       
  1248             QCOMPARE(i, view->logicalIndex(i));
       
  1249         }
       
  1250     }
       
  1251 
       
  1252     int pass = 0;
       
  1253     for (pass = 0; pass < 5; pass++) {
       
  1254         for (int i = 0; i < model->rowCount(); ++i) {
       
  1255             QCOMPARE(i, view->logicalIndex(i));
       
  1256         }
       
  1257         model->insertRow(0);
       
  1258     }
       
  1259 
       
  1260     while (model->removeRows(0, 2)) {
       
  1261         for (int i = 0; i < model->rowCount(); ++i) {
       
  1262             QCOMPARE(i, view->logicalIndex(i));
       
  1263         }
       
  1264     }
       
  1265 
       
  1266     for (pass = 0; pass < 3; pass++) {
       
  1267         model->insertRows(0, 2);
       
  1268         for (int i = 0; i < model->rowCount(); ++i) {
       
  1269             QCOMPARE(i, view->logicalIndex(i));
       
  1270         }
       
  1271     }
       
  1272 
       
  1273     for (pass = 0; pass < 3; pass++) {
       
  1274         model->insertRows(3, 2);
       
  1275         for (int i = 0; i < model->rowCount(); ++i) {
       
  1276             QCOMPARE(i, view->logicalIndex(i));
       
  1277         }
       
  1278     }
       
  1279 
       
  1280     // Insert at end
       
  1281     for (pass = 0; pass < 3; pass++) {
       
  1282         int rowCount = model->rowCount();
       
  1283         model->insertRows(rowCount, 1);
       
  1284         for (int i = 0; i < rowCount; ++i) {
       
  1285             QCOMPARE(i, view->logicalIndex(i));
       
  1286         }
       
  1287     }
       
  1288 
       
  1289 }
       
  1290 void tst_QHeaderView::unhideSection()
       
  1291 {
       
  1292     // You should not necessarily expect the same size back again, so the best test we can do is to test if it is larger than 0 after a unhide.
       
  1293     QCOMPARE(view->sectionsHidden(), false);
       
  1294     view->setSectionHidden(0, true);
       
  1295     QCOMPARE(view->sectionsHidden(), true);
       
  1296     QVERIFY(view->sectionSize(0) == 0);
       
  1297     view->setResizeMode(QHeaderView::Interactive);
       
  1298     view->setSectionHidden(0, false);
       
  1299     QVERIFY(view->sectionSize(0) > 0);
       
  1300 
       
  1301     view->setSectionHidden(0, true);
       
  1302     QVERIFY(view->sectionSize(0) == 0);
       
  1303     view->setSectionHidden(0, true);
       
  1304     QVERIFY(view->sectionSize(0) == 0);
       
  1305     view->setResizeMode(QHeaderView::Stretch);
       
  1306     view->setSectionHidden(0, false);
       
  1307     QVERIFY(view->sectionSize(0) > 0);
       
  1308 
       
  1309 }
       
  1310 
       
  1311 void tst_QHeaderView::event()
       
  1312 {
       
  1313     protected_QHeaderView x(Qt::Vertical);
       
  1314     x.testEvent();
       
  1315     protected_QHeaderView y(Qt::Horizontal);
       
  1316     y.testEvent();
       
  1317 }
       
  1318 
       
  1319 
       
  1320 void protected_QHeaderView::testEvent()
       
  1321 {
       
  1322     // No crashy please
       
  1323     QHoverEvent enterEvent(QEvent::HoverEnter, QPoint(), QPoint());
       
  1324     event(&enterEvent);
       
  1325     QHoverEvent eventLeave(QEvent::HoverLeave, QPoint(), QPoint());
       
  1326     event(&eventLeave);
       
  1327     QHoverEvent eventMove(QEvent::HoverMove, QPoint(), QPoint());
       
  1328     event(&eventMove);
       
  1329 }
       
  1330 
       
  1331 void tst_QHeaderView::headerDataChanged()
       
  1332 {
       
  1333     // This shouldn't asserver because view is Vertical
       
  1334     view->headerDataChanged(Qt::Horizontal, -1, -1);
       
  1335 #if 0
       
  1336     // This will assert
       
  1337     view->headerDataChanged(Qt::Vertical, -1, -1);
       
  1338 #endif
       
  1339 
       
  1340     // No crashing please
       
  1341     view->headerDataChanged(Qt::Horizontal, 0, 1);
       
  1342     view->headerDataChanged(Qt::Vertical, 0, 1);
       
  1343 }
       
  1344 
       
  1345 void tst_QHeaderView::currentChanged()
       
  1346 {
       
  1347     view->setCurrentIndex(QModelIndex());
       
  1348 }
       
  1349 
       
  1350 void tst_QHeaderView::horizontalOffset()
       
  1351 {
       
  1352     protected_QHeaderView x(Qt::Vertical);
       
  1353     x.testhorizontalOffset();
       
  1354     protected_QHeaderView y(Qt::Horizontal);
       
  1355     y.testhorizontalOffset();
       
  1356 }
       
  1357 
       
  1358 void tst_QHeaderView::verticalOffset()
       
  1359 {
       
  1360     protected_QHeaderView x(Qt::Vertical);
       
  1361     x.testverticalOffset();
       
  1362     protected_QHeaderView y(Qt::Horizontal);
       
  1363     y.testverticalOffset();
       
  1364 }
       
  1365 
       
  1366 void  protected_QHeaderView::testhorizontalOffset()
       
  1367 {
       
  1368     if(orientation() == Qt::Horizontal){
       
  1369         QCOMPARE(horizontalOffset(), 0);
       
  1370         setOffset(10);
       
  1371         QCOMPARE(horizontalOffset(), 10);
       
  1372     }
       
  1373     else
       
  1374         QCOMPARE(horizontalOffset(), 0);
       
  1375 
       
  1376 }
       
  1377 
       
  1378 void  protected_QHeaderView::testverticalOffset()
       
  1379 {
       
  1380     if(orientation() == Qt::Vertical){
       
  1381         QCOMPARE(verticalOffset(), 0);
       
  1382         setOffset(10);
       
  1383         QCOMPARE(verticalOffset(), 10);
       
  1384     }
       
  1385     else
       
  1386         QCOMPARE(verticalOffset(), 0);
       
  1387 }
       
  1388 
       
  1389 void tst_QHeaderView::stretchSectionCount()
       
  1390 {
       
  1391     view->setStretchLastSection(false);
       
  1392     QCOMPARE(view->stretchSectionCount(), 0);
       
  1393     view->setStretchLastSection(true);
       
  1394     QCOMPARE(view->stretchSectionCount(), 0);
       
  1395 
       
  1396     view->setResizeMode(0, QHeaderView::Stretch);
       
  1397     QCOMPARE(view->stretchSectionCount(), 1);
       
  1398 }
       
  1399 
       
  1400 void tst_QHeaderView::hiddenSectionCount()
       
  1401 {
       
  1402     model->clear();
       
  1403     model->insertRows(0, 10);
       
  1404     // Hide every other one
       
  1405     for (int i=0; i<10; i++)
       
  1406         view->setSectionHidden(i, (i & 1) == 0);
       
  1407 
       
  1408     QCOMPARE(view->hiddenSectionCount(), 5);
       
  1409 
       
  1410     view->setResizeMode(QHeaderView::Stretch);
       
  1411     QCOMPARE(view->hiddenSectionCount(), 5);
       
  1412 
       
  1413     // Remove some rows and make sure they are now still counted
       
  1414     model->removeRow(9);
       
  1415     model->removeRow(8);
       
  1416     model->removeRow(7);
       
  1417     model->removeRow(6);
       
  1418     QCOMPARE(view->count(), 6);
       
  1419     QCOMPARE(view->hiddenSectionCount(), 3);
       
  1420     model->removeRows(0,5);
       
  1421     QCOMPARE(view->count(), 1);
       
  1422     QCOMPARE(view->hiddenSectionCount(), 0);
       
  1423     QVERIFY(view->count() >=  view->hiddenSectionCount());
       
  1424 }
       
  1425 
       
  1426 void tst_QHeaderView::focusPolicy()
       
  1427 {
       
  1428     QHeaderView view(Qt::Horizontal);
       
  1429     QCOMPARE(view.focusPolicy(), Qt::NoFocus);
       
  1430 
       
  1431     QTreeWidget widget;
       
  1432     QCOMPARE(widget.header()->focusPolicy(), Qt::NoFocus);
       
  1433     QVERIFY(!widget.focusProxy());
       
  1434     QVERIFY(!widget.hasFocus());
       
  1435     QVERIFY(!widget.header()->focusProxy());
       
  1436     QVERIFY(!widget.header()->hasFocus());
       
  1437 
       
  1438     widget.show();
       
  1439     widget.setFocus(Qt::OtherFocusReason);
       
  1440     QApplication::setActiveWindow(&widget);
       
  1441     QTest::qWaitForWindowShown(&widget);
       
  1442     widget.activateWindow();
       
  1443     QTest::qWait(100);
       
  1444 
       
  1445     qApp->processEvents();
       
  1446 
       
  1447     WAIT_FOR_CONDITION(widget.hasFocus(), true);
       
  1448 
       
  1449     QVERIFY(widget.hasFocus());
       
  1450     QVERIFY(!widget.header()->hasFocus());
       
  1451 
       
  1452     widget.setFocusPolicy(Qt::NoFocus);
       
  1453     widget.clearFocus();
       
  1454 
       
  1455     qApp->processEvents();
       
  1456     qApp->processEvents();
       
  1457 
       
  1458     WAIT_FOR_CONDITION(widget.hasFocus(), false);
       
  1459     QVERIFY(!widget.hasFocus());
       
  1460     QVERIFY(!widget.header()->hasFocus());
       
  1461 
       
  1462     QTest::keyPress(&widget, Qt::Key_Tab);
       
  1463 
       
  1464     qApp->processEvents();
       
  1465     qApp->processEvents();
       
  1466 
       
  1467     QVERIFY(!widget.hasFocus());
       
  1468     QVERIFY(!widget.header()->hasFocus());
       
  1469 }
       
  1470 
       
  1471 class SimpleModel : public QAbstractItemModel
       
  1472 {
       
  1473     Q_OBJECT
       
  1474 public:
       
  1475 
       
  1476     SimpleModel( QObject* parent=0)
       
  1477         : QAbstractItemModel(parent),
       
  1478         m_col_count(3) {}
       
  1479 
       
  1480     QModelIndex parent(const QModelIndex &/*child*/) const
       
  1481     {
       
  1482         return QModelIndex();
       
  1483     }
       
  1484     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const
       
  1485     {
       
  1486         return hasIndex(row, column, parent) ? createIndex(row, column, 0) : QModelIndex();
       
  1487     }
       
  1488     int rowCount(const QModelIndex & /* parent */) const
       
  1489     {
       
  1490         return 8;
       
  1491     }
       
  1492     int columnCount(const QModelIndex &/*parent= QModelIndex()*/) const
       
  1493     {
       
  1494         return m_col_count;
       
  1495     }
       
  1496 
       
  1497     QVariant data(const QModelIndex &index, int role) const
       
  1498     {
       
  1499         if (!index.isValid())
       
  1500         {
       
  1501             return QVariant();
       
  1502         }
       
  1503         if (role == Qt::DisplayRole) {
       
  1504             return QString::fromAscii("%1,%2").arg(index.row()).arg(index.column());
       
  1505         }
       
  1506         return QVariant();
       
  1507     }
       
  1508 
       
  1509     void setColumnCount( int c )
       
  1510     {
       
  1511         m_col_count = c;
       
  1512     }
       
  1513 
       
  1514 private:
       
  1515     int m_col_count;
       
  1516 };
       
  1517 
       
  1518 void tst_QHeaderView::moveSectionAndReset()
       
  1519 {
       
  1520     SimpleModel m;
       
  1521     QHeaderView v(Qt::Horizontal);
       
  1522     v.setModel(&m);
       
  1523     int cc = 2;
       
  1524     for (cc = 2; cc < 4; ++cc) {
       
  1525         m.setColumnCount(cc);
       
  1526         int movefrom = 0;
       
  1527         int moveto;
       
  1528         for (moveto = 1; moveto < cc; ++moveto) {
       
  1529             v.moveSection(movefrom, moveto);
       
  1530             m.setColumnCount(cc - 1);
       
  1531             v.reset();
       
  1532             for (int i = 0; i < cc - 1; ++i) {
       
  1533                 QCOMPARE(v.logicalIndex(v.visualIndex(i)), i);
       
  1534             }
       
  1535         }
       
  1536     }
       
  1537 }
       
  1538 
       
  1539 void tst_QHeaderView::moveSectionAndRemove()
       
  1540 {
       
  1541     QStandardItemModel m;
       
  1542     QHeaderView v(Qt::Horizontal);
       
  1543 
       
  1544     v.setModel(&m);
       
  1545     v.model()->insertColumns(0, 3);
       
  1546     v.moveSection(0, 1);
       
  1547 
       
  1548     QCOMPARE(v.count(), 3);
       
  1549     v.model()->removeColumns(0, v.model()->columnCount());
       
  1550     QCOMPARE(v.count(), 0);
       
  1551 }
       
  1552 
       
  1553 void tst_QHeaderView::saveRestore()
       
  1554 {
       
  1555     SimpleModel m;
       
  1556     QHeaderView h1(Qt::Horizontal);
       
  1557     h1.setModel(&m);
       
  1558     h1.swapSections(0, 2);
       
  1559     h1.resizeSection(1, 10);
       
  1560     h1.setSortIndicatorShown(true);
       
  1561     h1.setSortIndicator(1,Qt::DescendingOrder);
       
  1562     QByteArray s1 = h1.saveState();
       
  1563 
       
  1564     QHeaderView h2(Qt::Vertical);
       
  1565     QSignalSpy spy(&h2, SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)));
       
  1566 
       
  1567     h2.setModel(&m);
       
  1568     h2.restoreState(s1);
       
  1569 
       
  1570     QCOMPARE(spy.count(), 1);
       
  1571     QCOMPARE(spy.at(0).at(0).toInt(), 1);
       
  1572 
       
  1573     QCOMPARE(h2.logicalIndex(0), 2);
       
  1574     QCOMPARE(h2.logicalIndex(2), 0);
       
  1575     QCOMPARE(h2.sectionSize(1), 10);
       
  1576     QCOMPARE(h2.sortIndicatorSection(), 1);
       
  1577     QCOMPARE(h2.sortIndicatorOrder(), Qt::DescendingOrder);
       
  1578     QCOMPARE(h2.isSortIndicatorShown(), true);
       
  1579 
       
  1580     QByteArray s2 = h2.saveState();
       
  1581 
       
  1582     QVERIFY(s1 == s2);
       
  1583 }
       
  1584 
       
  1585 void tst_QHeaderView::defaultAlignment_data()
       
  1586 {
       
  1587     QTest::addColumn<int>("direction");
       
  1588     QTest::addColumn<int>("initial");
       
  1589     QTest::addColumn<int>("alignment");
       
  1590 
       
  1591     QTest::newRow("horizontal right aligned")
       
  1592         << int(Qt::Horizontal)
       
  1593         << int(Qt::AlignCenter)
       
  1594         << int(Qt::AlignRight);
       
  1595 
       
  1596     QTest::newRow("horizontal left aligned")
       
  1597         << int(Qt::Horizontal)
       
  1598         << int(Qt::AlignCenter)
       
  1599         << int(Qt::AlignLeft);
       
  1600 
       
  1601     QTest::newRow("vertical right aligned")
       
  1602         << int(Qt::Vertical)
       
  1603         << int(Qt::AlignLeft|Qt::AlignVCenter)
       
  1604         << int(Qt::AlignRight);
       
  1605 
       
  1606     QTest::newRow("vertical left aligned")
       
  1607         << int(Qt::Vertical)
       
  1608         << int(Qt::AlignLeft|Qt::AlignVCenter)
       
  1609         << int(Qt::AlignLeft);
       
  1610 }
       
  1611 
       
  1612 void tst_QHeaderView::defaultAlignment()
       
  1613 {
       
  1614     QFETCH(int, direction);
       
  1615     QFETCH(int, initial);
       
  1616     QFETCH(int, alignment);
       
  1617 
       
  1618     SimpleModel m;
       
  1619 
       
  1620     QHeaderView header((Qt::Orientation)direction);
       
  1621     header.setModel(&m);
       
  1622 
       
  1623     QCOMPARE(header.defaultAlignment(), (Qt::Alignment)initial);
       
  1624     header.setDefaultAlignment((Qt::Alignment)alignment);
       
  1625     QCOMPARE(header.defaultAlignment(), (Qt::Alignment)alignment);
       
  1626 }
       
  1627 
       
  1628 void tst_QHeaderView::globalResizeMode_data()
       
  1629 {
       
  1630     QTest::addColumn<int>("direction");
       
  1631     QTest::addColumn<int>("mode");
       
  1632     QTest::addColumn<int>("insert");
       
  1633 
       
  1634     QTest::newRow("horizontal ResizeToContents 0")
       
  1635         << int(Qt::Horizontal)
       
  1636         << int(QHeaderView::ResizeToContents)
       
  1637         << 0;
       
  1638 }
       
  1639 
       
  1640 void tst_QHeaderView::globalResizeMode()
       
  1641 {
       
  1642     QFETCH(int, direction);
       
  1643     QFETCH(int, mode);
       
  1644     QFETCH(int, insert);
       
  1645 
       
  1646     QStandardItemModel m(4, 4);
       
  1647     QHeaderView h((Qt::Orientation)direction);
       
  1648     h.setModel(&m);
       
  1649 
       
  1650     h.setResizeMode((QHeaderView::ResizeMode)mode);
       
  1651     m.insertRow(insert);
       
  1652     for (int i = 0; i < h.count(); ++i)
       
  1653         QCOMPARE(h.resizeMode(i), (QHeaderView::ResizeMode)mode);
       
  1654 }
       
  1655 
       
  1656 
       
  1657 void tst_QHeaderView::sectionPressedSignal_data()
       
  1658 {
       
  1659     QTest::addColumn<int>("direction");
       
  1660     QTest::addColumn<bool>("clickable");
       
  1661     QTest::addColumn<int>("count");
       
  1662 
       
  1663     QTest::newRow("horizontal unclickable 0")
       
  1664         << int(Qt::Horizontal)
       
  1665         << false
       
  1666         << 0;
       
  1667 
       
  1668     QTest::newRow("horizontal clickable 1")
       
  1669         << int(Qt::Horizontal)
       
  1670         << true
       
  1671         << 1;
       
  1672 }
       
  1673 
       
  1674 void tst_QHeaderView::sectionPressedSignal()
       
  1675 {
       
  1676     QFETCH(int, direction);
       
  1677     QFETCH(bool, clickable);
       
  1678     QFETCH(int, count);
       
  1679 
       
  1680     QStandardItemModel m(4, 4);
       
  1681     QHeaderView h((Qt::Orientation)direction);
       
  1682 
       
  1683     h.setModel(&m);
       
  1684     h.show();
       
  1685     h.setClickable(clickable);
       
  1686 
       
  1687     QSignalSpy spy(&h, SIGNAL(sectionPressed(int)));
       
  1688 
       
  1689     QCOMPARE(spy.count(), 0);
       
  1690     QTest::mousePress(h.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
       
  1691     QCOMPARE(spy.count(), count);
       
  1692 }
       
  1693 
       
  1694 void tst_QHeaderView::sectionClickedSignal()
       
  1695 {
       
  1696     QFETCH(int, direction);
       
  1697     QFETCH(bool, clickable);
       
  1698     QFETCH(int, count);
       
  1699 
       
  1700     QStandardItemModel m(4, 4);
       
  1701     QHeaderView h((Qt::Orientation)direction);
       
  1702 
       
  1703     h.setModel(&m);
       
  1704     h.show();
       
  1705     h.setClickable(clickable);
       
  1706     h.setSortIndicatorShown(true);
       
  1707 
       
  1708     QSignalSpy spy(&h, SIGNAL(sectionClicked(int)));
       
  1709     QSignalSpy spy2(&h, SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)));
       
  1710 
       
  1711     QCOMPARE(spy.count(), 0);
       
  1712     QCOMPARE(spy2.count(), 0);
       
  1713     QTest::mouseClick(h.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
       
  1714     QCOMPARE(spy.count(), count);
       
  1715     QCOMPARE(spy2.count(), count);
       
  1716 
       
  1717     //now let's try with the sort indicator hidden (the result should be the same
       
  1718     spy.clear();
       
  1719     spy2.clear();
       
  1720     h.setSortIndicatorShown(false);
       
  1721     QTest::mouseClick(h.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
       
  1722     QCOMPARE(spy.count(), count);
       
  1723     QCOMPARE(spy2.count(), count);
       
  1724 }
       
  1725 
       
  1726 void tst_QHeaderView::defaultSectionSize_data()
       
  1727 {
       
  1728     QTest::addColumn<int>("direction");
       
  1729     QTest::addColumn<int>("oldDefaultSize");
       
  1730     QTest::addColumn<int>("newDefaultSize");
       
  1731 
       
  1732     //QTest::newRow("horizontal,-5") << int(Qt::Horizontal) << 100 << -5;
       
  1733     QTest::newRow("horizontal, 0") << int(Qt::Horizontal) << 100 << 0;
       
  1734     QTest::newRow("horizontal, 5") << int(Qt::Horizontal) << 100 << 5;
       
  1735     QTest::newRow("horizontal,25") << int(Qt::Horizontal) << 100 << 5;
       
  1736 }
       
  1737 
       
  1738 void tst_QHeaderView::defaultSectionSize()
       
  1739 {
       
  1740     QFETCH(int, direction);
       
  1741     QFETCH(int, oldDefaultSize);
       
  1742     QFETCH(int, newDefaultSize);
       
  1743 
       
  1744     QStandardItemModel m(4, 4);
       
  1745     QHeaderView h((Qt::Orientation)direction);
       
  1746 
       
  1747     h.setModel(&m);
       
  1748 
       
  1749     QCOMPARE(h.defaultSectionSize(), oldDefaultSize);
       
  1750     h.setDefaultSectionSize(newDefaultSize);
       
  1751     QCOMPARE(h.defaultSectionSize(), newDefaultSize);
       
  1752     h.reset();
       
  1753     for (int i = 0; i < h.count(); ++i)
       
  1754         QCOMPARE(h.sectionSize(i), newDefaultSize);
       
  1755 }
       
  1756 
       
  1757 void tst_QHeaderView::hideAndInsert_data()
       
  1758 {
       
  1759     QTest::addColumn<int>("direction");
       
  1760     QTest::addColumn<int>("hide");
       
  1761     QTest::addColumn<int>("insert");
       
  1762     QTest::addColumn<int>("hidden");
       
  1763 
       
  1764     QTest::newRow("horizontal, 0, 0") << int(Qt::Horizontal) << 0 << 0 << 1;
       
  1765 }
       
  1766 
       
  1767 void tst_QHeaderView::hideAndInsert()
       
  1768 {
       
  1769     QFETCH(int, direction);
       
  1770     QFETCH(int, hide);
       
  1771     QFETCH(int, insert);
       
  1772     QFETCH(int, hidden);
       
  1773 
       
  1774     QStandardItemModel m(4, 4);
       
  1775     QHeaderView h((Qt::Orientation)direction);
       
  1776 
       
  1777     h.setModel(&m);
       
  1778 
       
  1779     h.setSectionHidden(hide, true);
       
  1780 
       
  1781     if (direction == Qt::Vertical)
       
  1782         m.insertRow(insert);
       
  1783     else
       
  1784         m.insertColumn(insert);
       
  1785 
       
  1786     for (int i = 0; i < h.count(); ++i)
       
  1787         if (i != hidden)
       
  1788             QCOMPARE(h.isSectionHidden(i), false);
       
  1789         else
       
  1790             QCOMPARE(h.isSectionHidden(i), true);
       
  1791 }
       
  1792 
       
  1793 void tst_QHeaderView::removeSection()
       
  1794 {
       
  1795 //test that removing a hidden section gives the expected result: the next row should be hidden
       
  1796 //(see task
       
  1797     const int hidden = 3; //section that will be hidden
       
  1798     const QStringList list = QStringList() << "0" << "1" << "2" << "3" << "4" << "5" << "6";
       
  1799 
       
  1800     QStringListModel model( list );
       
  1801     QHeaderView view(Qt::Vertical);
       
  1802     view.setModel(&model);
       
  1803     view.hideSection(hidden);
       
  1804     view.hideSection(1);
       
  1805     model.removeRow(1);
       
  1806     view.show();
       
  1807 
       
  1808     for(int i = 0; i < view.count(); i++) {
       
  1809         if (i == (hidden-1)) { //-1 because we removed a row in the meantime
       
  1810             QCOMPARE(view.sectionSize(i), 0);
       
  1811             QVERIFY(view.isSectionHidden(i));
       
  1812         } else {
       
  1813             QCOMPARE(view.sectionSize(i), view.defaultSectionSize() );
       
  1814             QVERIFY(!view.isSectionHidden(i));
       
  1815         }
       
  1816     }
       
  1817 }
       
  1818 
       
  1819 void tst_QHeaderView::preserveHiddenSectionWidth()
       
  1820 {
       
  1821     const QStringList list = QStringList() << "0" << "1" << "2" << "3";
       
  1822 
       
  1823     QStringListModel model( list );
       
  1824     QHeaderView view(Qt::Vertical);
       
  1825     view.setModel(&model);
       
  1826     view.resizeSection(0, 100);
       
  1827     view.resizeSection(1, 10);
       
  1828     view.resizeSection(2, 50);
       
  1829     view.setResizeMode(3, QHeaderView::Stretch);
       
  1830     view.show();
       
  1831 
       
  1832     view.hideSection(2);
       
  1833     model.removeRow(1);
       
  1834     view.showSection(1);
       
  1835     QCOMPARE(view.sectionSize(0), 100);
       
  1836     QCOMPARE(view.sectionSize(1), 50);
       
  1837 
       
  1838     view.hideSection(1);
       
  1839     model.insertRow(1);
       
  1840     view.showSection(2);
       
  1841     QCOMPARE(view.sectionSize(0), 100);
       
  1842     QCOMPARE(view.sectionSize(1), view.defaultSectionSize());
       
  1843     QCOMPARE(view.sectionSize(2), 50);
       
  1844 }
       
  1845 
       
  1846 void tst_QHeaderView::invisibleStretchLastSection()
       
  1847 {
       
  1848     int count = 6;
       
  1849     QStandardItemModel model(1, count);
       
  1850     QHeaderView view(Qt::Horizontal);
       
  1851     view.setModel(&model);
       
  1852     int height = view.height();
       
  1853 
       
  1854     view.resize(view.defaultSectionSize() * (count / 2), height); // don't show all sections
       
  1855     view.show();
       
  1856     view.setStretchLastSection(true);
       
  1857     // stretch section is not visible; it should not be stretched
       
  1858     for (int i = 0; i < count; ++i)
       
  1859         QCOMPARE(view.sectionSize(i), view.defaultSectionSize());
       
  1860 
       
  1861     view.resize(view.defaultSectionSize() * (count + 1), height); // give room to stretch
       
  1862 
       
  1863     // stretch section is visible; it should be stretched
       
  1864     for (int i = 0; i < count - 1; ++i)
       
  1865         QCOMPARE(view.sectionSize(i), view.defaultSectionSize());
       
  1866     QCOMPARE(view.sectionSize(count - 1), view.defaultSectionSize() * 2);
       
  1867 }
       
  1868 
       
  1869 void tst_QHeaderView::emptySectionSpan()
       
  1870 {
       
  1871     QHeaderViewPrivate::SectionSpan span;
       
  1872     QCOMPARE(span.sectionSize(), 0);
       
  1873 }
       
  1874 
       
  1875 void tst_QHeaderView::task236450_hidden_data()
       
  1876 {
       
  1877     QTest::addColumn<QList<int> >("hide1");
       
  1878     QTest::addColumn<QList<int> >("hide2");
       
  1879 
       
  1880     QTest::newRow("set 1") << (QList<int>() << 1 << 3)
       
  1881                            << (QList<int>() << 1 << 5);
       
  1882 
       
  1883     QTest::newRow("set 2") << (QList<int>() << 2 << 3)
       
  1884                            << (QList<int>() << 1 << 5);
       
  1885 
       
  1886     QTest::newRow("set 3") << (QList<int>() << 0 << 2 << 4)
       
  1887                            << (QList<int>() << 2 << 3 << 5);
       
  1888 
       
  1889 }
       
  1890 
       
  1891 void tst_QHeaderView::task236450_hidden()
       
  1892 {
       
  1893     QFETCH(QList<int>, hide1);
       
  1894     QFETCH(QList<int>, hide2);
       
  1895     const QStringList list = QStringList() << "0" << "1" << "2" << "3" << "4" << "5";
       
  1896 
       
  1897     QStringListModel model( list );
       
  1898     protected_QHeaderView view(Qt::Vertical);
       
  1899     view.setModel(&model);
       
  1900     view.show();
       
  1901 
       
  1902     foreach (int i, hide1)
       
  1903         view.hideSection(i);
       
  1904 
       
  1905     QCOMPARE(view.hiddenSectionCount(), hide1.count());
       
  1906     for (int i = 0; i < 6; i++) {
       
  1907         QCOMPARE(!view.isSectionHidden(i), !hide1.contains(i));
       
  1908     }
       
  1909 
       
  1910     view.setDefaultSectionSize(2);
       
  1911     view.scheduleDelayedItemsLayout();
       
  1912     view.executeDelayedItemsLayout(); //force to do a relayout
       
  1913 
       
  1914     QCOMPARE(view.hiddenSectionCount(), hide1.count());
       
  1915     for (int i = 0; i < 6; i++) {
       
  1916         QCOMPARE(!view.isSectionHidden(i), !hide1.contains(i));
       
  1917         view.setSectionHidden(i, hide2.contains(i));
       
  1918     }
       
  1919 
       
  1920     QCOMPARE(view.hiddenSectionCount(), hide2.count());
       
  1921     for (int i = 0; i < 6; i++) {
       
  1922         QCOMPARE(!view.isSectionHidden(i), !hide2.contains(i));
       
  1923     }
       
  1924 
       
  1925 }
       
  1926 
       
  1927 void tst_QHeaderView::task248050_hideRow()
       
  1928 {
       
  1929     //this is the sequence of events that make the task fail
       
  1930     protected_QHeaderView header(Qt::Vertical);
       
  1931     QStandardItemModel model(0, 1);
       
  1932     header.setStretchLastSection(false);
       
  1933     header.setDefaultSectionSize(17);
       
  1934     header.setModel(&model);
       
  1935     header.doItemsLayout();
       
  1936 
       
  1937     model.setRowCount(3);
       
  1938 
       
  1939     QCOMPARE(header.sectionPosition(2), 17*2);
       
  1940 
       
  1941     header.hideSection(1);
       
  1942     QCOMPARE(header.sectionPosition(2), 17);
       
  1943 
       
  1944     QTest::qWait(100);
       
  1945     //the size of the section shouldn't have changed
       
  1946     QCOMPARE(header.sectionPosition(2), 17);
       
  1947 }
       
  1948 
       
  1949 
       
  1950 QTEST_MAIN(tst_QHeaderView)
       
  1951 #include "tst_qheaderview.moc"