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();
+}