tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
child 37 758a864f9613
--- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -52,6 +52,11 @@
 #include <QtDeclarative/private/qdeclarativelistmodel_p.h>
 #include "../../../shared/util.h"
 
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
 class tst_QDeclarativeGridView : public QObject
 {
     Q_OBJECT
@@ -76,6 +81,7 @@
     void enforceRange();
     void QTBUG_8456();
     void manualHighlight();
+    void footer();
 
 private:
     QDeclarativeView *createView();
@@ -142,6 +148,14 @@
         emit dataChanged(index(idx,0), index(idx,0));
     }
 
+    void clear() {
+        int count = list.count();
+        emit beginRemoveRows(QModelIndex(), 0, count-1);
+        list.clear();
+        emit endRemoveRows();
+    }
+
+
 private:
     QList<QPair<QString,QString> > list;
 };
@@ -173,17 +187,17 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     QTRY_COMPARE(gridview->count(), model.count());
-    QTRY_COMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
 
     for (int i = 0; i < model.count(); ++i) {
-        QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", i);
+        QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", i);
         QTRY_VERIFY(name != 0);
         QTRY_COMPARE(name->text(), model.name(i));
-        QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", i);
+        QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
         QTRY_VERIFY(number != 0);
         QTRY_COMPARE(number->text(), model.number(i));
     }
@@ -192,7 +206,7 @@
     TestModel model2;
     ctxt->setContextProperty("testModel", &model2);
 
-    int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     QTRY_VERIFY(itemCount == 0);
 
     delete canvas;
@@ -221,14 +235,14 @@
     QDeclarativeFlickable *gridview = findItem<QDeclarativeFlickable>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     model.modifyItem(1, "Will", "9876");
-    QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
+    QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(1));
-    QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
+    QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(1));
 
@@ -254,17 +268,17 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     model.insertItem(1, "Will", "9876");
 
-    QTRY_COMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
 
-    QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
+    QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(1));
-    QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
+    QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(1));
 
@@ -274,19 +288,19 @@
 
     // Confirm items positioned correctly
     for (int i = 0; i < model.count(); ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         QTRY_COMPARE(item->x(), (i%3)*80.0);
         QTRY_COMPARE(item->y(), (i/3)*60.0);
     }
 
     model.insertItem(0, "Foo", "1111"); // zero index, and current item
 
-    QTRY_COMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
+    QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item
 
-    name = findItem<QDeclarativeText>(viewport, "textName", 0);
+    name = findItem<QDeclarativeText>(contentItem, "textName", 0);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(0));
-    number = findItem<QDeclarativeText>(viewport, "textNumber", 0);
+    number = findItem<QDeclarativeText>(contentItem, "textNumber", 0);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(0));
 
@@ -294,7 +308,7 @@
 
     // Confirm items positioned correctly
     for (int i = 0; i < model.count(); ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         QTRY_VERIFY(item->x() == (i%3)*80);
         QTRY_VERIFY(item->y() == (i/3)*60);
     }
@@ -330,15 +344,15 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     model.removeItem(1);
 
-    QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
+    QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(1));
-    QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
+    QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(1));
 
@@ -347,9 +361,9 @@
     QTRY_COMPARE(removed, QString("Item1"));
 
     // Confirm items positioned correctly
-    int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_VERIFY(item->x() == (i%3)*80);
@@ -359,17 +373,17 @@
     // Remove first item (which is the current item);
     model.removeItem(0);
 
-    name = findItem<QDeclarativeText>(viewport, "textName", 0);
+    name = findItem<QDeclarativeText>(contentItem, "textName", 0);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(0));
-    number = findItem<QDeclarativeText>(viewport, "textNumber", 0);
+    number = findItem<QDeclarativeText>(contentItem, "textNumber", 0);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(0));
 
     // Confirm items positioned correctly
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_VERIFY(item->x() == (i%3)*80);
@@ -380,9 +394,9 @@
     model.removeItem(25);
 
     // Confirm items positioned correctly
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_VERIFY(item->x() == (i%3)*80);
@@ -400,7 +414,7 @@
 
     // Confirm items positioned correctly
     for (int i = 6; i < 18; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_VERIFY(item->x() == (i%3)*80);
@@ -419,9 +433,9 @@
     QTest::qWait(100);
 
     // Confirm items positioned correctly
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_VERIFY(item->x() == (i%3)*80);
@@ -473,29 +487,29 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     model.moveItem(1, 8);
 
-    QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 1);
+    QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 1);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(1));
-    QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 1);
+    QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 1);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(1));
 
-    name = findItem<QDeclarativeText>(viewport, "textName", 8);
+    name = findItem<QDeclarativeText>(contentItem, "textName", 8);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(8));
-    number = findItem<QDeclarativeText>(viewport, "textNumber", 8);
+    number = findItem<QDeclarativeText>(contentItem, "textNumber", 8);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(8));
 
     // Confirm items positioned correctly
-    int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_VERIFY(item->x() == (i%3)*80);
@@ -508,17 +522,17 @@
     model.moveItem(1, 25);
 
     // Confirm items positioned correctly and indexes correct
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count()-1;
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count()-1;
     for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), qreal((i%3)*80));
         QTRY_COMPARE(item->y(), qreal((i/3)*60));
-        name = findItem<QDeclarativeText>(viewport, "textName", i);
+        name = findItem<QDeclarativeText>(contentItem, "textName", i);
         QTRY_VERIFY(name != 0);
         QTRY_COMPARE(name->text(), model.name(i));
-        number = findItem<QDeclarativeText>(viewport, "textNumber", i);
+        number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
         QTRY_VERIFY(number != 0);
         QTRY_COMPARE(number->text(), model.number(i));
     }
@@ -528,15 +542,15 @@
 
     // Confirm items positioned correctly and indexes correct
     for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_VERIFY(item->x() == (i%3)*80);
         QTRY_VERIFY(item->y() == (i/3)*60);
-        name = findItem<QDeclarativeText>(viewport, "textName", i);
+        name = findItem<QDeclarativeText>(contentItem, "textName", i);
         QTRY_VERIFY(name != 0);
         QTRY_COMPARE(name->text(), model.name(i));
-        number = findItem<QDeclarativeText>(viewport, "textNumber", i);
+        number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
         QTRY_VERIFY(number != 0);
         QTRY_COMPARE(number->text(), model.number(i));
     }
@@ -552,7 +566,7 @@
 void tst_QDeclarativeGridView::currentIndex()
 {
     TestModel model;
-    for (int i = 0; i < 30; i++)
+    for (int i = 0; i < 60; i++)
         model.addItem("Item" + QString::number(i), QString::number(i));
 
     QDeclarativeView *canvas = new QDeclarativeView(0);
@@ -567,57 +581,58 @@
     qApp->processEvents();
 
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
-    QTRY_VERIFY(gridview != 0);
+    QVERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QVERIFY(contentItem != 0);
 
     // current item should be third item
-    QTRY_COMPARE(gridview->currentIndex(), 5);
-    QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(viewport, "wrapper", 5));
-    QTRY_COMPARE(gridview->currentItem()->y(), gridview->highlightItem()->y());
+    QCOMPARE(gridview->currentIndex(), 35);
+    QCOMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 35));
+    QCOMPARE(gridview->currentItem()->y(), gridview->highlightItem()->y());
+    QCOMPARE(gridview->contentY(), 399.0);
 
     gridview->moveCurrentIndexRight();
-    QTRY_COMPARE(gridview->currentIndex(), 6);
+    QCOMPARE(gridview->currentIndex(), 36);
     gridview->moveCurrentIndexDown();
-    QTRY_COMPARE(gridview->currentIndex(), 9);
+    QCOMPARE(gridview->currentIndex(), 39);
     gridview->moveCurrentIndexUp();
-    QTRY_COMPARE(gridview->currentIndex(), 6);
+    QCOMPARE(gridview->currentIndex(), 36);
     gridview->moveCurrentIndexLeft();
-    QTRY_COMPARE(gridview->currentIndex(), 5);
+    QCOMPARE(gridview->currentIndex(), 35);
 
     // no wrap
     gridview->setCurrentIndex(0);
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
     gridview->moveCurrentIndexUp();
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
     gridview->moveCurrentIndexLeft();
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
     gridview->setCurrentIndex(model.count()-1);
-    QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
 
     gridview->moveCurrentIndexRight();
-    QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
 
     gridview->moveCurrentIndexDown();
-    QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
 
     // with wrap
     gridview->setWrapEnabled(true);
 
     gridview->setCurrentIndex(0);
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
     gridview->moveCurrentIndexLeft();
-    QTRY_COMPARE(gridview->currentIndex(), model.count()-1);
+    QCOMPARE(gridview->currentIndex(), model.count()-1);
 
-    QTRY_COMPARE(gridview->contentY(), 279.0);
+    QTRY_COMPARE(gridview->contentY(), 879.0);
 
     gridview->moveCurrentIndexRight();
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
     QTRY_COMPARE(gridview->contentY(), 0.0);
 
@@ -633,30 +648,30 @@
     qApp->processEvents();
 
     QTest::keyClick(canvas, Qt::Key_Down);
-    QTRY_COMPARE(gridview->currentIndex(), 3);
+    QCOMPARE(gridview->currentIndex(), 3);
 
     QTest::keyClick(canvas, Qt::Key_Up);
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
     gridview->setFlow(QDeclarativeGridView::TopToBottom);
 
     QTest::keyClick(canvas, Qt::Key_Right);
-    QTRY_COMPARE(gridview->currentIndex(), 5);
+    QCOMPARE(gridview->currentIndex(), 5);
 
     QTest::keyClick(canvas, Qt::Key_Left);
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
     QTest::keyClick(canvas, Qt::Key_Down);
-    QTRY_COMPARE(gridview->currentIndex(), 1);
+    QCOMPARE(gridview->currentIndex(), 1);
 
     QTest::keyClick(canvas, Qt::Key_Up);
-    QTRY_COMPARE(gridview->currentIndex(), 0);
+    QCOMPARE(gridview->currentIndex(), 0);
 
 
     // turn off auto highlight
     gridview->setHighlightFollowsCurrentItem(false);
-    QTRY_VERIFY(gridview->highlightFollowsCurrentItem() == false);
-    QTRY_VERIFY(gridview->highlightItem());
+    QVERIFY(gridview->highlightFollowsCurrentItem() == false);
+    QVERIFY(gridview->highlightItem());
     qreal hlPosX = gridview->highlightItem()->x();
     qreal hlPosY = gridview->highlightItem()->y();
 
@@ -690,21 +705,21 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     // Confirm items positioned correctly and indexes correct
-    int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), qreal((i%3)*80));
         QTRY_COMPARE(item->y(), qreal((i/3)*60));
-        QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", i);
+        QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", i);
         QTRY_VERIFY(name != 0);
         QTRY_COMPARE(name->text(), model.name(i));
-        QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", i);
+        QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
         QTRY_VERIFY(number != 0);
         QTRY_COMPARE(number->text(), model.number(i));
     }
@@ -712,17 +727,17 @@
     ctxt->setContextProperty("testTopToBottom", QVariant(true));
 
     // Confirm items positioned correctly and indexes correct
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), qreal((i/5)*80));
         QTRY_COMPARE(item->y(), qreal((i%5)*60));
-        QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", i);
+        QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", i);
         QTRY_VERIFY(name != 0);
         QTRY_COMPARE(name->text(), model.name(i));
-        QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", i);
+        QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", i);
         QTRY_VERIFY(number != 0);
         QTRY_COMPARE(number->text(), model.number(i));
     }
@@ -833,21 +848,34 @@
 
     QSignalSpy highlightSpy(gridView, SIGNAL(highlightChanged()));
     QSignalSpy delegateSpy(gridView, SIGNAL(delegateChanged()));
+    QSignalSpy headerSpy(gridView, SIGNAL(headerChanged()));
+    QSignalSpy footerSpy(gridView, SIGNAL(footerChanged()));
 
     gridView->setHighlight(&component);
     gridView->setDelegate(&delegateComponent);
+    gridView->setHeader(&component);
+    gridView->setFooter(&component);
 
     QTRY_COMPARE(gridView->highlight(), &component);
     QTRY_COMPARE(gridView->delegate(), &delegateComponent);
+    QTRY_COMPARE(gridView->header(), &component);
+    QTRY_COMPARE(gridView->footer(), &component);
 
     QTRY_COMPARE(highlightSpy.count(),1);
     QTRY_COMPARE(delegateSpy.count(),1);
+    QTRY_COMPARE(headerSpy.count(),1);
+    QTRY_COMPARE(footerSpy.count(),1);
 
     gridView->setHighlight(&component);
     gridView->setDelegate(&delegateComponent);
+    gridView->setHeader(&component);
+    gridView->setFooter(&component);
 
     QTRY_COMPARE(highlightSpy.count(),1);
     QTRY_COMPARE(delegateSpy.count(),1);
+    QTRY_COMPARE(headerSpy.count(),1);
+    QTRY_COMPARE(footerSpy.count(),1);
+
     delete canvas;
 }
 
@@ -895,13 +923,13 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     // Confirm items positioned correctly
-    int itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), (i%3)*80.);
@@ -913,9 +941,9 @@
     QTRY_COMPARE(gridview->contentY(), 60.);
 
     // Confirm items positioned correctly
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), (i%3)*80.);
@@ -927,9 +955,9 @@
     QTRY_COMPARE(gridview->contentY(), 420.);
 
     // Confirm items positioned correctly
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), (i%3)*80.);
@@ -941,9 +969,9 @@
     QTRY_COMPARE(gridview->contentY(), 520.);
 
     // Confirm items positioned correctly
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), (i%3)*80.);
@@ -955,9 +983,9 @@
     QTRY_COMPARE(gridview->contentY(), 0.);
 
     // Confirm items positioned correctly
-    itemCount = findItems<QDeclarativeItem>(viewport, "wrapper").count();
+    itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
     for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
-        QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", i);
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
         if (!item) qWarning() << "Item" << i << "not found";
         QTRY_VERIFY(item);
         QTRY_COMPARE(item->x(), (i%3)*80.);
@@ -1025,13 +1053,13 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     QTRY_COMPARE(gridview->count(), model.rowCount());
 
     for (int i = 0; i < model.rowCount(); ++i) {
-        QDeclarativeText *display = findItem<QDeclarativeText>(viewport, "displayText", i);
+        QDeclarativeText *display = findItem<QDeclarativeText>(contentItem, "displayText", i);
         QTRY_VERIFY(display != 0);
         QTRY_COMPARE(display->text(), strings.at(i));
     }
@@ -1043,7 +1071,7 @@
     QTRY_COMPARE(gridview->count(), model.rowCount());
 
     for (int i = 0; i < model.rowCount(); ++i) {
-        QDeclarativeText *display = findItem<QDeclarativeText>(viewport, "displayText", i);
+        QDeclarativeText *display = findItem<QDeclarativeText>(contentItem, "displayText", i);
         QTRY_VERIFY(display != 0);
         QTRY_COMPARE(display->text(), strings.at(i));
     }
@@ -1070,28 +1098,35 @@
     QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0);
     QTRY_COMPARE(gridview->highlightRangeMode(), QDeclarativeGridView::StrictlyEnforceRange);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     // view should be positioned at the top of the range.
-    QDeclarativeItem *item = findItem<QDeclarativeItem>(viewport, "wrapper", 0);
+    QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0);
     QTRY_VERIFY(item);
     QTRY_COMPARE(gridview->contentY(), -100.0);
 
-    QDeclarativeText *name = findItem<QDeclarativeText>(viewport, "textName", 0);
+    QDeclarativeText *name = findItem<QDeclarativeText>(contentItem, "textName", 0);
     QTRY_VERIFY(name != 0);
     QTRY_COMPARE(name->text(), model.name(0));
-    QDeclarativeText *number = findItem<QDeclarativeText>(viewport, "textNumber", 0);
+    QDeclarativeText *number = findItem<QDeclarativeText>(contentItem, "textNumber", 0);
     QTRY_VERIFY(number != 0);
     QTRY_COMPARE(number->text(), model.number(0));
 
-    // Check currentIndex is updated when viewport moves
+    // Check currentIndex is updated when contentItem moves
     gridview->setContentY(0);
     QTRY_COMPARE(gridview->currentIndex(), 2);
 
     gridview->setCurrentIndex(5);
     QTRY_COMPARE(gridview->contentY(), 100.);
 
+    TestModel model2;
+    for (int i = 0; i < 5; i++)
+        model2.addItem("Item" + QString::number(i), "");
+
+    ctxt->setContextProperty("testModel", &model2);
+    QCOMPARE(gridview->count(), 5);
+
     delete canvas;
 }
 
@@ -1120,22 +1155,54 @@
     QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
     QTRY_VERIFY(gridview != 0);
 
-    QDeclarativeItem *viewport = gridview->viewport();
-    QTRY_VERIFY(viewport != 0);
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
 
     QTRY_COMPARE(gridview->currentIndex(), 0);
-    QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(viewport, "wrapper", 0));
+    QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
     QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
     QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
 
     gridview->setCurrentIndex(2);
 
     QTRY_COMPARE(gridview->currentIndex(), 2);
-    QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(viewport, "wrapper", 2));
+    QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
     QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
     QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
 }
 
+void tst_QDeclarativeGridView::footer()
+{
+    QDeclarativeView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 7; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/footer.qml"));
+    qApp->processEvents();
+
+    QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QDeclarativeText *footer = findItem<QDeclarativeText>(contentItem, "footer");
+    QVERIFY(footer);
+
+    QCOMPARE(footer->y(), 180.0);
+
+    model.removeItem(2);
+    QTRY_COMPARE(footer->y(), 120.0);
+
+    model.clear();
+    QTRY_COMPARE(footer->y(), 0.0);
+}
+
 
 QDeclarativeView *tst_QDeclarativeGridView::createView()
 {