changeset 73:c9447697609f

Fixed some issues with raise. 100% function code coverage for Exceptions.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Thu, 31 Jan 2013 20:33:01 +0100
parents b4185273c14a
children 19d8825ec501
files CMakeLists.txt Exception/Exception.hpp Exception/IOException.cpp Exception/IOException.hpp Exception/InvalidDataException.cpp Exception/InvalidDataException.hpp Exception/NoSuchValueException.cpp Exception/NoSuchValueException.hpp Exception/PermissionException.cpp Exception/PermissionException.hpp Exception/SQLException.cpp Exception/SQLException.hpp Exception/TestIOException.cpp Exception/TestInvalidDataException.cpp Exception/TestNoSuchValueException.cpp Exception/TestPermissionException.cpp Exception/TestSQLException.cpp Exception/TestValueExistsException.cpp Exception/ValueExistsException.cpp Exception/ValueExistsException.hpp MemoryDBLink.cpp TestMemoryDBLink.cpp
diffstat 22 files changed, 215 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Thu Jan 31 17:26:21 2013 +0100
+++ b/CMakeLists.txt	Thu Jan 31 20:33:01 2013 +0100
@@ -10,9 +10,10 @@
 ENDIF()
 
 MACRO(NEW_TEST file)
-  ADD_EXECUTABLE(${file} ${file}.cpp ${TEST_SOURCES})
-  ADD_TEST(${file} ${file})
-  TARGET_LINK_LIBRARIES(${file} ${QT_LIBRARIES} ${Boost_LIBRARIES} ${COVERAGE_FLAGS})
+  STRING(REPLACE "/" "_" TARGET ${file})
+  ADD_EXECUTABLE(${TARGET} ${file}.cpp ${TEST_SOURCES})
+  ADD_TEST(${TARGET} ${TARGET})
+  TARGET_LINK_LIBRARIES(${TARGET} ${QT_LIBRARIES} ${Boost_LIBRARIES} ${COVERAGE_FLAGS})
 ENDMACRO()
 
 SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMake_Modules/")
@@ -52,7 +53,11 @@
 	DataController.cpp
 	EditDistance.cpp
 	Exception/IOException.cpp
+	Exception/NoSuchValueException.cpp
+	Exception/ValueExistsException.cpp
+	Exception/InvalidDataException.cpp
 	Exception/SQLException.cpp
+	Exception/PermissionException.cpp
 	FastBitDecoder.cpp
 	FileDBLink.cpp
 	HuffmanSet.cpp
@@ -138,6 +143,12 @@
 )
 
 ENABLE_TESTING()
+NEW_TEST(Exception/TestIOException)
+NEW_TEST(Exception/TestInvalidDataException)
+NEW_TEST(Exception/TestSQLException)
+NEW_TEST(Exception/TestNoSuchValueException)
+NEW_TEST(Exception/TestValueExistsException)
+NEW_TEST(Exception/TestPermissionException)
 NEW_TEST(TestBitArray)
 NEW_TEST(TestBitDecoder)
 NEW_TEST(TestDBCache)
@@ -145,6 +156,7 @@
 NEW_TEST(TestFastBitDecoder)
 NEW_TEST(TestHuffmanString)
 NEW_TEST(TestRBTree)
+NEW_TEST(TestMemoryDBLink)
 NEW_TEST(TestSqliteDBLink)
 
 #ADD_PRECOMPILED_HEADER(TestEditDistance TestFramework.hpp)
--- a/Exception/Exception.hpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/Exception.hpp	Thu Jan 31 20:33:01 2013 +0100
@@ -1,6 +1,8 @@
 #ifndef EXCEPTION_HPP
 #define EXCEPTION_HPP
 
+#define NORETURN __attribute__ ((noreturn))
+
 #include <QtCore/QString>
 
 class Exception {
@@ -12,11 +14,8 @@
   {
     return errorMsg_;
   }
-  void raise() const
-  {
-    throw *this;
-  }
 
+  virtual void raise() const NORETURN = 0;
 
 protected:
   Exception(const string_t& errorMsg = string_t()) : errorMsg_(errorMsg) {}
--- a/Exception/IOException.cpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/IOException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -3,3 +3,8 @@
 IOException::IOException(const QString& errorMsg) : Exception(errorMsg)
 {
 }
+
+void IOException::raise() const
+{
+  throw *this;
+}
--- a/Exception/IOException.hpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/IOException.hpp	Thu Jan 31 20:33:01 2013 +0100
@@ -6,6 +6,7 @@
 class IOException : public Exception {
 public:
   IOException(const string_t& errMsg);
+  virtual void raise() const NORETURN;
 };
 
 #endif //IOEXCEPTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/InvalidDataException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,11 @@
+#include "InvalidDataException.hpp"
+
+InvalidDataException::InvalidDataException(const QString& errorMsg) :
+  Exception(errorMsg)
+{
+}
+
+void InvalidDataException::raise() const
+{
+  throw *this;
+}
--- a/Exception/InvalidDataException.hpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/InvalidDataException.hpp	Thu Jan 31 20:33:01 2013 +0100
@@ -5,6 +5,9 @@
 
 class InvalidDataException : public Exception
 {
+public:
+  InvalidDataException(const string_t& errMsg = string_t());
+  virtual void raise() const;
 };
 
 #endif //INVALIDDATAEXCEPTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/NoSuchValueException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,11 @@
+#include "NoSuchValueException.hpp"
+
+NoSuchValueException::NoSuchValueException(const QString& errorMsg) :
+  Exception(errorMsg)
+{
+}
+
+void NoSuchValueException::raise() const
+{
+  throw *this;
+}
--- a/Exception/NoSuchValueException.hpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/NoSuchValueException.hpp	Thu Jan 31 20:33:01 2013 +0100
@@ -5,6 +5,9 @@
 
 class NoSuchValueException : public Exception
 {
+public:
+  NoSuchValueException(const string_t& errMsg = string_t());
+  virtual void raise() const;
 };
 
 #endif //NOSUCHVALUEEXCEPTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/PermissionException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,12 @@
+#include "PermissionException.hpp"
+
+PermissionException::PermissionException(const QString& errorMsg)
+  : IOException(errorMsg)
+{
+}
+
+void PermissionException::raise() const
+{
+  throw *this;
+  __builtin_unreachable();
+}
--- a/Exception/PermissionException.hpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/PermissionException.hpp	Thu Jan 31 20:33:01 2013 +0100
@@ -5,8 +5,8 @@
 
 class PermissionException : public IOException {
 public:
-  PermissionException(const string_t& errorMsg) : IOException(errorMsg) {}
-
+  PermissionException(const string_t& errorMsg = string_t());
+  virtual void raise() const NORETURN;
 };
 
 #endif //PERMISSIONEXCEPTION_HPP
--- a/Exception/SQLException.cpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/SQLException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -11,3 +11,8 @@
   Exception(errorQuery.lastError().text() + ":" + errorQuery.lastQuery())
 {
 }
+
+void SQLException::raise() const
+{
+  throw *this;
+}
--- a/Exception/SQLException.hpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/SQLException.hpp	Thu Jan 31 20:33:01 2013 +0100
@@ -8,6 +8,8 @@
 public:
   SQLException(const string_t& errMsg);
   SQLException(const QSqlQuery& error);
+
+  virtual void raise() const;
 };
 
 #endif //IOEXCEPTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/TestIOException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,13 @@
+#include "Exception/IOException.hpp"
+#include "TestFramework.hpp"
+
+BOOST_AUTO_TEST_CASE( Create )
+{
+  try {
+    throw IOException("Hello");
+  }
+  catch (IOException & e) {
+    BOOST_REQUIRE_EQUAL(e.toString(), "Hello");
+    BOOST_REQUIRE_THROW(e.raise(), IOException);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/TestInvalidDataException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,12 @@
+#include "Exception/InvalidDataException.hpp"
+#include "TestFramework.hpp"
+
+BOOST_AUTO_TEST_CASE( Create )
+{
+  try {
+    throw InvalidDataException();
+  }
+  catch (InvalidDataException & e) {
+    BOOST_REQUIRE_THROW(e.raise(), InvalidDataException);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/TestNoSuchValueException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,14 @@
+#include "Exception/NoSuchValueException.hpp"
+
+#include "TestFramework.hpp"
+
+BOOST_AUTO_TEST_CASE( Create )
+{
+  try {
+    throw NoSuchValueException("Hello");
+  }
+  catch (NoSuchValueException & e) {
+    BOOST_REQUIRE_EQUAL(e.toString(), "Hello");
+    BOOST_REQUIRE_THROW(e.raise(), NoSuchValueException);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/TestPermissionException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,12 @@
+#include "Exception/PermissionException.hpp"
+#include "TestFramework.hpp"
+
+BOOST_AUTO_TEST_CASE( Create )
+{
+  try {
+    throw PermissionException();
+  }
+  catch (PermissionException & e) {
+    BOOST_REQUIRE_THROW(e.raise(), PermissionException);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/TestSQLException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,26 @@
+#include "Exception/SQLException.hpp"
+
+#include <QtSql/QSqlQuery>
+
+#include "TestFramework.hpp"
+
+BOOST_AUTO_TEST_CASE( Create )
+{
+  try {
+    throw SQLException("Hello");
+  }
+  catch (SQLException & e) {
+    BOOST_REQUIRE_EQUAL(e.toString(), "Hello");
+    BOOST_REQUIRE_THROW(e.raise(), SQLException);
+  }
+}
+
+BOOST_AUTO_TEST_CASE( CreateWithSql )
+{
+  try {
+    throw SQLException(QSqlQuery());
+  }
+  catch (SQLException & e) {
+    BOOST_REQUIRE_THROW(e.raise(), SQLException);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/TestValueExistsException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,12 @@
+#include "Exception/ValueExistsException.hpp"
+#include "TestFramework.hpp"
+
+BOOST_AUTO_TEST_CASE( Create )
+{
+  try {
+    throw ValueExistsException();
+  }
+  catch (ValueExistsException & e) {
+    BOOST_REQUIRE_THROW(e.raise(), ValueExistsException);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Exception/ValueExistsException.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,6 @@
+#include "ValueExistsException.hpp"
+
+void ValueExistsException::raise() const
+{
+  throw *this;
+}
--- a/Exception/ValueExistsException.hpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/Exception/ValueExistsException.hpp	Thu Jan 31 20:33:01 2013 +0100
@@ -5,6 +5,12 @@
 
 class ValueExistsException : public Exception
 {
+public:
+  ValueExistsException(const string_t& errorMsg = string_t())
+  : Exception(errorMsg)
+  {}
+
+  virtual void raise() const;
 };
 
 #endif //VALUEEXISTSEXCEPTION_HPP
--- a/MemoryDBLink.cpp	Thu Jan 31 17:26:21 2013 +0100
+++ b/MemoryDBLink.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -1,5 +1,5 @@
 #include "MemoryDBLink.hpp"
-
+#include "Exception/ValueExistsException.hpp"
 #include <QtCore/QStringList>
 
 void MemoryDBLink::addFile(const QString& path, qint64 size,
@@ -22,7 +22,8 @@
 void MemoryDBLink::addFile(const DBInfo& dbinfo)
 {
   if (!tryAddFile(dbinfo)) {
-    abort(); //Should throw exception
+    QString msg = QString("Trying to add '%1', which already exists").arg(dbinfo.path());
+    throw ValueExistsException(msg);
   }
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TestMemoryDBLink.cpp	Thu Jan 31 20:33:01 2013 +0100
@@ -0,0 +1,38 @@
+#include "MemoryDBLink.hpp"
+#include "Exception/ValueExistsException.hpp"
+#include "TestFramework.hpp"
+
+BOOST_AUTO_TEST_CASE( AddUpdateDeleteFile )
+{
+  MemoryDBLink link;
+
+  QDateTime time1;
+  QDateTime time2 = time1.addSecs(1);
+
+  BOOST_REQUIRE_EQUAL(link.existsWithMtime("test", time1), FileDBLink::NONE);
+  link.addFile("test", 1, time1, "a");
+  BOOST_REQUIRE_EQUAL(link.existsWithMtime("test", time1), FileDBLink::SAME);
+  BOOST_REQUIRE_THROW(link.addFile("test", 1, time1, "a"),
+		      ValueExistsException);
+
+  link.updateFile("test", 1, time2, "a");
+  BOOST_REQUIRE_EQUAL(link.existsWithMtime("test", time1), FileDBLink::MTIME_DIFFERENT);
+  BOOST_REQUIRE_THROW(link.addFile("test", 1, time1, "a"),
+		      ValueExistsException);
+
+  /*
+  BOOST_REQUIRE(!map.find(k4));
+  map.insert(k4);
+  BOOST_WARN_EQUAL(map.depth(), 2u);
+  BOOST_WARN_EQUAL(map.total_depth(), 8u);
+  BOOST_REQUIRE_EQUAL(map.size(), 4u);
+  BOOST_REQUIRE_EQUAL(map.optimal_depth(), 3u);
+  BOOST_REQUIRE_THROW(map.insert(k4), ValueExistsException);
+  BOOST_REQUIRE(map.find(k1));
+  BOOST_REQUIRE_EQUAL(*map.find(k1), k1);
+  BOOST_REQUIRE(map.find(k2));
+  BOOST_REQUIRE_EQUAL(*map.find(k2), k2);
+  BOOST_REQUIRE(map.find(k4));
+  BOOST_REQUIRE_EQUAL(*map.find(k4), k4);
+  */
+}