diff --git a/CMakeLists.txt b/CMakeLists.txt index 416fcac6..0f033171 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ target_compile_features(sqlpp11 INTERFACE endif () add_subdirectory(tests) +add_subdirectory(test_static_asserts) add_subdirectory(test_constraints) add_subdirectory(examples) diff --git a/test_static_asserts/CMakeLists.txt b/test_static_asserts/CMakeLists.txt new file mode 100644 index 00000000..8bff6904 --- /dev/null +++ b/test_static_asserts/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright (c) 2013-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. + +function(test_compile name) + set(target sqlpp11_${name}) + add_executable(${target} ${name}.cpp) + target_link_libraries(${target} PRIVATE sqlpp11 sqlpp11_testing) +endfunction() + +test_compile(aggregates) + diff --git a/tests/Aggregates.cpp b/test_static_asserts/aggregates.cpp similarity index 55% rename from tests/Aggregates.cpp rename to test_static_asserts/aggregates.cpp index ab872d4f..65131d90 100644 --- a/tests/Aggregates.cpp +++ b/test_static_asserts/aggregates.cpp @@ -66,45 +66,67 @@ namespace sqlpp } } -SQLPP_ALIAS_PROVIDER(whatever); - -int Aggregates(int, char**) +namespace { + SQLPP_ALIAS_PROVIDER(whatever); using sqlpp::test::run_check; - - // test::TabFoo f; - test::TabBar t; + static constexpr auto t = test::TabBar{}; // If there is no group_by, we can select whatever we want - run_check(select(all_of(t)).from(t).where(true)); - run_check(select(t.alpha).from(t).where(true)); - run_check(select(count(t.alpha)).from(t).where(true)); + void no_group_by() + { + run_check(select(all_of(t)).from(t).where(true)); + run_check(select(t.alpha).from(t).where(true)); + run_check(select(count(t.alpha)).from(t).where(true)); + } + + // If there is a dynamic group_by, we can still select whatever we want + // because there is no way of knowing which expressions might have been added dynamically + void dynamic_group_by() + { + run_check(select(all_of(t)).from(t).where(true)); + run_check(select(t.alpha).from(t).where(true)); + run_check(select(count(t.alpha)).from(t).where(true)); + } // If there is a static group_by, selected columns must be made of group_by expressions, or aggregate expression (e.g. // count(t.id)) or values to be valid - run_check(select(t.alpha).from(t).where(true).group_by(t.alpha)); - run_check(select((t.alpha + 42).as(whatever)).from(t).where(true).group_by(t.alpha)); - run_check(select((t.alpha + 42).as(whatever)).from(t).where(true).group_by(t.alpha, t.alpha + t.delta * 17)); - run_check( - select((t.alpha + t.delta * 17).as(whatever)).from(t).where(true).group_by(t.alpha, t.alpha + t.delta * 17)); - run_check(select((t.beta + "fortytwo").as(whatever)).from(t).where(true).group_by(t.beta)); + void static_group_by_ok() + { + run_check(select(t.alpha).from(t).where(true).group_by(t.alpha)); + run_check(select((t.alpha + 42).as(whatever)).from(t).where(true).group_by(t.alpha)); + run_check(select((t.alpha + 42).as(whatever)).from(t).where(true).group_by(t.alpha, t.alpha + t.delta * 17)); + run_check( + select((t.alpha + t.delta * 17).as(whatever)).from(t).where(true).group_by(t.alpha, t.alpha + t.delta * 17)); + run_check(select((t.beta + "fortytwo").as(whatever)).from(t).where(true).group_by(t.beta)); - run_check(select(avg(t.alpha)).from(t).where(true).group_by(t.beta)); - run_check(select(count(t.alpha)).from(t).where(true).group_by(t.beta)); - run_check(select(max(t.alpha)).from(t).where(true).group_by(t.beta)); - run_check(select(min(t.alpha)).from(t).where(true).group_by(t.beta)); - run_check(select(sum(t.alpha)).from(t).where(true).group_by(t.beta)); + run_check(select(avg(t.alpha)).from(t).where(true).group_by(t.beta)); + run_check(select(count(t.alpha)).from(t).where(true).group_by(t.beta)); + run_check(select(max(t.alpha)).from(t).where(true).group_by(t.beta)); + run_check(select(min(t.alpha)).from(t).where(true).group_by(t.beta)); + run_check(select(sum(t.alpha)).from(t).where(true).group_by(t.beta)); - run_check(select((t.alpha + count(t.delta)).as(whatever)).from(t).where(true).group_by(t.alpha)); + run_check(select((t.alpha + count(t.delta)).as(whatever)).from(t).where(true).group_by(t.alpha)); - run_check(select(sqlpp::value(1).as(whatever)).from(t).where(true).group_by(t.alpha)); - run_check(select(sqlpp::value("whatever").as(whatever)).from(t).where(true).group_by(t.alpha)); + run_check(select(sqlpp::value(1).as(whatever)).from(t).where(true).group_by(t.alpha)); + run_check(select(sqlpp::value("whatever").as(whatever)).from(t).where(true).group_by(t.alpha)); + } - // Otherwise, they are invalid - run_check(select(t.beta).from(t).where(true).group_by(t.alpha)); - run_check(select((t.alpha + t.delta).as(whatever)).from(t).where(true).group_by(t.alpha)); - run_check( - select((t.alpha + t.delta).as(whatever)).from(t).where(true).group_by(t.alpha, t.alpha + t.delta * 17)); - - return 0; + // Failures with static group_by and selected non-aggregates or incorrect aggregates + void static_group_by_nok() + { + run_check(select(t.beta).from(t).where(true).group_by(t.alpha)); + run_check( + select((t.alpha + t.delta).as(whatever)).from(t).where(true).group_by(t.alpha)); + run_check( + select((t.alpha + t.delta).as(whatever)).from(t).where(true).group_by(t.alpha, t.alpha + t.delta * 17)); + } +} + +int main(int, char**) +{ + no_group_by(); + dynamic_group_by(); + static_group_by_ok(); + static_group_by_nok(); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 87552173..66ba4a0f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -30,7 +30,6 @@ target_compile_options(sqlpp11_testing INTERFACE -Wall -Wextra -pedantic) endif () set(test_names - Aggregates BooleanExpression CustomQuery Interpret