tests/auto/qdatawidgetmapper/tst_qdatawidgetmapper.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/auto/qdatawidgetmapper/tst_qdatawidgetmapper.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,410 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtGui/QtGui>
+#include <QtTest/QtTest>
+
+class tst_QDataWidgetMapper: public QObject
+{
+    Q_OBJECT
+private slots:
+    void setModel();
+    void navigate();
+    void addMapping();
+    void currentIndexChanged();
+    void changingValues();
+    void setData();
+    void mappedWidgetAt();
+
+    void comboBox();
+};
+
+static QStandardItemModel *testModel(QObject *parent = 0)
+{
+    QStandardItemModel *model = new QStandardItemModel(10, 10, parent);
+
+    for (int row = 0; row < 10; ++row) {
+        for (int col = 0; col < 10; ++col)
+            model->setData(model->index(row, col), QString("item %1 %2").arg(row).arg(col));
+    }
+
+    return model;
+}
+
+void tst_QDataWidgetMapper::setModel()
+{
+    QDataWidgetMapper mapper;
+
+    QCOMPARE(mapper.model(), (QAbstractItemModel *)0);
+
+    { // let the model go out of scope firstma
+        QStandardItemModel model;
+        mapper.setModel(&model);
+        QCOMPARE(mapper.model(), static_cast<QAbstractItemModel *>(&model));
+    }
+
+    QCOMPARE(mapper.model(), (QAbstractItemModel *)0);
+
+    { // let the mapper go out of scope first
+        QStandardItemModel model2;
+        QDataWidgetMapper mapper2;
+        mapper2.setModel(&model2);
+    }
+}
+
+void tst_QDataWidgetMapper::navigate()
+{
+    QDataWidgetMapper mapper;
+    QAbstractItemModel *model = testModel(&mapper);
+    mapper.setModel(model);
+
+    QLineEdit edit1;
+    QLineEdit edit2;
+    QLineEdit edit3;
+
+    mapper.addMapping(&edit1, 0);
+    mapper.toFirst();
+    mapper.addMapping(&edit2, 1);
+    mapper.addMapping(&edit3, 2);
+
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+    QVERIFY(edit2.text().isEmpty());
+    QVERIFY(edit3.text().isEmpty());
+    QVERIFY(mapper.submit());
+    edit2.setText(QString("item 0 1"));
+    edit3.setText(QString("item 0 2"));
+    QVERIFY(mapper.submit());
+
+    mapper.toFirst(); //this will repopulate
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+    QCOMPARE(edit2.text(), QString("item 0 1"));
+    QCOMPARE(edit3.text(), QString("item 0 2"));
+
+
+    mapper.toFirst();
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+    QCOMPARE(edit2.text(), QString("item 0 1"));
+    QCOMPARE(edit3.text(), QString("item 0 2"));
+
+    mapper.toPrevious(); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+    QCOMPARE(edit2.text(), QString("item 0 1"));
+    QCOMPARE(edit3.text(), QString("item 0 2"));
+
+    mapper.toNext();
+    QCOMPARE(edit1.text(), QString("item 1 0"));
+    QCOMPARE(edit2.text(), QString("item 1 1"));
+    QCOMPARE(edit3.text(), QString("item 1 2"));
+
+    mapper.toLast();
+    QCOMPARE(edit1.text(), QString("item 9 0"));
+    QCOMPARE(edit2.text(), QString("item 9 1"));
+    QCOMPARE(edit3.text(), QString("item 9 2"));
+
+    mapper.toNext(); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 9 0"));
+    QCOMPARE(edit2.text(), QString("item 9 1"));
+    QCOMPARE(edit3.text(), QString("item 9 2"));
+
+    mapper.setCurrentIndex(4);
+    QCOMPARE(edit1.text(), QString("item 4 0"));
+    QCOMPARE(edit2.text(), QString("item 4 1"));
+    QCOMPARE(edit3.text(), QString("item 4 2"));
+
+    mapper.setCurrentIndex(-1); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 4 0"));
+    QCOMPARE(edit2.text(), QString("item 4 1"));
+    QCOMPARE(edit3.text(), QString("item 4 2"));
+
+    mapper.setCurrentIndex(10); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 4 0"));
+    QCOMPARE(edit2.text(), QString("item 4 1"));
+    QCOMPARE(edit3.text(), QString("item 4 2"));
+
+    mapper.setCurrentModelIndex(QModelIndex()); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 4 0"));
+    QCOMPARE(edit2.text(), QString("item 4 1"));
+    QCOMPARE(edit3.text(), QString("item 4 2"));
+
+    mapper.setCurrentModelIndex(model->index(6, 0));
+    QCOMPARE(edit1.text(), QString("item 6 0"));
+    QCOMPARE(edit2.text(), QString("item 6 1"));
+    QCOMPARE(edit3.text(), QString("item 6 2"));
+
+    /* now try vertical navigation */
+
+    mapper.setOrientation(Qt::Vertical);
+
+    mapper.addMapping(&edit1, 0);
+    mapper.addMapping(&edit2, 1);
+    mapper.addMapping(&edit3, 2);
+
+    mapper.toFirst();
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+    QCOMPARE(edit2.text(), QString("item 1 0"));
+    QCOMPARE(edit3.text(), QString("item 2 0"));
+
+    mapper.toPrevious(); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+    QCOMPARE(edit2.text(), QString("item 1 0"));
+    QCOMPARE(edit3.text(), QString("item 2 0"));
+
+    mapper.toNext();
+    QCOMPARE(edit1.text(), QString("item 0 1"));
+    QCOMPARE(edit2.text(), QString("item 1 1"));
+    QCOMPARE(edit3.text(), QString("item 2 1"));
+
+    mapper.toLast();
+    QCOMPARE(edit1.text(), QString("item 0 9"));
+    QCOMPARE(edit2.text(), QString("item 1 9"));
+    QCOMPARE(edit3.text(), QString("item 2 9"));
+
+    mapper.toNext(); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 0 9"));
+    QCOMPARE(edit2.text(), QString("item 1 9"));
+    QCOMPARE(edit3.text(), QString("item 2 9"));
+
+    mapper.setCurrentIndex(4);
+    QCOMPARE(edit1.text(), QString("item 0 4"));
+    QCOMPARE(edit2.text(), QString("item 1 4"));
+    QCOMPARE(edit3.text(), QString("item 2 4"));
+
+    mapper.setCurrentIndex(-1); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 0 4"));
+    QCOMPARE(edit2.text(), QString("item 1 4"));
+    QCOMPARE(edit3.text(), QString("item 2 4"));
+
+    mapper.setCurrentIndex(10); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 0 4"));
+    QCOMPARE(edit2.text(), QString("item 1 4"));
+    QCOMPARE(edit3.text(), QString("item 2 4"));
+
+    mapper.setCurrentModelIndex(QModelIndex()); // should do nothing
+    QCOMPARE(edit1.text(), QString("item 0 4"));
+    QCOMPARE(edit2.text(), QString("item 1 4"));
+    QCOMPARE(edit3.text(), QString("item 2 4"));
+
+    mapper.setCurrentModelIndex(model->index(0, 6));
+    QCOMPARE(edit1.text(), QString("item 0 6"));
+    QCOMPARE(edit2.text(), QString("item 1 6"));
+    QCOMPARE(edit3.text(), QString("item 2 6"));
+}
+
+void tst_QDataWidgetMapper::addMapping()
+{
+    QDataWidgetMapper mapper;
+    QAbstractItemModel *model = testModel(&mapper);
+    mapper.setModel(model);
+
+    QLineEdit edit1;
+    mapper.addMapping(&edit1, 0);
+    mapper.toFirst();
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+
+    mapper.addMapping(&edit1, 1);
+    mapper.toFirst();
+    QCOMPARE(edit1.text(), QString("item 0 1"));
+
+    QCOMPARE(mapper.mappedSection(&edit1), 1);
+
+    edit1.clear();
+    mapper.removeMapping(&edit1);
+    mapper.toFirst();
+    QCOMPARE(edit1.text(), QString());
+
+    {
+        QLineEdit edit2;
+        mapper.addMapping(&edit2, 2);
+        mapper.toFirst();
+        QCOMPARE(edit2.text(), QString("item 0 2"));
+    } // let the edit go out of scope
+
+    QCOMPARE(mapper.mappedWidgetAt(2), (QWidget *)0);
+    mapper.toLast();
+}
+
+void tst_QDataWidgetMapper::currentIndexChanged()
+{
+    QDataWidgetMapper mapper;
+    QAbstractItemModel *model = testModel(&mapper);
+    mapper.setModel(model);
+
+    QSignalSpy spy(&mapper, SIGNAL(currentIndexChanged(int)));
+
+    mapper.toFirst();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.takeFirst().at(0).toInt(), 0);
+
+    mapper.toNext();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.takeFirst().at(0).toInt(), 1);
+
+    mapper.setCurrentIndex(7);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.takeFirst().at(0).toInt(), 7);
+
+    mapper.setCurrentIndex(-1);
+    QCOMPARE(spy.count(), 0);
+
+    mapper.setCurrentIndex(42);
+    QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDataWidgetMapper::changingValues()
+{
+    QDataWidgetMapper mapper;
+    QAbstractItemModel *model = testModel(&mapper);
+    mapper.setModel(model);
+
+    QLineEdit edit1;
+    mapper.addMapping(&edit1, 0);
+    mapper.toFirst();
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+
+    QLineEdit edit2;
+    mapper.addMapping(&edit2, 0, "text");
+    mapper.toFirst();
+    QCOMPARE(edit2.text(), QString("item 0 0"));
+
+    model->setData(model->index(0, 0), QString("changed"));
+    QCOMPARE(edit1.text(), QString("changed"));
+    QCOMPARE(edit2.text(), QString("changed"));
+}
+
+void tst_QDataWidgetMapper::setData()
+{
+    QDataWidgetMapper mapper;
+    QAbstractItemModel *model = testModel(&mapper);
+    mapper.setModel(model);
+
+    QLineEdit edit1;
+    QLineEdit edit2;
+    QLineEdit edit3;
+
+    mapper.addMapping(&edit1, 0);
+    mapper.addMapping(&edit2, 1);
+    mapper.addMapping(&edit3, 0, "text");
+    mapper.toFirst();
+    QCOMPARE(edit1.text(), QString("item 0 0"));
+    QCOMPARE(edit2.text(), QString("item 0 1"));
+    QCOMPARE(edit3.text(), QString("item 0 0"));
+
+    edit1.setText("new text");
+
+    mapper.submit();
+    QCOMPARE(model->data(model->index(0, 0)).toString(), QString("new text"));
+
+    edit3.setText("more text");
+
+    mapper.submit();
+    QCOMPARE(model->data(model->index(0, 0)).toString(), QString("more text"));
+}
+
+void tst_QDataWidgetMapper::comboBox()
+{
+    QDataWidgetMapper mapper;
+    QAbstractItemModel *model = testModel(&mapper);
+    mapper.setModel(model);
+    mapper.setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
+
+    QComboBox readOnlyBox;
+    readOnlyBox.setEditable(false);
+    readOnlyBox.addItem("read only item 0");
+    readOnlyBox.addItem("read only item 1");
+    readOnlyBox.addItem("read only item 2");
+
+    QComboBox readWriteBox;
+    readWriteBox.setEditable(true);
+    readWriteBox.addItem("read write item 0");
+    readWriteBox.addItem("read write item 1");
+    readWriteBox.addItem("read write item 2");
+
+    // populat the combo boxes with data
+    mapper.addMapping(&readOnlyBox, 0, "currentIndex");
+    mapper.addMapping(&readWriteBox, 1, "currentText");
+    mapper.toFirst();
+
+    QCOMPARE(readOnlyBox.currentText(), QString("read only item 0"));
+    QCOMPARE(readWriteBox.currentText(), QString("read write item 0"));
+
+    // set some new values on the boxes
+    readOnlyBox.setCurrentIndex(1);
+    readWriteBox.setEditText("read write item y");
+
+    mapper.submit();
+
+    // make sure the new values are in the model
+    QCOMPARE(model->data(model->index(0, 0)).toInt(), 1);
+    QCOMPARE(model->data(model->index(0, 1)).toString(), QString("read write item y"));
+
+    // now test updating of the widgets
+    model->setData(model->index(0, 0), 2, Qt::EditRole);
+    model->setData(model->index(0, 1), QString("read write item z"), Qt::EditRole);
+
+    QCOMPARE(readOnlyBox.currentIndex(), 2);
+    QEXPECT_FAIL("", "See tasks 125493 and 147153", Abort);
+    QCOMPARE(readWriteBox.currentText(), QString("read write item z"));
+}
+
+void tst_QDataWidgetMapper::mappedWidgetAt()
+{
+    QDataWidgetMapper mapper;
+    QAbstractItemModel *model = testModel(&mapper);
+    mapper.setModel(model);
+
+    QLineEdit lineEdit1;
+    QLineEdit lineEdit2;
+
+    QCOMPARE(mapper.mappedWidgetAt(432312), (QWidget*)0);
+
+    mapper.addMapping(&lineEdit1, 1);
+    mapper.addMapping(&lineEdit2, 2);
+
+    QCOMPARE(mapper.mappedWidgetAt(1), static_cast<QWidget *>(&lineEdit1));
+    QCOMPARE(mapper.mappedWidgetAt(2), static_cast<QWidget *>(&lineEdit2));
+
+    mapper.addMapping(&lineEdit2, 4242);
+
+    QCOMPARE(mapper.mappedWidgetAt(2), (QWidget*)0);
+    QCOMPARE(mapper.mappedWidgetAt(4242), static_cast<QWidget *>(&lineEdit2));
+}
+
+QTEST_MAIN(tst_QDataWidgetMapper)
+#include "tst_qdatawidgetmapper.moc"