Mercurial > dedupe
diff TestSQLGenerator.cpp @ 76:8136057988bc
Fixes to automatic report generating system.
A lot of new unittests.
| author | Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no> |
|---|---|
| date | Sat, 16 Feb 2013 15:32:20 +0100 |
| parents | |
| children | 9744ec195be3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TestSQLGenerator.cpp Sat Feb 16 15:32:20 2013 +0100 @@ -0,0 +1,312 @@ +#include "SQLGenerator.hpp" +#include "TestFramework.hpp" +#include "TestDataBase.hpp" + +#include "Exception/SQLException.hpp" + +BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveQString ) +{ + TestDatabase tdb; + QSqlDatabase db = tdb.getDatabase(); + QSqlQuery query(db); + + QString tableName = "test"; + + QString fieldCreateString1 = SQLGenerator<QString>::createFields("value1"); + QString fieldCreateString2 = SQLGenerator<QString>::createFields("value2"); + + + QString createQuery = QString("CREATE TABLE %1(%2, %3);") + .arg(tableName) + .arg(fieldCreateString1) + .arg(fieldCreateString2); + + BOOST_REQUIRE(query.exec(createQuery)); + + + QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);") + .arg(tableName) + .arg(SQLGenerator<QString>::fieldName("value1")) + .arg(SQLGenerator<QString>::fieldName("value2")) + .arg(SQLGenerator<QString>::valueString("value1")) + .arg(SQLGenerator<QString>::valueString("value2")); + QSqlQuery insertQuery = QSqlQuery(db); + BOOST_REQUIRE(insertQuery.prepare(queryString)); + + QList<QString> valueList1, valueList2; + for (int i = 1; i <= 3; ++i) { + valueList1 << QString("a%1").arg(i); + valueList2 << QString("b%1").arg(i); + } + + SQLGenerator<QString>::bindValues(insertQuery, valueList1, "value1"); + SQLGenerator<QString>::bindValues(insertQuery, valueList2, "value2"); + BOOST_REQUIRE(insertQuery.execBatch()); + insertQuery.finish(); + + QString fieldValueString1 = SQLGenerator<QString>::fieldName("value1"); + QString fieldValueString2 = SQLGenerator<QString>::fieldName("value2"); + + QString selectQuery = QString("SELECT %1, %2 FROM %3;") + .arg(fieldValueString1).arg(fieldValueString2).arg(tableName); + + BOOST_REQUIRE(query.exec(selectQuery)); + + while (query.next()) { + QString value1 = *SQLGenerator<QString>::extract(query, "value1"); + QString value2 = *SQLGenerator<QString>::extract(query, "value2"); + + BOOST_REQUIRE(valueList1.contains(value1)); + BOOST_REQUIRE(valueList2.contains(value2)); + + valueList1.removeAt(valueList1.indexOf(value1)); + valueList2.removeAt(valueList2.indexOf(value2)); + } + + boost::optional<QString> empty1 = + SQLGenerator<QString>::extract(query, "value1"); + boost::optional<QString> empty2 = + SQLGenerator<QString>::extract(query, "value2"); + + BOOST_REQUIRE(!empty1); + BOOST_REQUIRE(!empty2); + + BOOST_REQUIRE(valueList1.empty()); + BOOST_REQUIRE(valueList2.empty()); + + query.finish(); +} + +BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveUniqueString ) +{ + TestDatabase tdb; + QSqlDatabase db = tdb.getDatabase(); + QSqlQuery query(db); + + QString tableName = "test"; + + QString fieldCreateString1 = + SQLGenerator<UniqueString>::createFields("value1"); + QString fieldCreateString2 = + SQLGenerator<UniqueString>::createFields("value2"); + + + QString createQuery = QString("CREATE TABLE %1(%2, %3);") + .arg(tableName) + .arg(fieldCreateString1) + .arg(fieldCreateString2); + + BOOST_REQUIRE(query.exec(createQuery)); + + + QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);") + .arg(tableName) + .arg(SQLGenerator<UniqueString>::fieldName("value1")) + .arg(SQLGenerator<UniqueString>::fieldName("value2")) + .arg(SQLGenerator<UniqueString>::valueString("value1")) + .arg(SQLGenerator<UniqueString>::valueString("value2")); + QSqlQuery insertQuery = QSqlQuery(db); + BOOST_REQUIRE(insertQuery.prepare(queryString)); + + QList<UniqueString> valueList1, valueList2; + for (int i = 1; i <= 3; ++i) { + valueList1 << QString("a%1").arg(i); + valueList2 << QString("b%1").arg(i); + } + + SQLGenerator<UniqueString>::bindValues(insertQuery, valueList1, "value1"); + SQLGenerator<UniqueString>::bindValues(insertQuery, valueList2, "value2"); + BOOST_REQUIRE(insertQuery.execBatch()); + insertQuery.finish(); + + QString fieldValueString1 = SQLGenerator<UniqueString>::fieldName("value1"); + QString fieldValueString2 = SQLGenerator<UniqueString>::fieldName("value2"); + + QString selectQuery = QString("SELECT %1, %2 FROM %3;") + .arg(fieldValueString1).arg(fieldValueString2).arg(tableName); + + BOOST_REQUIRE(query.exec(selectQuery)); + + while (query.next()) { + UniqueString value1 = *SQLGenerator<UniqueString>::extract(query, "value1"); + UniqueString value2 = *SQLGenerator<UniqueString>::extract(query, "value2"); + + BOOST_REQUIRE(valueList1.contains(value1)); + BOOST_REQUIRE(valueList2.contains(value2)); + + valueList1.removeAt(valueList1.indexOf(value1)); + valueList2.removeAt(valueList2.indexOf(value2)); + } + + boost::optional<UniqueString> empty1 = + SQLGenerator<UniqueString>::extract(query, "value1"); + boost::optional<UniqueString> empty2 = + SQLGenerator<UniqueString>::extract(query, "value2"); + + BOOST_REQUIRE(!empty1); + BOOST_REQUIRE(!empty2); + + BOOST_REQUIRE(valueList1.empty()); + BOOST_REQUIRE(valueList2.empty()); + + query.finish(); +} + +BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveInt ) +{ + TestDatabase tdb; + QSqlDatabase db = tdb.getDatabase(); + + QSqlQuery query(db); + + QString tableName = "test"; + + QString fieldCreateString1 = SQLGenerator<int>::createFields("value1"); + QString fieldCreateString2 = SQLGenerator<int>::createFields("value2"); + + + QString createQuery = QString("CREATE TABLE %1(%2, %3);") + .arg(tableName) + .arg(fieldCreateString1) + .arg(fieldCreateString2); + + BOOST_REQUIRE(query.exec(createQuery)); + + QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);") + .arg(tableName) + .arg(SQLGenerator<int>::fieldName("value1")) + .arg(SQLGenerator<int>::fieldName("value2")) + .arg(SQLGenerator<int>::valueString("value1")) + .arg(SQLGenerator<int>::valueString("value2")); + QSqlQuery insertQuery = QSqlQuery(db); + BOOST_REQUIRE(insertQuery.prepare(queryString)); + + QList<int> valueList1, valueList2; + int p1 = 2; + int p2 = 3; + int v1 = p1; + int v2 = p2; + for (int i = 1; i <= 3; ++i) { + valueList1 << v1; + valueList2 << v2; + v1 *= p1; + v2 *= p2; + } + + SQLGenerator<int>::bindValues(insertQuery, valueList1, "value1"); + SQLGenerator<int>::bindValues(insertQuery, valueList2, "value2"); + BOOST_REQUIRE(insertQuery.execBatch()); + insertQuery.finish(); + + QString fieldValueString1 = SQLGenerator<int>::fieldName("value1"); + QString fieldValueString2 = SQLGenerator<int>::fieldName("value2"); + + QString selectQuery = QString("SELECT %1, %2 FROM %3;") + .arg(fieldValueString1).arg(fieldValueString2).arg(tableName); + + BOOST_REQUIRE(query.exec(selectQuery)); + + while (query.next()) { + int value1 = *SQLGenerator<int>::extract(query, "value1"); + int value2 = *SQLGenerator<int>::extract(query, "value2"); + + BOOST_REQUIRE(valueList1.contains(value1)); + BOOST_REQUIRE(valueList2.contains(value2)); + + valueList1.removeAt(valueList1.indexOf(value1)); + valueList2.removeAt(valueList2.indexOf(value2)); + } + boost::optional<int> empty1 = SQLGenerator<int>::extract(query, "value1"); + boost::optional<int> empty2 = SQLGenerator<int>::extract(query, "value2"); + + BOOST_REQUIRE(!empty1); + BOOST_REQUIRE(!empty2); + + BOOST_REQUIRE(valueList1.empty()); + BOOST_REQUIRE(valueList2.empty()); + +} + +BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveOrderedPair ) +{ + TestDatabase tdb; + QSqlDatabase db = tdb.getDatabase(); + QSqlQuery query(db); + + QString tableName = "test"; + + QString fieldCreateString1 = + SQLGenerator<OrderedPair<int> >::createFields("value1"); + QString fieldCreateString2 = + SQLGenerator<OrderedPair<int> >::createFields("value2"); + + + QString createQuery = QString("CREATE TABLE %1(%2, %3);") + .arg(tableName) + .arg(fieldCreateString1) + .arg(fieldCreateString2); + + BOOST_REQUIRE(query.exec(createQuery)); + + + QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);") + .arg(tableName) + .arg(SQLGenerator<OrderedPair<int> >::fieldName("value1")) + .arg(SQLGenerator<OrderedPair<int> >::fieldName("value2")) + .arg(SQLGenerator<OrderedPair<int> >::valueString("value1")) + .arg(SQLGenerator<OrderedPair<int> >::valueString("value2")); + QSqlQuery insertQuery = QSqlQuery(db); + BOOST_REQUIRE(insertQuery.prepare(queryString)); + + QList<OrderedPair<int> > valueList1, valueList2; + int p [] = { 2, 3, 5, 7}; + int v [] = { 2, 3, 5, 7}; + + for (int i = 1; i <= 3; ++i) { + valueList1 << OrderedPair<int>(v[0], v[1]); + valueList2 << OrderedPair<int>(v[2], v[3]); + for (int i = 0; i < 4; ++i) + v[i] *= p[i]; + } + + SQLGenerator<OrderedPair<int> >::bindValues(insertQuery, valueList1, "value1"); + SQLGenerator<OrderedPair<int> >::bindValues(insertQuery, valueList2, "value2"); + BOOST_REQUIRE(insertQuery.execBatch()); + insertQuery.finish(); + + QString fieldValueString1 = + SQLGenerator<OrderedPair<int> >::fieldName("value1"); + QString fieldValueString2 = + SQLGenerator<OrderedPair<int> >::fieldName("value2"); + + QString selectQuery = QString("SELECT %1, %2 FROM %3;") + .arg(fieldValueString1).arg(fieldValueString2).arg(tableName); + + BOOST_REQUIRE(query.exec(selectQuery)); + + while (query.next()) { + OrderedPair<int> value1 = + *SQLGenerator<OrderedPair<int> >::extract(query, "value1"); + OrderedPair<int> value2 = + *SQLGenerator<OrderedPair<int> >::extract(query, "value2"); + + BOOST_REQUIRE(valueList1.contains(value1)); + BOOST_REQUIRE(valueList2.contains(value2)); + + valueList1.removeAt(valueList1.indexOf(value1)); + valueList2.removeAt(valueList2.indexOf(value2)); + } + + boost::optional<OrderedPair<int> > empty1 = + SQLGenerator<OrderedPair<int> >::extract(query, "value1"); + boost::optional<OrderedPair<int> > empty2 = + SQLGenerator<OrderedPair<int> >::extract(query, "value2"); + + BOOST_REQUIRE(!empty1); + BOOST_REQUIRE(!empty2); + + BOOST_REQUIRE(valueList1.empty()); + BOOST_REQUIRE(valueList2.empty()); + + query.finish(); +}
