view TestSQLGenerator.cpp @ 78:9744ec195be3

Encapsulate EditDistance with caching.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Thu, 10 Oct 2013 01:07:52 +0200
parents 8136057988bc
children
line wrap: on
line source

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