summaryrefslogtreecommitdiffstats
path: root/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp')
-rw-r--r--tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp1377
1 files changed, 0 insertions, 1377 deletions
diff --git a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
deleted file mode 100644
index 96a1f1caa5..0000000000
--- a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
+++ /dev/null
@@ -1,1377 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 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$
-** GNU Lesser General Public License Usage
-** 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.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include <QtTest/QtTest>
-#include "../qsqldatabase/tst_databases.h"
-#include <QtSql>
-
-const QString test(qTableName("test", __FILE__)),
- test2(qTableName("test2", __FILE__)),
- test3(qTableName("test3", __FILE__));
-
-//TESTED_CLASS=
-//TESTED_FILES=
-
-Q_DECLARE_METATYPE(QModelIndex)
-
-class tst_QSqlTableModel : public QObject
-{
- Q_OBJECT
-
-public:
- tst_QSqlTableModel();
- virtual ~tst_QSqlTableModel();
-
-
- void dropTestTables();
- void createTestTables();
- void recreateTestTables();
- void repopulateTestTables();
-
- tst_Databases dbs;
-
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-private slots:
-
- void select_data() { generic_data(); }
- void select();
- void insertColumns_data() { generic_data_with_strategies(); }
- void insertColumns();
- void submitAll_data() { generic_data(); }
- void submitAll();
- void setRecord_data() { generic_data(); }
- void setRecord();
- void insertRow_data() { generic_data_with_strategies(); }
- void insertRow();
- void insertRecord_data() { generic_data(); }
- void insertRecord();
- void insertMultiRecords_data() { generic_data(); }
- void insertMultiRecords();
- void removeRow_data() { generic_data(); }
- void removeRow();
- void removeRows_data() { generic_data(); }
- void removeRows();
- void removeInsertedRow_data() { generic_data_with_strategies(); }
- void removeInsertedRow();
- void removeInsertedRows_data() { generic_data(); }
- void removeInsertedRows();
- void setFilter_data() { generic_data(); }
- void setFilter();
- void setInvalidFilter_data() { generic_data(); }
- void setInvalidFilter();
-
- void emptyTable_data() { generic_data(); }
- void emptyTable();
- void tablesAndSchemas_data() { generic_data("QPSQL"); }
- void tablesAndSchemas();
- void whitespaceInIdentifiers_data() { generic_data(); }
- void whitespaceInIdentifiers();
- void primaryKeyOrder_data() { generic_data("QSQLITE"); }
- void primaryKeyOrder();
-
- void sqlite_bigTable_data() { generic_data("QSQLITE"); }
- void sqlite_bigTable();
-
- // bug specific tests
- void insertRecordBeforeSelect_data() { generic_data(); }
- void insertRecordBeforeSelect();
- void submitAllOnInvalidTable_data() { generic_data(); }
- void submitAllOnInvalidTable();
- void insertRecordsInLoop_data() { generic_data(); }
- void insertRecordsInLoop();
- void sqlite_attachedDatabase_data() { generic_data("QSQLITE"); }
- void sqlite_attachedDatabase(); // For task 130799
- void tableModifyWithBlank_data() { generic_data(); }
- void tableModifyWithBlank(); // For mail task
-
- void removeColumnAndRow_data() { generic_data(); }
- void removeColumnAndRow(); // task 256032
-
- void insertBeforeDelete_data() { generic_data(); }
- void insertBeforeDelete();
-private:
- void generic_data(const QString& engine=QString());
- void generic_data_with_strategies(const QString& engine=QString());
-};
-
-tst_QSqlTableModel::tst_QSqlTableModel()
-{
- qRegisterMetaType<QModelIndex>("QModelIndex");
- dbs.open();
-}
-
-tst_QSqlTableModel::~tst_QSqlTableModel()
-{
-}
-
-void tst_QSqlTableModel::dropTestTables()
-{
- for (int i = 0; i < dbs.dbNames.count(); ++i) {
- QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i));
- QSqlQuery q(db);
- if(tst_Databases::isPostgreSQL(db))
- QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
-
- QStringList tableNames;
- tableNames << test
- << test2
- << test3
- << qTableName("test4", __FILE__)
- << qTableName("emptytable", __FILE__)
- << qTableName("bigtable", __FILE__)
- << qTableName("foo", __FILE__);
- if (testWhiteSpaceNames(db.driverName()))
- tableNames << qTableName("qtestw hitespace", db.driver());
-
- tst_Databases::safeDropTables(db, tableNames);
-
- if (db.driverName().startsWith("QPSQL")) {
- q.exec("DROP SCHEMA " + qTableName("testschema", __FILE__) + " CASCADE");
- }
- }
-}
-
-void tst_QSqlTableModel::createTestTables()
-{
- for (int i = 0; i < dbs.dbNames.count(); ++i) {
- QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i));
- QSqlQuery q(db);
-
- QVERIFY_SQL( q, exec("create table " + test + "(id int, name varchar(20), title int)"));
-
- QVERIFY_SQL( q, exec("create table " + test2 + "(id int, title varchar(20))"));
-
- QVERIFY_SQL( q, exec("create table " + test3 + "(id int, random varchar(20), randomtwo varchar(20))"));
-
- if(!tst_Databases::isSqlServer(db))
- QVERIFY_SQL( q, exec("create table " + qTableName("test4", __FILE__) + "(column1 varchar(50), column2 varchar(50), column3 varchar(50))"));
- else
- QVERIFY_SQL( q, exec("create table " + qTableName("test4", __FILE__) + "(column1 varchar(50), column2 varchar(50) NULL, column3 varchar(50))"));
-
-
- QVERIFY_SQL( q, exec("create table " + qTableName("emptytable", __FILE__) + "(id int)"));
-
- if (testWhiteSpaceNames(db.driverName())) {
- QString qry = "create table " + qTableName("qtestw hitespace", db.driver()) + " ("+ db.driver()->escapeIdentifier("a field", QSqlDriver::FieldName) + " int)";
- QVERIFY_SQL( q, exec(qry));
- }
- }
-}
-
-void tst_QSqlTableModel::repopulateTestTables()
-{
- for (int i = 0; i < dbs.dbNames.count(); ++i) {
- QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i));
- QSqlQuery q(db);
-
- q.exec("delete from " + test);
- QVERIFY_SQL( q, exec("insert into " + test + " values(1, 'harry', 1)"));
- QVERIFY_SQL( q, exec("insert into " + test + " values(2, 'trond', 2)"));
- QVERIFY_SQL( q, exec("insert into " + test + " values(3, 'vohi', 3)"));
-
- q.exec("delete from " + test2);
- QVERIFY_SQL( q, exec("insert into " + test2 + " values(1, 'herr')"));
- QVERIFY_SQL( q, exec("insert into " + test2 + " values(2, 'mister')"));
-
- q.exec("delete from " + test3);
- QVERIFY_SQL( q, exec("insert into " + test3 + " values(1, 'foo', 'bar')"));
- QVERIFY_SQL( q, exec("insert into " + test3 + " values(2, 'baz', 'joe')"));
- }
-}
-
-void tst_QSqlTableModel::recreateTestTables()
-{
- dropTestTables();
- createTestTables();
- repopulateTestTables();
-}
-
-void tst_QSqlTableModel::generic_data(const QString &engine)
-{
- if ( dbs.fillTestTable(engine) == 0 ) {
- if (engine.isEmpty())
- QSKIP( "No database drivers are available in this Qt configuration", SkipAll );
- else
- QSKIP( (QString("No database drivers of type %1 are available in this Qt configuration").arg(engine)).toLocal8Bit(), SkipAll );
- }
-}
-
-void tst_QSqlTableModel::generic_data_with_strategies(const QString &engine)
-{
- if ( dbs.fillTestTableWithStrategies(engine) == 0 ) {
- if (engine.isEmpty())
- QSKIP( "No database drivers are available in this Qt configuration", SkipAll );
- else
- QSKIP( (QString("No database drivers of type %1 are available in this Qt configuration").arg(engine)).toLocal8Bit(), SkipAll );
- }
-}
-
-void tst_QSqlTableModel::initTestCase()
-{
- recreateTestTables();
-}
-
-void tst_QSqlTableModel::cleanupTestCase()
-{
- dropTestTables();
- dbs.close();
-}
-
-void tst_QSqlTableModel::init()
-{
-}
-
-void tst_QSqlTableModel::cleanup()
-{
- repopulateTestTables();
-}
-
-void tst_QSqlTableModel::select()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- QVERIFY_SQL(model, select());
-
- QCOMPARE(model.rowCount(), 3);
- QCOMPARE(model.columnCount(), 3);
-
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 3)), QVariant());
-
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 3)), QVariant());
-
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 3)), QVariant());
-
- QCOMPARE(model.data(model.index(3, 0)), QVariant());
- QCOMPARE(model.data(model.index(3, 1)), QVariant());
- QCOMPARE(model.data(model.index(3, 2)), QVariant());
- QCOMPARE(model.data(model.index(3, 3)), QVariant());
-}
-
-void tst_QSqlTableModel::insertColumns()
-{
- // Just like the select test, with extra stuff
- QFETCH(QString, dbName);
- QFETCH(int, submitpolicy_i);
- QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i;
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- model.setEditStrategy(submitpolicy);
-
- QVERIFY_SQL(model, select());
-
- QCOMPARE(model.rowCount(), 3);
- QCOMPARE(model.columnCount(), 3);
-
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 3)), QVariant());
-
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 3)), QVariant());
-
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 3)), QVariant());
-
- QCOMPARE(model.data(model.index(3, 0)), QVariant());
- QCOMPARE(model.data(model.index(3, 1)), QVariant());
- QCOMPARE(model.data(model.index(3, 2)), QVariant());
- QCOMPARE(model.data(model.index(3, 3)), QVariant());
-
- // Now add a column at 0 and 2
- model.insertColumn(0);
- model.insertColumn(2);
-
- QCOMPARE(model.rowCount(), 3);
- QCOMPARE(model.columnCount(), 5);
-
- QCOMPARE(model.data(model.index(0, 0)), QVariant());
- QCOMPARE(model.data(model.index(0, 1)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 2)), QVariant());
- QCOMPARE(model.data(model.index(0, 3)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(0, 4)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 5)), QVariant());
-
- QCOMPARE(model.data(model.index(1, 0)), QVariant());
- QCOMPARE(model.data(model.index(1, 1)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 2)), QVariant());
- QCOMPARE(model.data(model.index(1, 3)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 4)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 5)), QVariant());
-
- QCOMPARE(model.data(model.index(2, 0)), QVariant());
- QCOMPARE(model.data(model.index(2, 1)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 2)), QVariant());
- QCOMPARE(model.data(model.index(2, 3)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(2, 4)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 5)), QVariant());
-
- QCOMPARE(model.data(model.index(3, 0)), QVariant());
- QCOMPARE(model.data(model.index(3, 1)), QVariant());
- QCOMPARE(model.data(model.index(3, 2)), QVariant());
- QCOMPARE(model.data(model.index(3, 3)), QVariant());
- QCOMPARE(model.data(model.index(3, 4)), QVariant());
- QCOMPARE(model.data(model.index(3, 5)), QVariant());
-}
-
-void tst_QSqlTableModel::setRecord()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QList<QSqlTableModel::EditStrategy> policies = QList<QSqlTableModel::EditStrategy>() << QSqlTableModel::OnFieldChange << QSqlTableModel::OnRowChange << QSqlTableModel::OnManualSubmit;
-
- QString Xsuffix;
- foreach( QSqlTableModel::EditStrategy submitpolicy, policies) {
-
- QSqlTableModel model(0, db);
- model.setEditStrategy((QSqlTableModel::EditStrategy)submitpolicy);
- model.setTable(test3);
- model.setSort(0, Qt::AscendingOrder);
- QVERIFY_SQL(model, select());
-
- for (int i = 0; i < model.rowCount(); ++i) {
- QSignalSpy spy(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)));
-
- QSqlRecord rec = model.record(i);
- rec.setValue(1, rec.value(1).toString() + 'X');
- rec.setValue(2, rec.value(2).toString() + 'X');
- QVERIFY(model.setRecord(i, rec));
-
- if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnManualSubmit) {
- // setRecord should emit dataChanged() itself for manualSubmit
- QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.at(0).count(), 2);
- QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(0)), model.index(i, 0));
- QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(1)), model.index(i, rec.count() - 1));
- QVERIFY(model.submitAll());
- } else if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnRowChange && i == model.rowCount() -1)
- model.submit();
- else {
- // dataChanged() is not emitted when submitAll() is called
- QCOMPARE(spy.count(), 2);
- QCOMPARE(spy.at(0).count(), 2);
- QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(0)), model.index(i, 1));
- QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(1)), model.index(i, 1));
- }
- }
-
- Xsuffix.append('X');
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("foo").append(Xsuffix));
- QCOMPARE(model.data(model.index(0, 2)).toString(), QString("bar").append(Xsuffix));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("baz").append(Xsuffix));
- QCOMPARE(model.data(model.index(1, 2)).toString(), QString("joe").append(Xsuffix));
- }
-}
-
-void tst_QSqlTableModel::insertRow()
-{
- QFETCH(QString, dbName);
- QFETCH(int, submitpolicy_i);
- QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i;
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setEditStrategy(submitpolicy);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- QVERIFY_SQL(model, select());
-
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
-
- QVERIFY(model.insertRow(2));
-
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 0);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 0);
- QCOMPARE(model.data(model.index(3, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(3, 2)).toInt(), 3);
-
- QSqlRecord rec = model.record(1);
- rec.setValue(0, 42);
- rec.setValue(1, QString("francis"));
-
- // FieldChange updates immediately and resorts
- // Row/Manual submit does not resort
- QVERIFY(model.setRecord(2, rec));
-
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
-
- // See comment above setRecord
- if (submitpolicy == QSqlTableModel::OnFieldChange) {
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
- QCOMPARE(model.data(model.index(3, 0)).toInt(), 42);
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("francis"));
- QCOMPARE(model.data(model.index(3, 2)).toInt(), 2);
- } else {
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 42);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("francis"));
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 2);
- QCOMPARE(model.data(model.index(3, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(3, 2)).toInt(), 3);
- }
-
- QVERIFY(model.submitAll());
-
- // After the submit we should have the resorted view
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
- QCOMPARE(model.data(model.index(3, 0)).toInt(), 42);
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("francis"));
- QCOMPARE(model.data(model.index(3, 2)).toInt(), 2);
-
-}
-
-void tst_QSqlTableModel::insertRecord()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- QVERIFY_SQL(model, select());
-
- QSqlRecord rec = model.record();
- rec.setValue(0, 42);
- rec.setValue(1, QString("vohi"));
- rec.setValue(2, 1);
- QVERIFY(model.insertRecord(1, rec));
- QCOMPARE(model.rowCount(), 4);
-
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 42);
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(1, 2)).toInt(), 1);
-
- model.revertAll();
- model.setEditStrategy(QSqlTableModel::OnRowChange);
-
- QVERIFY(model.insertRecord(-1, rec));
-
- QCOMPARE(model.data(model.index(3, 0)).toInt(), 42);
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(3, 2)).toInt(), 1);
-}
-
-void tst_QSqlTableModel::insertMultiRecords()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- QVERIFY_SQL(model, select());
-
- QCOMPARE(model.rowCount(), 3);
-
- QVERIFY(model.insertRow(2));
-
- QCOMPARE(model.data(model.index(2, 0)), QVariant(model.record().field(0).type()));
- QCOMPARE(model.data(model.index(2, 1)), QVariant(model.record().field(1).type()));
- QCOMPARE(model.data(model.index(2, 2)), QVariant(model.record().field(2).type()));
-
- QVERIFY(model.insertRow(3));
- QVERIFY(model.insertRow(0));
-
- QCOMPARE(model.data(model.index(5, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(5, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(5, 2)).toInt(), 3);
-
- QVERIFY(model.setData(model.index(0, 0), QVariant(42)));
- QVERIFY(model.setData(model.index(3, 0), QVariant(43)));
- QVERIFY(model.setData(model.index(4, 0), QVariant(44)));
- QVERIFY(model.setData(model.index(4, 1), QVariant(QLatin1String("gunnar"))));
- QVERIFY(model.setData(model.index(4, 2), QVariant(1)));
-
- QVERIFY(model.submitAll());
- model.clear();
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- QVERIFY_SQL(model, select());
-
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
- QCOMPARE(model.data(model.index(3, 0)).toInt(), 42);
- QCOMPARE(model.data(model.index(4, 0)).toInt(), 43);
- QCOMPARE(model.data(model.index(5, 0)).toInt(), 44);
- QCOMPARE(model.data(model.index(5, 1)).toString(), QString("gunnar"));
- QCOMPARE(model.data(model.index(5, 2)).toInt(), 1);
-}
-
-void tst_QSqlTableModel::submitAll()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- QVERIFY_SQL(model, select());
-
- QVERIFY(model.setData(model.index(0, 1), "harry2", Qt::EditRole));
- QVERIFY(model.setData(model.index(1, 1), "trond2", Qt::EditRole));
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond2"));
-
- QVERIFY_SQL(model, submitAll());
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond2"));
-
- QVERIFY(model.setData(model.index(0, 1), "harry", Qt::EditRole));
- QVERIFY(model.setData(model.index(1, 1), "trond", Qt::EditRole));
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
-
- QVERIFY_SQL(model, submitAll());
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
-}
-
-void tst_QSqlTableModel::removeRow()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
-
- // headerDataChanged must be emitted by the model when the edit strategy is OnManualSubmit,
- // when OnFieldChange or OnRowChange it's not needed because the model will re-select.
- qRegisterMetaType<Qt::Orientation>("Qt::Orientation");
- QSignalSpy headerDataChangedSpy(&model, SIGNAL(headerDataChanged(Qt::Orientation, int, int)));
-
- QVERIFY(model.removeRow(1));
- QCOMPARE(headerDataChangedSpy.count(), 1);
- QCOMPARE(*static_cast<const Qt::Orientation *>(headerDataChangedSpy.at(0).value(0).constData()), Qt::Vertical);
- QCOMPARE(headerDataChangedSpy.at(0).at(1).toInt(), 1);
- QCOMPARE(headerDataChangedSpy.at(0).at(2).toInt(), 1);
- QVERIFY(model.submitAll());
- QCOMPARE(model.rowCount(), 2);
-
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
- QCOMPARE(model.data(model.index(1, 0)).toInt(), 3);
- model.clear();
-
- recreateTestTables();
-
- model.setTable(test);
- model.setEditStrategy(QSqlTableModel::OnRowChange);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
-
- headerDataChangedSpy.clear();
- QVERIFY(model.removeRow(1));
- QCOMPARE(headerDataChangedSpy.count(), 0);
- QCOMPARE(model.rowCount(), 2);
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
-}
-
-void tst_QSqlTableModel::removeRows()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- model.setEditStrategy(QSqlTableModel::OnFieldChange);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
-
- QSignalSpy beforeDeleteSpy(&model, SIGNAL(beforeDelete(int)));
-
- // Make sure wrong stuff is ok
- QVERIFY(!model.removeRows(-1,1)); // negative start
- QVERIFY(!model.removeRows(-1, 0)); // negative start, and zero count
- QVERIFY(!model.removeRows(1, 0)); // zero count
- QVERIFY(!model.removeRows(5, 1)); // past end (causes a beforeDelete to be emitted)
- QVERIFY(!model.removeRows(1, 0, model.index(2, 0))); // can't pass a valid modelindex
-
- QVERIFY_SQL(model, removeRows(0, 2));
- QCOMPARE(beforeDeleteSpy.count(), 3);
- QVERIFY(beforeDeleteSpy.at(0).at(0).toInt() == 5);
- QVERIFY(beforeDeleteSpy.at(1).at(0).toInt() == 0);
- QVERIFY(beforeDeleteSpy.at(2).at(0).toInt() == 1);
- QCOMPARE(model.rowCount(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("vohi"));
- model.clear();
-
- recreateTestTables();
- model.setTable(test);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
- beforeDeleteSpy.clear();
-
- // When the edit strategy is OnManualSubmit the beforeDelete() signal
- // isn't emitted until submitAll() is called.
-
- QVERIFY(!model.removeRows(-1,1)); // negative start
- QVERIFY(!model.removeRows(-1, 0)); // negative start, and zero count
- QVERIFY(!model.removeRows(1, 0)); // zero count
- QVERIFY(!model.removeRows(5, 1)); // past end (DOESN'T cause a beforeDelete to be emitted)
- QVERIFY(!model.removeRows(1, 0, model.index(2, 0))); // can't pass a valid modelindex
-
- qRegisterMetaType<Qt::Orientation>("Qt::Orientation");
- QSignalSpy headerDataChangedSpy(&model, SIGNAL(headerDataChanged(Qt::Orientation, int, int)));
- QVERIFY(model.removeRows(0, 2, QModelIndex()));
- QCOMPARE(headerDataChangedSpy.count(), 2);
- QCOMPARE(headerDataChangedSpy.at(0).at(1).toInt(), 0);
- QCOMPARE(headerDataChangedSpy.at(0).at(2).toInt(), 0);
- QCOMPARE(headerDataChangedSpy.at(1).at(1).toInt(), 1);
- QCOMPARE(headerDataChangedSpy.at(1).at(2).toInt(), 1);
- QCOMPARE(model.rowCount(), 3);
- QVERIFY(beforeDeleteSpy.count() == 0);
- QVERIFY(model.submitAll());
- QVERIFY(beforeDeleteSpy.count() == 2);
- QVERIFY(beforeDeleteSpy.at(0).at(0).toInt() == 0);
- QVERIFY(beforeDeleteSpy.at(1).at(0).toInt() == 1);
- QCOMPARE(model.rowCount(), 1);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("vohi"));
-}
-
-void tst_QSqlTableModel::removeInsertedRow()
-{
- QFETCH(QString, dbName);
- QFETCH(int, submitpolicy_i);
- QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i;
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
-
- model.setEditStrategy(submitpolicy);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
-
- QVERIFY(model.insertRow(1));
- QCOMPARE(model.rowCount(), 4);
-
- QVERIFY(model.removeRow(1));
- QCOMPARE(model.rowCount(), 3);
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
-
- // Now insert a row with a null, and check that removing it also works (QTBUG-15979 etc)
- model.insertRow(1);
- model.setData(model.index(1,0), 55);
- model.setData(model.index(1,1), QString("null columns"));
- model.setData(model.index(1,2), QVariant());
-
- model.submitAll();
-
- QCOMPARE(model.rowCount(), 4);
- QCOMPARE(model.data(model.index(3, 0)).toInt(), 55);
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("null columns"));
- QCOMPARE(model.data(model.index(3, 2)).isNull(), true);
-
- QVERIFY(model.removeRow(3));
- model.submitAll();
- QCOMPARE(model.rowCount(), 3);
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
-}
-
-void tst_QSqlTableModel::removeInsertedRows()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit); // you can't insert more than one row otherwise
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
-
- // First put two empty rows, and remove them one by one
- QVERIFY(model.insertRows(1, 2));
- QCOMPARE(model.rowCount(), 5);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
-
- QVERIFY(model.removeRow(1));
- QCOMPARE(model.rowCount(), 4);
-
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
-
- QVERIFY(model.removeRow(1));
- QCOMPARE(model.rowCount(), 3);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
-
- // Now put two empty rows, and remove them all at once
- QVERIFY(model.insertRows(1, 2));
- QCOMPARE(model.rowCount(), 5);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
-
- QVERIFY(model.removeRows(1, 2));
- QCOMPARE(model.rowCount(), 3);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
-
-
- // Now put two empty rows, and remove one good and two empty
- QVERIFY(model.insertRows(1, 2));
- QCOMPARE(model.rowCount(), 5);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
-
- QVERIFY(model.removeRows(0, 3));
- QVERIFY(model.submitAll()); // otherwise the remove of the real row doesn't work
-
- QCOMPARE(model.rowCount(), 2);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
-
- // Reset back again
- model.clear();
- recreateTestTables();
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit); // you can't insert more than one row otherwise
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
-
- // Now two empty and one good
- QVERIFY(model.insertRows(1, 2));
- QCOMPARE(model.rowCount(), 5);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
-
- QVERIFY(model.removeRows(1, 3));
- QVERIFY(model.submitAll());
- QCOMPARE(model.rowCount(), 2);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
-
- // Reset back again
- model.clear();
- recreateTestTables();
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit); // you can't insert more than one row otherwise
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
-
- // one empty, one good, one empty
- QVERIFY(model.insertRows(1, 1));
- QVERIFY(model.insertRows(3, 1));
- QCOMPARE(model.rowCount(), 5);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(3, 1)).toString(), QString());
- QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
-
- QVERIFY(model.removeRows(1, 3));
- QVERIFY(model.submitAll());
- QCOMPARE(model.rowCount(), 2);
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
-}
-
-void tst_QSqlTableModel::emptyTable()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- QCOMPARE(model.rowCount(), 0);
- QCOMPARE(model.columnCount(), 0);
-
- model.setTable(qTableName("emptytable", __FILE__));
- QCOMPARE(model.rowCount(), 0);
- QCOMPARE(model.columnCount(), 1);
-
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 0);
- QCOMPARE(model.columnCount(), 1);
-}
-
-void tst_QSqlTableModel::tablesAndSchemas()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlQuery q(db);
- q.exec("DROP SCHEMA " + qTableName("testschema", __FILE__) + " CASCADE");
- QVERIFY_SQL( q, exec("create schema " + qTableName("testschema", __FILE__)));
- QString tableName = qTableName("testschema", __FILE__) + '.' + qTableName("testtable", __FILE__);
- QVERIFY_SQL( q, exec("create table " + tableName + "(id int)"));
- QVERIFY_SQL( q, exec("insert into " + tableName + " values(1)"));
- QVERIFY_SQL( q, exec("insert into " + tableName + " values(2)"));
-
- QSqlTableModel model(0, db);
- model.setTable(tableName);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 2);
- QCOMPARE(model.columnCount(), 1);
-}
-
-void tst_QSqlTableModel::whitespaceInIdentifiers()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- if (!testWhiteSpaceNames(db.driverName()))
- QSKIP("DBMS doesn't support whitespaces in identifiers", SkipSingle);
-
- QString tableName = qTableName("qtestw hitespace", db.driver());
-
- QSqlTableModel model(0, db);
- model.setTable(tableName);
- QVERIFY_SQL(model, select());
-}
-
-void tst_QSqlTableModel::primaryKeyOrder()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlQuery q(db);
-
- if(tst_Databases::isPostgreSQL(db))
- QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
-
- QVERIFY_SQL( q, exec("create table "+qTableName("foo", __FILE__)+"(a varchar(20), id int not null primary key, b varchar(20))"));
-
- QSqlTableModel model(0, db);
- model.setTable(qTableName("foo", __FILE__));
-
- QSqlIndex pk = model.primaryKey();
- QCOMPARE(pk.count(), 1);
- QCOMPARE(pk.fieldName(0), QLatin1String("id"));
-
- QVERIFY(model.insertRow(0));
- QVERIFY(model.setData(model.index(0, 0), "hello"));
- QVERIFY(model.setData(model.index(0, 1), 42));
- QVERIFY(model.setData(model.index(0, 2), "blah"));
- QVERIFY_SQL(model, submitAll());
-
- QVERIFY(model.setData(model.index(0, 1), 43));
- QVERIFY_SQL(model, submitAll());
-
- QCOMPARE(model.data(model.index(0, 1)).toInt(), 43);
-}
-
-void tst_QSqlTableModel::setInvalidFilter()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- // set an invalid filter, make sure it fails
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setFilter("blahfahsel");
-
- QCOMPARE(model.filter(), QString("blahfahsel"));
- QVERIFY(!model.select());
-
- // set a valid filter later, make sure if passes
- model.setFilter("id = 1");
- QVERIFY_SQL(model, select());
-}
-
-void tst_QSqlTableModel::setFilter()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setFilter("id = 1");
- QCOMPARE(model.filter(), QString("id = 1"));
- QVERIFY_SQL(model, select());
-
- QCOMPARE(model.rowCount(), 1);
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
-
- QSignalSpy rowsRemovedSpy(&model, SIGNAL(rowsRemoved(QModelIndex,int,int)));
- QSignalSpy rowsAboutToBeRemovedSpy(&model,
- SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)));
- QSignalSpy rowsInsertedSpy(&model, SIGNAL(rowsInserted(QModelIndex,int,int)));
- QSignalSpy rowsAboutToBeInsertedSpy(&model,
- SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)));
- model.setFilter("id = 2");
-
- // check the signals
- QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
- QCOMPARE(rowsRemovedSpy.count(), 1);
- QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
- QCOMPARE(rowsInsertedSpy.count(), 1);
- QList<QVariant> args = rowsAboutToBeRemovedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
- args = rowsRemovedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
- args = rowsInsertedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
- args = rowsAboutToBeInsertedSpy.takeFirst();
- QCOMPARE(args.count(), 3);
- QCOMPARE(qvariant_cast<QModelIndex>(args.at(0)), QModelIndex());
- QCOMPARE(args.at(1).toInt(), 0);
- QCOMPARE(args.at(2).toInt(), 0);
-
- QCOMPARE(model.rowCount(), 1);
- QCOMPARE(model.data(model.index(0, 0)).toInt(), 2);
-}
-
-void tst_QSqlTableModel::sqlite_bigTable()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
- const QString bigtable(qTableName("bigtable", __FILE__));
-
- bool hasTransactions = db.driver()->hasFeature(QSqlDriver::Transactions);
- if (hasTransactions) QVERIFY(db.transaction());
- QSqlQuery q(db);
- QVERIFY_SQL( q, exec("create table "+bigtable+"(id int primary key, name varchar)"));
- QVERIFY_SQL( q, prepare("insert into "+bigtable+"(id, name) values (?, ?)"));
- QTime startTime;
- startTime.start();
- for (int i = 0; i < 10000; ++i) {
- q.addBindValue(i);
- q.addBindValue(QString::number(i));
- if(i%1000 == 0 && startTime.elapsed() > 5000)
- qDebug() << i << "records written";
- QVERIFY_SQL( q, exec());
- }
- q.clear();
- if (hasTransactions) QVERIFY(db.commit());
-
- QSqlTableModel model(0, db);
- model.setTable(bigtable);
- QVERIFY_SQL(model, select());
-
- QSqlRecord rec = model.record();
- rec.setValue("id", 424242);
- rec.setValue("name", "Guillaume");
- QVERIFY_SQL(model, insertRecord(-1, rec));
-
- model.clear();
-}
-
-// For task 118547: couldn't insert records unless select()
-// had first been called.
-void tst_QSqlTableModel::insertRecordBeforeSelect()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- QCOMPARE(model.lastError().type(), QSqlError::NoError);
-
- QSqlRecord buffer = model.record();
- buffer.setValue("id", 13);
- buffer.setValue("name", QString("The Lion King"));
- buffer.setValue("title", 0);
- QVERIFY_SQL(model, insertRecord(-1, buffer));
-
- buffer.setValue("id", 26);
- buffer.setValue("name", QString("T. Leary"));
- buffer.setValue("title", 0);
- QVERIFY_SQL(model, insertRecord(1, buffer));
-
- int rowCount = model.rowCount();
- model.clear();
- QCOMPARE(model.rowCount(), 0);
-
- QSqlTableModel model2(0, db);
- model2.setTable(test);
- QVERIFY_SQL(model2, select());
- QCOMPARE(model2.rowCount(), rowCount);
-}
-
-// For task 118547: set errors if table doesn't exist and if records
-// are inserted and submitted on a non-existing table.
-void tst_QSqlTableModel::submitAllOnInvalidTable()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
-
- // setTable returns a void, so the error can only be caught by
- // manually checking lastError(). ### Qt5: This should be changed!
- model.setTable(qTableName("invalidTable", __FILE__));
- QCOMPARE(model.lastError().type(), QSqlError::StatementError);
-
- // This will give us an empty record which is expected behavior
- QSqlRecord buffer = model.record();
- buffer.setValue("bogus", 1000);
- buffer.setValue("bogus2", QString("I will go nowhere!"));
-
- // Inserting the record into the *model* will work (OnManualSubmit)
- QVERIFY_SQL(model, insertRecord(-1, buffer));
-
- // The submit and select shall fail because the table doesn't exist
- QEXPECT_FAIL("", "The table doesn't exist: submitAll() shall fail",
- Continue);
- QVERIFY_SQL(model, submitAll());
- QEXPECT_FAIL("", "The table doesn't exist: select() shall fail",
- Continue);
- QVERIFY_SQL(model, select());
-}
-
-// For task 147575: the rowsRemoved signal emitted from the model was lying
-void tst_QSqlTableModel::insertRecordsInLoop()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- model.select();
-
- QSqlRecord record = model.record();
- record.setValue(0, 10);
- record.setValue(1, "Testman");
- record.setValue(2, 1);
-
- QSignalSpy spyRowsRemoved(&model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
- QSignalSpy spyRowsInserted(&model, SIGNAL(rowsInserted(const QModelIndex &, int, int)));
- for (int i = 0; i < 10; i++) {
- QVERIFY(model.insertRecord(model.rowCount(), record));
- QCOMPARE(spyRowsInserted.at(i).at(1).toInt(), i+3); // The table already contains three rows
- QCOMPARE(spyRowsInserted.at(i).at(2).toInt(), i+3);
- }
- model.submitAll(); // submitAll() calls select() which clears and repopulates the table
-
- int firstRowIndex = 0, lastRowIndex = 12;
- QCOMPARE(spyRowsRemoved.count(), 1);
- QCOMPARE(spyRowsRemoved.at(0).at(1).toInt(), firstRowIndex);
- QCOMPARE(spyRowsRemoved.at(0).at(2).toInt(), lastRowIndex);
-
- QCOMPARE(spyRowsInserted.at(10).at(1).toInt(), firstRowIndex);
- QCOMPARE(spyRowsInserted.at(10).at(2).toInt(), lastRowIndex);
- QCOMPARE(spyRowsInserted.count(), 11);
-
- QCOMPARE(model.rowCount(), 13);
- QCOMPARE(model.columnCount(), 3);
-}
-
-void tst_QSqlTableModel::sqlite_attachedDatabase()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
- if(db.databaseName() == ":memory:")
- QSKIP(":memory: database, skipping test", SkipSingle);
-
- QSqlDatabase attachedDb = QSqlDatabase::cloneDatabase(db, db.driverName() + QLatin1String("attached"));
- attachedDb.setDatabaseName(db.databaseName()+QLatin1String("attached.dat"));
- QVERIFY_SQL(attachedDb, open());
- QSqlQuery q(attachedDb);
- tst_Databases::safeDropTables(attachedDb, QStringList() << "atest" << "atest2");
- QVERIFY_SQL( q, exec("CREATE TABLE atest(id int, text varchar(20))"));
- QVERIFY_SQL( q, exec("CREATE TABLE atest2(id int, text varchar(20))"));
- QVERIFY_SQL( q, exec("INSERT INTO atest VALUES(1, 'attached-atest')"));
- QVERIFY_SQL( q, exec("INSERT INTO atest2 VALUES(2, 'attached-atest2')"));
-
- QSqlQuery q2(db);
- tst_Databases::safeDropTable(db, "atest");
- QVERIFY_SQL(q2, exec("CREATE TABLE atest(id int, text varchar(20))"));
- QVERIFY_SQL(q2, exec("INSERT INTO atest VALUES(3, 'main')"));
- QVERIFY_SQL(q2, exec("ATTACH DATABASE \""+attachedDb.databaseName()+"\" as adb"));
-
- // This should query the table in the attached database (schema supplied)
- QSqlTableModel model(0, db);
- model.setTable("adb.atest");
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 1);
- QCOMPARE(model.data(model.index(0, 0), Qt::DisplayRole).toInt(), 1);
- QCOMPARE(model.data(model.index(0, 1), Qt::DisplayRole).toString(), QLatin1String("attached-atest"));
-
- // This should query the table in the attached database (unique tablename)
- model.setTable("atest2");
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 1);
- QCOMPARE(model.data(model.index(0, 0), Qt::DisplayRole).toInt(), 2);
- QCOMPARE(model.data(model.index(0, 1), Qt::DisplayRole).toString(), QLatin1String("attached-atest2"));
-
- // This should query the table in the main database (tables in main db has 1st priority)
- model.setTable("atest");
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 1);
- QCOMPARE(model.data(model.index(0, 0), Qt::DisplayRole).toInt(), 3);
- QCOMPARE(model.data(model.index(0, 1), Qt::DisplayRole).toString(), QLatin1String("main"));
-}
-
-
-void tst_QSqlTableModel::tableModifyWithBlank()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(qTableName("test4", __FILE__));
- model.select();
-
- //generate a time stamp for the test. Add one second to the current time to make sure
- //it is different than the QSqlQuery test.
- QString timeString=QDateTime::currentDateTime().addSecs(1).toString(Qt::ISODate);
-
- //insert a new row, with column0 being the timestamp.
- //Should be equivalent to QSqlQuery INSERT INTO... command)
- QVERIFY_SQL(model, insertRow(0));
- QVERIFY_SQL(model, setData(model.index(0,0),timeString));
- QVERIFY_SQL(model, submitAll());
-
- //set a filter on the table so the only record we get is the one we just made
- //I could just do another setData command, but I want to make sure the TableModel
- //matches exactly what is stored in the database
- model.setFilter("column1='"+timeString+"'"); //filter to get just the newly entered row
- QVERIFY_SQL(model, select());
-
- //Make sure we only get one record, and that it is the one we just made
- QCOMPARE(model.rowCount(), 1); //verify only one entry
- QCOMPARE(model.record(0).value(0).toString(), timeString); //verify correct record
-
- //At this point we know that the initial value (timestamp) was succsefully stored in the database
- //Attempt to modify the data in the new record
- //equivalent to query.exec("update test set column3="... command in direct test
- //set the data in the first column to "col1ModelData"
- QVERIFY_SQL(model, setData(model.index(0,1), "col1ModelData"));
-
- //do a quick check to make sure that the setData command properly set the value in the model
- QCOMPARE(model.record(0).value(1).toString(), QLatin1String("col1ModelData"));
-
- //submit the changed data to the database
- //This is where I have been getting errors.
- QVERIFY_SQL(model, submitAll());
-
- //make sure the model has the most current data for our record
- QVERIFY_SQL(model, select());
-
- //verify that our new record was the only record returned
- QCOMPARE(model.rowCount(), 1);
-
- //And that the record returned is, in fact, our test record.
- QCOMPARE(model.record(0).value(0).toString(), timeString);
-
- //Make sure the value of the first column matches what we set it to previously.
- QCOMPARE(model.record(0).value(1).toString(), QLatin1String("col1ModelData"));
-}
-
-void tst_QSqlTableModel::removeColumnAndRow()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
- QCOMPARE(model.columnCount(), 3);
-
- QVERIFY(model.removeColumn(0));
- QVERIFY(model.removeRow(0));
- QVERIFY(model.submitAll());
- QCOMPARE(model.rowCount(), 2);
- QCOMPARE(model.columnCount(), 2);
-
- // check with another table because the model has been modified
- // but not the sql table
- QSqlTableModel model2(0, db);
- model2.setTable(test);
- QVERIFY_SQL(model2, select());
- QCOMPARE(model2.rowCount(), 2);
- QCOMPARE(model2.columnCount(), 3);
-}
-
-void tst_QSqlTableModel::insertBeforeDelete()
-{
- QFETCH(QString, dbName);
- QSqlDatabase db = QSqlDatabase::database(dbName);
- CHECK_DATABASE(db);
-
- QSqlQuery q(db);
- QVERIFY_SQL( q, exec("insert into " + test + " values(9, 'andrew', 9)"));
- QVERIFY_SQL( q, exec("insert into " + test + " values(10, 'justin', 10)"));
-
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- QVERIFY_SQL(model, select());
-
- QSqlRecord rec = model.record();
- rec.setValue(0, 4);
- rec.setValue(1, QString("bill"));
- rec.setValue(2, 4);
- QVERIFY_SQL(model, insertRecord(4, rec));
-
- QVERIFY_SQL(model, removeRow(5));
- QVERIFY_SQL(model, submitAll());
- QCOMPARE(model.rowCount(), 5);
-}
-
-QTEST_MAIN(tst_QSqlTableModel)
-#include "tst_qsqltablemodel.moc"