diff --git a/test_static_asserts/CMakeLists.txt b/test_static_asserts/CMakeLists.txt index 8bff6904..6722cb9b 100644 --- a/test_static_asserts/CMakeLists.txt +++ b/test_static_asserts/CMakeLists.txt @@ -29,4 +29,5 @@ function(test_compile name) endfunction() test_compile(aggregates) +test_compile(insert) diff --git a/test_static_asserts/aggregates.cpp b/test_static_asserts/aggregates.cpp index 65131d90..86496ec7 100644 --- a/test_static_asserts/aggregates.cpp +++ b/test_static_asserts/aggregates.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, Roland Bock + * Copyright (c) 2015-2015, Roland Bock * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -68,7 +68,7 @@ namespace sqlpp namespace { - SQLPP_ALIAS_PROVIDER(whatever); + SQLPP_ALIAS_PROVIDER(whatever) using sqlpp::test::run_check; static constexpr auto t = test::TabBar{}; diff --git a/test_static_asserts/insert.cpp b/test_static_asserts/insert.cpp new file mode 100644 index 00000000..ced14550 --- /dev/null +++ b/test_static_asserts/insert.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2015-2015, Roland Bock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "MockDb.h" +#include "Sample.h" +#include + +namespace +{ + static constexpr auto t = test::TabBar{}; + static constexpr auto f = test::TabFoo{}; + + template + void print_type_on_error(std::true_type) + { + } + + template + void print_type_on_error(std::false_type) + { + T::_print_me_; + } + + template + void set_static_check(const Assignments&... assignments) + { + using CheckResult = sqlpp::check_insert_static_set_t; + using ExpectedCheckResult = std::is_same; + static_assert(ExpectedCheckResult::value, "Unexpected check result"); + print_type_on_error(ExpectedCheckResult{}); + + using ReturnType = decltype(insert_into(t).set(assignments...)); + using ExpectedReturnType = + sqlpp::logic::all_t::value>; + static_assert(ExpectedReturnType::value, "Unexpected return type"); + print_type_on_error(ExpectedReturnType{}); + } + + // column alpha is not allowed, column gamma is required + void static_set() + { + // OK + set_static_check(t.gamma = true); + set_static_check(t.beta = "fortytwo", t.gamma = true); + set_static_check(t.beta = "fortytwo", t.gamma = true, t.delta = 42); + set_static_check(t.delta = 42, t.beta = "fortytwo", t.gamma = true); + set_static_check(t.delta = 42, t.gamma = true, t.beta = "fortytwo"); + set_static_check(t.gamma = true, t.delta = 42, t.beta = "fortytwo"); + + // Try setting alpha + set_static_check(t.alpha = 17, t.beta = "whatever"); + set_static_check(t.beta = "whatever", t.alpha = 17); + + // Try omitting gamma + set_static_check(t.delta = 42); + set_static_check(t.beta = "whatever"); + + // Try no arguments + set_static_check(); + + // Try none-assignment arguments + set_static_check(t.delta == 42, t.delta = 42, t.beta = "fortytwo", + t.gamma = true); + set_static_check(17, t.delta = 42, t.beta = "fortytwo", t.gamma = true); + set_static_check(t.delta = 42, t.beta = "fortytwo", t.gamma = true, "EEEK"); + + // Try duplicates + set_static_check(t.delta = 41, t.delta = 42, t.beta = "fortytwo", + t.gamma = true); + set_static_check(t.beta = "fortyone", t.delta = 41, t.beta = "fortytwo", + t.gamma = true); + set_static_check(t.gamma = false, t.delta = 41, t.beta = "fortytwo", + t.gamma = true); + + // Try multiple tables + set_static_check(f.omega = 41, t.gamma = true); + } +} + +int main(int, char**) +{ + static_set(); +} diff --git a/tests/MockDb.h b/tests/MockDb.h index 88a1c47a..2611add7 100644 --- a/tests/MockDb.h +++ b/tests/MockDb.h @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include