From 94ebe5ced6eb536499819a0d1a3bb63add33bc32 Mon Sep 17 00:00:00 2001 From: fekir Date: Sat, 19 Aug 2017 08:53:01 +0200 Subject: [PATCH] Add default copy constructor to exception class The throw statement may copy the exception, since exception are thrown by value Having const members disables the assignment operator --- CMakeLists.txt | 1 + include/SQLiteCpp/Exception.h | 4 ++-- tests/Exception_test.cpp | 44 +++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/Exception_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index bf1fcbb..4a3e492 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,6 +134,7 @@ set(SQLITECPP_TESTS tests/Backup_test.cpp tests/Transaction_test.cpp tests/VariadicBind_test.cpp + tests/Exception_test.cpp ) source_group(tests FILES ${SQLITECPP_TESTS}) diff --git a/include/SQLiteCpp/Exception.h b/include/SQLiteCpp/Exception.h index b064ad9..3b0b772 100644 --- a/include/SQLiteCpp/Exception.h +++ b/include/SQLiteCpp/Exception.h @@ -91,8 +91,8 @@ public: const char* getErrorStr() const noexcept; // nothrow private: - const int mErrcode; ///< Error code value - const int mExtendedErrcode; ///< Detailed error code if any + int mErrcode; ///< Error code value + int mExtendedErrcode; ///< Detailed error code if any }; diff --git a/tests/Exception_test.cpp b/tests/Exception_test.cpp new file mode 100644 index 0000000..621c9c8 --- /dev/null +++ b/tests/Exception_test.cpp @@ -0,0 +1,44 @@ +/** + * @file Transaction_test.cpp + * @ingroup tests + * @brief Test of a SQLite Transaction. + * + * Copyright (c) 2012-2016 Sebastien Rombauts (sebastien.rombauts@gmail.com) + * + * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt + * or copy at http://opensource.org/licenses/MIT) + */ + +#include + +#include + +TEST(Exception, copy) { + const SQLite::Exception ex1("some error", 2); + const SQLite::Exception ex2 = ex1; + EXPECT_STREQ(ex1.what(), ex2.what()); + EXPECT_EQ(ex1.getErrorCode(), ex2.getErrorCode()); + EXPECT_EQ(ex1.getExtendedErrorCode(), ex2.getExtendedErrorCode()); +} + +// see http://eel.is/c++draft/exception#2 or http://www.cplusplus.com/reference/exception/exception/operator=/ +// an assignment operator is expected to be avaiable +TEST(Exception, assignment) { + const SQLite::Exception ex1("some error", 2); + SQLite::Exception ex2("some error2", 3); + + ex2 = ex1; + + EXPECT_STREQ(ex1.what(), ex2.what()); + EXPECT_EQ(ex1.getErrorCode(), ex2.getErrorCode()); + EXPECT_EQ(ex1.getExtendedErrorCode(), ex2.getExtendedErrorCode()); +} + +TEST(Exception, throw_catch) { + const char message[] = "some error"; + try { + throw SQLite::Exception(message); + } catch (const std::runtime_error& ex) { + EXPECT_STREQ(ex.what(), message); + } +}