diff --git a/CMakeLists.txt b/CMakeLists.txt index a410bc8..535ffef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,6 +99,7 @@ set(SQLITECPP_TESTS tests/Database_test.cpp tests/Statement_test.cpp tests/Backup_test.cpp + tests/VariadicBind_test.cpp ) source_group(tests FILES ${SQLITECPP_TESTS}) diff --git a/tests/VariadicBind_test.cpp b/tests/VariadicBind_test.cpp new file mode 100644 index 0000000..95782e2 --- /dev/null +++ b/tests/VariadicBind_test.cpp @@ -0,0 +1,77 @@ +/** + * @file VariadicBind_test.cpp + * @ingroup tests + * @brief Test of variadic bind + * + * Copyright (c) 2016 Paul Dreik (github@pauldreik.se) + * + * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt + * or copy at http://opensource.org/licenses/MIT) + */ + +#include +#include +#include + +#include + +#include + +//this requires c++14. seems like visual studio 2015 should work (yet untested). +#if ( __cplusplus>= 201402L) || ( defined(_MSC_VER) && (_MSC_VER >= 1900) ) + +TEST(VariadicBind, invalid) { + // Create a new database +#if 0 + SQLite::Database db("variadic_bind_test.db3", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE); +#else + SQLite::Database db(":memory:", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE); +#endif + + EXPECT_EQ(0, db.exec("DROP TABLE IF EXISTS test")); + EXPECT_EQ(0, + db.exec( + "CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT DEFAULT 'default') ")); + EXPECT_TRUE(db.tableExists("test")); + + { + SQLite::Statement query(db, "INSERT INTO test VALUES (?, ?)"); + + //zero arguments - should give compile time error through a static assert + //SQLite::bind(query); + + //bind one argument less than expected - should be fine. + //the unspecified argument should be set to null, not the default. + SQLite::bind(query, 1); + EXPECT_EQ(1, query.exec()); + query.reset(); + + //bind all arguments - should work just fine + SQLite::bind(query, 2, "two"); + EXPECT_EQ(1, query.exec()); + query.reset(); + + //bind too many arguments - should throw. + EXPECT_THROW(SQLite::bind(query, 3, "three", 0), SQLite::Exception); + EXPECT_EQ(1, query.exec()); + } + + //make sure the content is as expected + { + using namespace std::string_literals; + + SQLite::Statement query(db, "SELECT id, value FROM test ORDER BY id"s); + std::vector > results; + while (query.executeStep()) { + const int id = query.getColumn(0); + std::string value = query.getColumn(1); + results.emplace_back( id, std::move(value) ); + } + EXPECT_EQ(std::size_t(3), results.size()); + + EXPECT_EQ(std::make_pair(1,""s), results.at(0)); + EXPECT_EQ(std::make_pair(2,"two"s), results.at(1)); + EXPECT_EQ(std::make_pair(3,"three"s), results.at(2)); + } +} +#endif // c++14