Files
sqlitebrowser/src/tests/testsqlobjects.cpp
Martin Kleusberg 3da0d36463 Tests: Make sure all unit tests pass
Two unit tests where failing because of missing spaces in the expected
result string.
2014-06-20 12:51:56 +02:00

238 lines
7.2 KiB
C++

#include "testsqlobjects.h"
#include "../sqlitetypes.h"
#include <QtTest/QtTest>
using namespace sqlb;
void TestTable::sqlOutput()
{
Table tt("testtable");
FieldPtr f = FieldPtr(new Field("id", "integer"));
f->setPrimaryKey(true);
FieldPtr fkm = FieldPtr(new Field("km", "integer", false, "", "km > 1000"));
fkm->setPrimaryKey(true);
tt.addField(f);
tt.addField(FieldPtr(new Field("car", "text")));
tt.addField(fkm);
QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n"
"\t`id`\tinteger,\n"
"\t`car`\ttext,\n"
"\t`km`\tinteger CHECK(km > 1000),\n"
"\tPRIMARY KEY(id,km)\n"
");"));
}
void TestTable::autoincrement()
{
Table tt("testtable");
FieldPtr f = FieldPtr(new Field("id", "integer"));
f->setPrimaryKey(true);
f->setAutoIncrement(true);
FieldPtr fkm = FieldPtr(new Field("km", "integer"));
tt.addField(f);
tt.addField(FieldPtr(new Field("car", "text")));
tt.addField(fkm);
QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n"
"\t`id`\tinteger PRIMARY KEY AUTOINCREMENT,\n"
"\t`car`\ttext,\n"
"\t`km`\tinteger\n"
");"));
}
void TestTable::notnull()
{
Table tt("testtable");
FieldPtr f = FieldPtr(new Field("id", "integer"));
f->setPrimaryKey(true);
f->setAutoIncrement(true);
FieldPtr fkm = FieldPtr(new Field("km", "integer"));
tt.addField(f);
tt.addField(FieldPtr(new Field("car", "text", true)));
tt.addField(fkm);
QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n"
"\t`id`\tinteger PRIMARY KEY AUTOINCREMENT,\n"
"\t`car`\ttext NOT NULL,\n"
"\t`km`\tinteger\n"
");"));
}
void TestTable::withoutRowid()
{
Table tt("testtable");
FieldPtr f = FieldPtr(new Field("a", "integer"));
f->setPrimaryKey(true);
f->setAutoIncrement(true);
tt.addField(f);
tt.addField(FieldPtr(new Field("b", "integer")));
tt.setRowidColumn("a");
QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n"
"\t`a`\tinteger PRIMARY KEY AUTOINCREMENT,\n"
"\t`b`\tinteger\n"
") WITHOUT ROWID;"));
}
void TestTable::parseSQL()
{
QString sSQL = "create TABLE hero (\n"
"\tid integer PRIMARY KEY AUTOINCREMENT,\n"
"\tname text NOT NULL DEFAULT 'xxxx',\n"
"\tinfo VARCHAR(255) CHECK (info == 'x')\n"
");";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "hero");
QVERIFY(tab.rowidColumn() == "rowid");
QVERIFY(tab.fields().at(0)->name() == "id");
QVERIFY(tab.fields().at(1)->name() == "name");
QVERIFY(tab.fields().at(2)->name() == "info");
QVERIFY(tab.fields().at(0)->type() == "integer");
QVERIFY(tab.fields().at(1)->type() == "text");
QVERIFY(tab.fields().at(2)->type() == "VARCHAR(255)");
QVERIFY(tab.fields().at(0)->autoIncrement());
QVERIFY(tab.fields().at(0)->primaryKey());
QVERIFY(tab.fields().at(1)->notnull());
QCOMPARE(tab.fields().at(1)->defaultValue(), QString("'xxxx'"));
QCOMPARE(tab.fields().at(1)->check(), QString(""));
QCOMPARE(tab.fields().at(2)->check(), QString("info == 'x'"));
}
void TestTable::parseSQLdefaultexpr()
{
QString sSQL = "CREATE TABLE chtest(\n"
"id integer primary key,\n"
"dumpytext text default('axa') CHECK(dumpytext == \"aa\"),\n"
"zoi integer)";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "chtest");
QVERIFY(tab.fields().at(0)->name() == "id");
QVERIFY(tab.fields().at(1)->name() == "dumpytext");
QVERIFY(tab.fields().at(2)->name() == "zoi");
QVERIFY(tab.fields().at(0)->type() == "integer");
QVERIFY(tab.fields().at(1)->type() == "text");
QVERIFY(tab.fields().at(2)->type() == "integer");
QCOMPARE(tab.fields().at(1)->defaultValue(), QString("('axa')"));
QCOMPARE(tab.fields().at(1)->check(), QString("dumpytext == \"aa\""));
QCOMPARE(tab.fields().at(2)->defaultValue(), QString(""));
QCOMPARE(tab.fields().at(2)->check(), QString(""));
QVERIFY(tab.fields().at(0)->primaryKey());
}
void TestTable::parseSQLMultiPk()
{
QString sSQL = "CREATE TABLE hero (\n"
"\tid1 integer,\n"
"\tid2 integer,\n"
"\tnonpkfield blob,\n"
"PRIMARY KEY(id1,id2)\n"
");";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "hero");
QVERIFY(tab.fields().at(0)->name() == "id1");
QVERIFY(tab.fields().at(1)->name() == "id2");
QVERIFY(tab.fields().at(0)->type() == "integer");
QVERIFY(tab.fields().at(1)->type() == "integer");
QVERIFY(tab.fields().at(0)->primaryKey());
QVERIFY(tab.fields().at(1)->primaryKey());
}
void TestTable::parseSQLForeignKey()
{
QString sSQL = "CREATE TABLE grammar_test(id, test, FOREIGN KEY(test) REFERENCES other_table);";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "grammar_test");
QVERIFY(tab.fields().at(0)->name() == "id");
QVERIFY(tab.fields().at(1)->name() == "test");
}
void TestTable::parseSQLSingleQuotes()
{
QString sSQL = "CREATE TABLE 'test'('id','test');";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "test");
QVERIFY(tab.fields().at(0)->name() == "id");
QVERIFY(tab.fields().at(1)->name() == "test");
}
void TestTable::parseSQLKeywordInIdentifier()
{
QString sSQL = "CREATE TABLE deffered(key integer primary key, if text);";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "deffered");
QVERIFY(tab.fields().at(0)->name() == "key");
QVERIFY(tab.fields().at(1)->name() == "if");
}
void TestTable::parseSQLWithoutRowid()
{
QString sSQL = "CREATE TABLE test(a integer primary key, b integer) WITHOUT ROWID;";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.fields().at(tab.findPk())->name() == "a");
QVERIFY(tab.rowidColumn() == "a");
}
void TestTable::parseNonASCIIChars()
{
QString sSQL = "CREATE TABLE `lösung` ("
"`Fieldöäüß` INTEGER,"
"PRIMARY KEY(Fieldöäüß)"
");";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "lösung");
QVERIFY(tab.fields().at(0)->name() == "Fieldöäüß");
}
void TestTable::createTableWithIn()
{
QString sSQL = "CREATE TABLE not_working("
"_id PRIMARY KEY NOT NULL,"
"value NVARCHAR(5) CHECK (value IN ('a', 'b', 'c'))"
");";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "not_working");
QVERIFY(tab.fields().at(1)->check() == "value IN ( 'a' , 'b' , 'c' )");
}
void TestTable::createTableWithNotLikeConstraint()
{
QString sSQL = "CREATE TABLE hopefully_working("
"value TEXT CONSTRAINT 'value' CHECK(value NOT LIKE 'prefix%')"
");";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "hopefully_working");
QVERIFY(tab.fields().at(0)->check() == "value NOT LIKE 'prefix%'");
}
QTEST_MAIN(TestTable)
//#include "testsqlobjects.moc"