diff options
Diffstat (limited to 'tests/auto/declarative')
-rw-r--r-- | tests/auto/declarative/sql/data/error-b.js | 13 | ||||
-rw-r--r-- | tests/auto/declarative/sql/data/error-notransaction.js | 15 | ||||
-rw-r--r-- | tests/auto/declarative/sql/data/readonly-error.js | 28 | ||||
-rw-r--r-- | tests/auto/declarative/sql/data/readonly.js | 24 | ||||
-rw-r--r-- | tests/auto/declarative/sql/data/reopen1.js | 14 | ||||
-rw-r--r-- | tests/auto/declarative/sql/data/reopen2.js | 16 | ||||
-rw-r--r-- | tests/auto/declarative/sql/sql.pro | 1 | ||||
-rw-r--r-- | tests/auto/declarative/sql/tst_sql.cpp | 84 |
8 files changed, 161 insertions, 34 deletions
diff --git a/tests/auto/declarative/sql/data/error-b.js b/tests/auto/declarative/sql/data/error-b.js new file mode 100644 index 0000000..4dd0ecf --- /dev/null +++ b/tests/auto/declarative/sql/data/error-b.js @@ -0,0 +1,13 @@ +function test() { + var db = openDatabaseSync("QmlTestDB-error-b", "1.0", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; + + db.transaction( + function(tx) { + tx.executeSql('INSERT INTO Greeting VALUES("junk","junk")'); + notexist[123] = "oops" + } + ); + + return r; +} diff --git a/tests/auto/declarative/sql/data/error-notransaction.js b/tests/auto/declarative/sql/data/error-notransaction.js new file mode 100644 index 0000000..b9cc647 --- /dev/null +++ b/tests/auto/declarative/sql/data/error-notransaction.js @@ -0,0 +1,15 @@ +function test() { + var db = openDatabaseSync("QmlTestDB-data/error-notransaction", "1.0", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; + + try { + db.transaction(); + } catch (err) { + if (err.message == "transaction: missing callback") + r = "passed"; + else + r = "WRONG ERROR="+err.message; + } + + return r; +} diff --git a/tests/auto/declarative/sql/data/readonly-error.js b/tests/auto/declarative/sql/data/readonly-error.js new file mode 100644 index 0000000..ab82712 --- /dev/null +++ b/tests/auto/declarative/sql/data/readonly-error.js @@ -0,0 +1,28 @@ +function test() { + var r="transaction_not_finished"; + var db = openDatabaseSync("QmlTestDB-readonly-error", "1.0", "Test database from Qt autotests", 1000000); + + db.transaction( + function(tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)'); + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + r = "passed"; + } + ); + + try { + db.readTransaction( + function(tx) { + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + r = "FAILED"; + } + ); + } catch (err) { + if (err.message == "Read-only Transaction") + r = "passed"; + else + r = "WRONG ERROR="+err.message; + } + + return r; +} diff --git a/tests/auto/declarative/sql/data/readonly.js b/tests/auto/declarative/sql/data/readonly.js new file mode 100644 index 0000000..5ee862c --- /dev/null +++ b/tests/auto/declarative/sql/data/readonly.js @@ -0,0 +1,24 @@ +function test() { + var r="transaction_not_finished"; + var db = openDatabaseSync("QmlTestDB-readonly", "1.0", "Test database from Qt autotests", 1000000); + + db.transaction( + function(tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)'); + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + r = "passed"; + } + ); + + db.readTransaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM Greeting'); + if (rs.rows.item(0).salutation == 'hello') + r = "passed"; + else + r = "FAILED"; + } + ); + + return r; +} diff --git a/tests/auto/declarative/sql/data/reopen1.js b/tests/auto/declarative/sql/data/reopen1.js new file mode 100644 index 0000000..c1a8157 --- /dev/null +++ b/tests/auto/declarative/sql/data/reopen1.js @@ -0,0 +1,14 @@ +function test() { + var r="transaction_not_finished"; + var db = openDatabaseSync("QmlTestDB-reopen", "1.0", "Test database from Qt autotests", 1000000); + + db.transaction( + function(tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)'); + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + r = "passed"; + } + ); + + return r; +} diff --git a/tests/auto/declarative/sql/data/reopen2.js b/tests/auto/declarative/sql/data/reopen2.js new file mode 100644 index 0000000..4f7248f --- /dev/null +++ b/tests/auto/declarative/sql/data/reopen2.js @@ -0,0 +1,16 @@ +function test() { + var r="transaction_not_finished"; + var db = openDatabaseSync("QmlTestDB-reopen", "1.0", "Test database from Qt autotests", 1000000); + + db.transaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM Greeting'); + if (rs.rows.item(0).salutation == 'hello') + r = "passed"; + else + r = "FAILED"; + } + ); + + return r; +} diff --git a/tests/auto/declarative/sql/sql.pro b/tests/auto/declarative/sql/sql.pro index 48e06a2..875e9d8 100644 --- a/tests/auto/declarative/sql/sql.pro +++ b/tests/auto/declarative/sql/sql.pro @@ -1,5 +1,6 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +QT += script macx:CONFIG -= app_bundle SOURCES += tst_sql.cpp diff --git a/tests/auto/declarative/sql/tst_sql.cpp b/tests/auto/declarative/sql/tst_sql.cpp index b5f98e3..d51b91c 100644 --- a/tests/auto/declarative/sql/tst_sql.cpp +++ b/tests/auto/declarative/sql/tst_sql.cpp @@ -43,10 +43,13 @@ #include <QtDeclarative/qmlengine.h> #include <QtDeclarative/qmlcomponent.h> #include <private/qmlgraphicstext_p.h> +#include <private/qmlengine_p.h> +#include <QtCore/qcryptographichash.h> #include <QtWebKit/qwebpage.h> #include <QtWebKit/qwebframe.h> #include <QtWebKit/qwebdatabase.h> #include <QtWebKit/qwebsecurityorigin.h> +#include <QtSql/qsqldatabase.h> #include <QtCore/qdir.h> #include <QtCore/qfile.h> @@ -72,11 +75,11 @@ private slots: void checkDatabasePath(); - void validateAgainstWebkit_data(); - void validateAgainstWebkit(); - void testQml_data(); void testQml(); + void testQml_cleanopen_data(); + void testQml_cleanopen(); + void totalDatabases(); void cleanupTestCase(); @@ -109,7 +112,6 @@ void tst_sql::initTestCase() { removeRecursive(dbDir()); QDir().mkpath(dbDir()); - } void tst_sql::cleanupTestCase() @@ -131,44 +133,37 @@ void tst_sql::checkDatabasePath() QVERIFY(engine->offlineStoragePath().contains("OfflineStorage")); } +static const int total_databases_created_by_tests = 10; void tst_sql::testQml_data() { QTest::addColumn<QString>("jsfile"); // The input file - QTest::addColumn<QString>("result"); // The required output from the js test() function - QTest::addColumn<int>("databases"); // The number of databases that should have been created - QTest::addColumn<bool>("qmlextension"); // Things WebKit can't do // Each test should use a newly named DB to avoid inter-test dependencies - QTest::newRow("creation") << "data/creation.js" << "passed" << 1 << false; - QTest::newRow("creation-a") << "data/creation-a.js" << "passed" << 2 << false; - QTest::newRow("changeversion") << "data/changeversion.js" << "passed" << 3 << false; - QTest::newRow("selection") << "data/selection.js" << "passed" << 4 << false; - QTest::newRow("selection-bindnames") << "data/selection-bindnames.js" << "passed" << 5 << true; - QTest::newRow("iteration") << "data/iteration.js" << "passed" << 6 << false; - QTest::newRow("error-a") << "data/error-a.js" << "passed" << 7 << false; -} - -void tst_sql::validateAgainstWebkit_data() -{ - QTest::addColumn<QString>("jsfile"); // The input file - QTest::addColumn<QString>("result"); // The required output from the js test() function - QTest::addColumn<int>("databases"); // The number of databases that should have been created - QTest::addColumn<bool>("qmlextension"); // Things WebKit can't do - QTest::newRow("creation") << "data/creation.js" << "passed" << 1 << false; + QTest::newRow("creation") << "data/creation.js"; + QTest::newRow("creation-a") << "data/creation-a.js"; + QTest::newRow("changeversion") << "data/changeversion.js"; + QTest::newRow("readonly") << "data/readonly.js"; + QTest::newRow("readonly-error") << "data/readonly-error.js"; + QTest::newRow("selection") << "data/selection.js"; + QTest::newRow("selection-bindnames") << "data/selection-bindnames.js"; + QTest::newRow("iteration") << "data/iteration.js"; + QTest::newRow("error-a") << "data/error-a.js"; + QTest::newRow("error-notransaction") << "data/error-notransaction.js"; + QTest::newRow("reopen1") << "data/reopen1.js"; + QTest::newRow("reopen2") << "data/reopen2.js"; + + // If you add a test, you should usually use a new database in the + // test - in which case increment total_databases_created_by_tests above. } +/* void tst_sql::validateAgainstWebkit() { // Validates tests against WebKit (HTML5) support. // - QFETCH(QString, jsfile); QFETCH(QString, result); QFETCH(int, databases); - QFETCH(bool, qmlextension); - - if (qmlextension) // WebKit can't do it (yet?) - return; QFile f(jsfile); QVERIFY(f.open(QIODevice::ReadOnly)); @@ -180,14 +175,14 @@ void tst_sql::validateAgainstWebkit() QEXPECT_FAIL("","WebKit doesn't support openDatabaseSync yet", Continue); QCOMPARE(webpage.mainFrame()->evaluateJavaScript(js).toString(),result); - /* + QTest::qWait(100); // WebKit crashes if you quit it too fast QWebSecurityOrigin origin = webpage.mainFrame()->securityOrigin(); QList<QWebDatabase> dbs = origin.databases(); QCOMPARE(dbs.count(), databases); - */ } +*/ void tst_sql::testQml() { @@ -195,8 +190,6 @@ void tst_sql::testQml() // that have been validated against Webkit. // QFETCH(QString, jsfile); - QFETCH(QString, result); - QFETCH(int, databases); QString qml= "import Qt 4.6\n" @@ -206,8 +199,31 @@ void tst_sql::testQml() QmlComponent component(engine, qml.toUtf8(), QUrl::fromLocalFile(SRCDIR "/empty.qml")); // just a file for relative local imports QmlGraphicsText *text = qobject_cast<QmlGraphicsText*>(component.create()); QVERIFY(text != 0); - QCOMPARE(text->text(),result); - QCOMPARE(QDir(dbDir()+"/Databases").entryInfoList(QDir::Files|QDir::NoDotAndDotDot).count(), databases*2); // *2 = .ini file + .sqlite file + QCOMPARE(text->text(),QString("passed")); +} + +void tst_sql::testQml_cleanopen_data() +{ + QTest::addColumn<QString>("jsfile"); // The input file + QTest::newRow("reopen1") << "data/reopen1.js"; + QTest::newRow("reopen2") << "data/reopen2.js"; +} + +void tst_sql::testQml_cleanopen() +{ + // Same as testQml, but clean connections between tests, + // making it more like the tests are running in new processes. + testQml(); + + QmlEnginePrivate::getScriptEngine(engine)->collectGarbage(); // close databases + foreach (QString dbname, QSqlDatabase::connectionNames()) { + QSqlDatabase::removeDatabase(dbname); + } +} + +void tst_sql::totalDatabases() +{ + QCOMPARE(QDir(dbDir()+"/Databases").entryInfoList(QDir::Files|QDir::NoDotAndDotDot).count(), total_databases_created_by_tests*2); } QTEST_MAIN(tst_sql) |