tests/auto/qtableview/tst_qtableview.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
2:56cd8111b7f7 3:41300fa6a67c
    39 **
    39 **
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 
    42 
    43 #include <QtGui/QtGui>
    43 #include <QtGui/QtGui>
       
    44 #include <private/qtablewidget_p.h>
    44 #include <QtTest/QtTest>
    45 #include <QtTest/QtTest>
    45 #include "../../shared/util.h"
    46 #include "../../shared/util.h"
    46 #include "private/qapplication_p.h"
    47 #include "private/qapplication_p.h"
    47 
    48 
    48 //TESTED_CLASS=
    49 //TESTED_CLASS=
    56         for (int i = 0; i < 2000 && expr != expected; i+=step) { \
    57         for (int i = 0; i < 2000 && expr != expected; i+=step) { \
    57             QTest::qWait(step); \
    58             QTest::qWait(step); \
    58         } \
    59         } \
    59     } while(0)
    60     } while(0)
    60 
    61 
       
    62 #ifdef QT_BUILD_INTERNAL
       
    63 #define VERIFY_SPANS_CONSISTENCY(TEST_VIEW_) \
       
    64     QVERIFY(static_cast<QTableViewPrivate*>(QObjectPrivate::get(TEST_VIEW_))->spans.checkConsistency())
       
    65 #else
       
    66 #define VERIFY_SPANS_CONSISTENCY(TEST_VIEW_) (void)false
       
    67 #endif
       
    68 
    61 typedef QList<int> IntList;
    69 typedef QList<int> IntList;
    62 Q_DECLARE_METATYPE(IntList)
    70 Q_DECLARE_METATYPE(IntList)
    63 
    71 
    64 typedef QList<bool> BoolList;
    72 typedef QList<bool> BoolList;
    65 Q_DECLARE_METATYPE(BoolList)
    73 Q_DECLARE_METATYPE(BoolList)
   186     void task227953_setRootIndex();
   194     void task227953_setRootIndex();
   187     void task240266_veryBigColumn();
   195     void task240266_veryBigColumn();
   188     void task248688_autoScrollNavigation();
   196     void task248688_autoScrollNavigation();
   189     void task259308_scrollVerticalHeaderSwappedSections();
   197     void task259308_scrollVerticalHeaderSwappedSections();
   190     void task191545_dragSelectRows();
   198     void task191545_dragSelectRows();
       
   199     void taskQTBUG_5062_spansInconsistency();
       
   200     void taskQTBUG_4516_clickOnRichTextLabel();
       
   201     void taskQTBUG_5237_wheelEventOnHeader();
   191 
   202 
   192     void mouseWheel_data();
   203     void mouseWheel_data();
   193     void mouseWheel();
   204     void mouseWheel();
   194 
   205 
   195     void addColumnWhileEditing();
   206     void addColumnWhileEditing();
   196     void task234926_setHeaderSorting();
   207     void task234926_setHeaderSorting();
       
   208 
       
   209     void changeHeaderData();
   197 };
   210 };
   198 
   211 
   199 // Testing get/set functions
   212 // Testing get/set functions
   200 void tst_QTableView::getSetCheck()
   213 void tst_QTableView::getSetCheck()
   201 {
   214 {
  2015 
  2028 
  2016     QSignalSpy resizedSpy(view.verticalHeader(), SIGNAL(sectionResized(int, int, int)));
  2029     QSignalSpy resizedSpy(view.verticalHeader(), SIGNAL(sectionResized(int, int, int)));
  2017     view.resizeRowsToContents();
  2030     view.resizeRowsToContents();
  2018 
  2031 
  2019     QCOMPARE(resizedSpy.count(), model.rowCount());
  2032     QCOMPARE(resizedSpy.count(), model.rowCount());
  2020     for (int r = 0; r < model.rowCount(); ++r)
  2033     for (int r = 0; r < model.rowCount(); ++r) {
  2021         QCOMPARE(view.rowHeight(r), rowHeight);
  2034         QCOMPARE(view.rowHeight(r), rowHeight);
       
  2035     }
  2022 }
  2036 }
  2023 
  2037 
  2024 void tst_QTableView::resizeColumnsToContents_data()
  2038 void tst_QTableView::resizeColumnsToContents_data()
  2025 {
  2039 {
  2026     QTest::addColumn<int>("rowCount");
  2040     QTest::addColumn<int>("rowCount");
  2896     }
  2910     }
  2897 
  2911 
  2898     view.clearSpans();
  2912     view.clearSpans();
  2899     QCOMPARE(view.rowSpan(row, column), 1);
  2913     QCOMPARE(view.rowSpan(row, column), 1);
  2900     QCOMPARE(view.columnSpan(row, column), 1);
  2914     QCOMPARE(view.columnSpan(row, column), 1);
       
  2915 
       
  2916     VERIFY_SPANS_CONSISTENCY(&view);
  2901 }
  2917 }
  2902 
  2918 
  2903 typedef QVector<QRect> SpanList;
  2919 typedef QVector<QRect> SpanList;
  2904 Q_DECLARE_METATYPE(SpanList)
  2920 Q_DECLARE_METATYPE(SpanList)
  2905 
  2921 
  2998       << (SpanList() << QRect(0, 0, 2, 2) << QRect(2, 0, 1, 2))
  3014       << (SpanList() << QRect(0, 0, 2, 2) << QRect(2, 0, 1, 2))
  2999       << true //we hide the last row of the first span
  3015       << true //we hide the last row of the first span
  3000       << QPoint(2, 0)
  3016       << QPoint(2, 0)
  3001       << 1
  3017       << 1
  3002       << 2;
  3018       << 2;
       
  3019 
       
  3020     QTest::newRow("QTBUG-6004: No failing Q_ASSERT, then it passes.")
       
  3021       << 5 << 5
       
  3022       << (SpanList() << QRect(0, 0, 2, 2) << QRect(0, 0, 1, 1))
       
  3023       << false
       
  3024       << QPoint(0, 0)
       
  3025       << 1
       
  3026       << 1;
  3003 }
  3027 }
  3004 
  3028 
  3005 void tst_QTableView::spans()
  3029 void tst_QTableView::spans()
  3006 {
  3030 {
  3007     QFETCH(int, rows);
  3031     QFETCH(int, rows);
  3031         QVERIFY(first.intersected(next).isEmpty());
  3055         QVERIFY(first.intersected(next).isEmpty());
  3032     }
  3056     }
  3033 
  3057 
  3034     QCOMPARE(view.columnSpan(pos.x(), pos.y()), expectedColumnSpan);
  3058     QCOMPARE(view.columnSpan(pos.x(), pos.y()), expectedColumnSpan);
  3035     QCOMPARE(view.rowSpan(pos.x(), pos.y()), expectedRowSpan);
  3059     QCOMPARE(view.rowSpan(pos.x(), pos.y()), expectedRowSpan);
       
  3060 
       
  3061     VERIFY_SPANS_CONSISTENCY(&view);
  3036 }
  3062 }
  3037 
  3063 
  3038 void tst_QTableView::spansAfterRowInsertion()
  3064 void tst_QTableView::spansAfterRowInsertion()
  3039 {
  3065 {
  3040     QtTestTableModel model(10, 10);
  3066     QtTestTableModel model(10, 10);
  3065 
  3091 
  3066     // Insertion after the span does nothing to it.
  3092     // Insertion after the span does nothing to it.
  3067     view.model()->insertRows(12, 2);
  3093     view.model()->insertRows(12, 2);
  3068     QCOMPARE(view.rowSpan(7, 3), 5);
  3094     QCOMPARE(view.rowSpan(7, 3), 5);
  3069     QCOMPARE(view.columnSpan(7, 3), 3);
  3095     QCOMPARE(view.columnSpan(7, 3), 3);
       
  3096 
       
  3097     VERIFY_SPANS_CONSISTENCY(&view);
  3070 }
  3098 }
  3071 
  3099 
  3072 void tst_QTableView::spansAfterColumnInsertion()
  3100 void tst_QTableView::spansAfterColumnInsertion()
  3073 {
  3101 {
  3074     QtTestTableModel model(10, 10);
  3102     QtTestTableModel model(10, 10);
  3099 
  3127 
  3100     // Insertion after the span does nothing to it.
  3128     // Insertion after the span does nothing to it.
  3101     view.model()->insertColumns(12, 2);
  3129     view.model()->insertColumns(12, 2);
  3102     QCOMPARE(view.rowSpan(3, 7), 3);
  3130     QCOMPARE(view.rowSpan(3, 7), 3);
  3103     QCOMPARE(view.columnSpan(3, 7), 5);
  3131     QCOMPARE(view.columnSpan(3, 7), 5);
       
  3132 
       
  3133     VERIFY_SPANS_CONSISTENCY(&view);
  3104 }
  3134 }
  3105 
  3135 
  3106 void tst_QTableView::spansAfterRowRemoval()
  3136 void tst_QTableView::spansAfterRowRemoval()
  3107 {
  3137 {
  3108     QtTestTableModel model(10, 10);
  3138     QtTestTableModel model(10, 10);
  3136           << QRect(6, 4, 1, 3);
  3166           << QRect(6, 4, 1, 3);
  3137     foreach (QRect span, expectedSpans) {
  3167     foreach (QRect span, expectedSpans) {
  3138         QCOMPARE(view.columnSpan(span.top(), span.left()), span.width());
  3168         QCOMPARE(view.columnSpan(span.top(), span.left()), span.width());
  3139         QCOMPARE(view.rowSpan(span.top(), span.left()), span.height());
  3169         QCOMPARE(view.rowSpan(span.top(), span.left()), span.height());
  3140     }
  3170     }
       
  3171 
       
  3172     VERIFY_SPANS_CONSISTENCY(&view);
  3141 }
  3173 }
  3142 
  3174 
  3143 void tst_QTableView::spansAfterColumnRemoval()
  3175 void tst_QTableView::spansAfterColumnRemoval()
  3144 {
  3176 {
  3145     QtTestTableModel model(10, 10);
  3177     QtTestTableModel model(10, 10);
  3174           << QRect(6, 4, 1, 3);
  3206           << QRect(6, 4, 1, 3);
  3175     foreach (QRect span, expectedSpans) {
  3207     foreach (QRect span, expectedSpans) {
  3176         QCOMPARE(view.columnSpan(span.left(), span.top()), span.height());
  3208         QCOMPARE(view.columnSpan(span.left(), span.top()), span.height());
  3177         QCOMPARE(view.rowSpan(span.left(), span.top()), span.width());
  3209         QCOMPARE(view.rowSpan(span.left(), span.top()), span.width());
  3178     }
  3210     }
       
  3211 
       
  3212     VERIFY_SPANS_CONSISTENCY(&view);
  3179 }
  3213 }
  3180 
  3214 
  3181 class Model : public QAbstractTableModel {
  3215 class Model : public QAbstractTableModel {
  3182 
  3216 
  3183 Q_OBJECT
  3217 Q_OBJECT
  3265     table3.resizeColumnsToContents();
  3299     table3.resizeColumnsToContents();
  3266     table3.resizeRowsToContents();
  3300     table3.resizeRowsToContents();
  3267 
  3301 
  3268     //now let's check the row/col sizes
  3302     //now let's check the row/col sizes
  3269     for(int i = 0;i<table.columnCount();i++) {
  3303     for(int i = 0;i<table.columnCount();i++) {
  3270         QVERIFY( table.columnWidth(i) == table2.columnWidth(i));
  3304         QCOMPARE( table.columnWidth(i), table2.columnWidth(i));
  3271         QVERIFY( table2.columnWidth(i) == table3.columnWidth(i));
  3305         QCOMPARE( table2.columnWidth(i), table3.columnWidth(i));
  3272     }
  3306     }
  3273     for(int i = 0;i<table.rowCount();i++) {
  3307     for(int i = 0;i<table.rowCount();i++) {
  3274         QVERIFY( table.rowHeight(i) == table2.rowHeight(i));
  3308         QCOMPARE( table.rowHeight(i), table2.rowHeight(i));
  3275         QVERIFY( table2.rowHeight(i) == table3.rowHeight(i));
  3309         QCOMPARE( table2.rowHeight(i), table3.rowHeight(i));
  3276     }
  3310     }
  3277 
  3311 
  3278 }
  3312 }
  3279 
  3313 
  3280 QT_BEGIN_NAMESPACE
  3314 QT_BEGIN_NAMESPACE
  3586             << int(QAbstractItemView::ScrollPerItem) << 120
  3620             << int(QAbstractItemView::ScrollPerItem) << 120
  3587             << 10 - qApp->wheelScrollLines() << 10 - qApp->wheelScrollLines();
  3621             << 10 - qApp->wheelScrollLines() << 10 - qApp->wheelScrollLines();
  3588     QTest::newRow("scroll down per item")
  3622     QTest::newRow("scroll down per item")
  3589             << int(QAbstractItemView::ScrollPerItem) << -120
  3623             << int(QAbstractItemView::ScrollPerItem) << -120
  3590             << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines();
  3624             << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines();
  3591 #ifdef Q_WS_MAC
       
  3592     // On Mac, we always scroll one pixel per 120 delta (rather than multiplying with
       
  3593     // singleStep) since wheel events are accelerated by the OS.
       
  3594     QTest::newRow("scroll down per pixel")
       
  3595             << int(QAbstractItemView::ScrollPerPixel) << -120
       
  3596             << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines();
       
  3597 #else
       
  3598     QTest::newRow("scroll down per pixel")
  3625     QTest::newRow("scroll down per pixel")
  3599             << int(QAbstractItemView::ScrollPerPixel) << -120
  3626             << int(QAbstractItemView::ScrollPerPixel) << -120
  3600             << 10 + qApp->wheelScrollLines() * 89 << 10 + qApp->wheelScrollLines() * 28;
  3627             << 10 + qApp->wheelScrollLines() * 89 << 10 + qApp->wheelScrollLines() * 28;
  3601 #endif
       
  3602 }
  3628 }
  3603 
  3629 
  3604 void tst_QTableView::mouseWheel()
  3630 void tst_QTableView::mouseWheel()
  3605 {
  3631 {
  3606 #ifdef Q_OS_WINCE
  3632 #ifdef Q_OS_WINCE
  3842     h->setSortIndicator(0, Qt::DescendingOrder);
  3868     h->setSortIndicator(0, Qt::DescendingOrder);
  3843     QApplication::processEvents();
  3869     QApplication::processEvents();
  3844     QCOMPARE(model.stringList() , sortedDataD);
  3870     QCOMPARE(model.stringList() , sortedDataD);
  3845 }
  3871 }
  3846 
  3872 
       
  3873 void tst_QTableView::taskQTBUG_5062_spansInconsistency()
       
  3874 {
       
  3875     const int nRows = 5;
       
  3876     const int nColumns = 5;
       
  3877 
       
  3878     QtTestTableModel model(nRows, nColumns);
       
  3879     QtTestTableView view;
       
  3880     view.setModel(&model);
       
  3881 
       
  3882     for (int i = 0; i < nRows; ++i)
       
  3883        view.setSpan(i, 0, 1, nColumns);
       
  3884     view.setSpan(2, 0, 1, 1);
       
  3885     view.setSpan(3, 0, 1, 1);
       
  3886 
       
  3887     VERIFY_SPANS_CONSISTENCY(&view);
       
  3888 }
       
  3889 
       
  3890 void tst_QTableView::taskQTBUG_4516_clickOnRichTextLabel()
       
  3891 {
       
  3892     QTableView view;
       
  3893     QStandardItemModel model(5,5);
       
  3894     view.setModel(&model);
       
  3895     QLabel label("rich text");
       
  3896     label.setTextFormat(Qt::RichText);
       
  3897     view.setIndexWidget(model.index(1,1), &label);
       
  3898     view.setCurrentIndex(model.index(0,0));
       
  3899     QCOMPARE(view.currentIndex(), model.index(0,0));
       
  3900 
       
  3901     QTest::mouseClick(&label, Qt::LeftButton);
       
  3902     QCOMPARE(view.currentIndex(), model.index(1,1));
       
  3903 
       
  3904 
       
  3905 }
       
  3906 
       
  3907 
       
  3908 void tst_QTableView::changeHeaderData()
       
  3909 {
       
  3910     QTableView view;
       
  3911     QStandardItemModel model(5,5);
       
  3912     view.setModel(&model);
       
  3913     view.show();
       
  3914     QTest::qWaitForWindowShown(&view);
       
  3915 
       
  3916     QString text = "long long long text";
       
  3917     const int textWidth = view.verticalHeader()->fontMetrics().width(text);
       
  3918     QVERIFY(view.verticalHeader()->width() < textWidth);
       
  3919 
       
  3920     model.setHeaderData(2, Qt::Vertical, text);
       
  3921     QTest::qWait(100); //leave time for layout
       
  3922 
       
  3923     QVERIFY(view.verticalHeader()->width() > textWidth);
       
  3924 }
       
  3925 
       
  3926 void tst_QTableView::taskQTBUG_5237_wheelEventOnHeader()
       
  3927 {
       
  3928     QTableView view;
       
  3929     QStandardItemModel model(500,5);
       
  3930     view.setModel(&model);
       
  3931     view.show();
       
  3932     QTest::qWaitForWindowShown(&view);
       
  3933 
       
  3934     int sbValueBefore = view.verticalScrollBar()->value();
       
  3935     QHeaderView *header = view.verticalHeader();
       
  3936     QTest::mouseMove(header);
       
  3937     QWheelEvent wheelEvent(header->geometry().center(), -720, 0, 0);
       
  3938     QApplication::sendEvent(header->viewport(), &wheelEvent);
       
  3939     int sbValueAfter = view.verticalScrollBar()->value();
       
  3940     QVERIFY(sbValueBefore != sbValueAfter);
       
  3941 }
       
  3942 
  3847 QTEST_MAIN(tst_QTableView)
  3943 QTEST_MAIN(tst_QTableView)
  3848 #include "tst_qtableview.moc"
  3944 #include "tst_qtableview.moc"