From 67bfb68f070041c500132f1ef64c4a921ba34d8a Mon Sep 17 00:00:00 2001 From: rbock Date: Wed, 9 Mar 2016 21:01:22 +0100 Subject: [PATCH] Added serialize tests for in() --- test_serializer/CMakeLists.txt | 1 + test_serializer/From.cpp | 19 +--------- test_serializer/In.cpp | 65 ++++++++++++++++++++++++++++++++++ test_serializer/compare.h | 50 ++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 test_serializer/In.cpp create mode 100644 test_serializer/compare.h diff --git a/test_serializer/CMakeLists.txt b/test_serializer/CMakeLists.txt index 8d2f1fa3..dc5f015a 100644 --- a/test_serializer/CMakeLists.txt +++ b/test_serializer/CMakeLists.txt @@ -24,6 +24,7 @@ set(test_serializer_names From + In ) create_test_sourcelist(test_serializer_sources test_serializer_main.cpp ${test_serializer_names}) diff --git a/test_serializer/From.cpp b/test_serializer/From.cpp index 1a184354..360de453 100644 --- a/test_serializer/From.cpp +++ b/test_serializer/From.cpp @@ -23,30 +23,13 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "compare.h" #include "Sample.h" -#include "MockDb.h" #include -#include - namespace { MockDb db = {}; - - template - void compare(int lineNo, const Expression& expr, const std::string& expected) - { - MockDb::_serializer_context_t printer = {}; - - const auto result = serialize(expr, printer).str(); - - if (result != expected) - { - std::cerr << __FILE__ << " " << lineNo << '\n' << "Expected: -->|" << expected << "|<--\n" - << "Received: -->|" << result << "|<--\n"; - throw std::runtime_error("unexpected serialization result"); - } - } } int From(int, char* []) diff --git a/test_serializer/In.cpp b/test_serializer/In.cpp new file mode 100644 index 00000000..4319aa10 --- /dev/null +++ b/test_serializer/In.cpp @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#include "compare.h" +#include "Sample.h" +#include + +#include + +namespace +{ + auto getFalse() -> std::string + { + MockDb::_serializer_context_t printer = {}; + return serialize(sqlpp::value(false), printer).str(); + } +} + +int In(int, char* []) +{ + const auto foo = test::TabFoo{}; + const auto bar = test::TabBar{}; + + // Individual values + compare(__LINE__, foo.omega.in(foo.omega), "tab_foo.omega IN(tab_foo.omega)"); + compare(__LINE__, foo.omega.in(foo.omega, bar.alpha), "tab_foo.omega IN(tab_foo.omega,tab_bar.alpha)"); + compare(__LINE__, foo.omega.in(foo.omega, bar.alpha, sqlpp::value(17)), + "tab_foo.omega IN(tab_foo.omega,tab_bar.alpha,17)"); + + // Lists + compare(__LINE__, foo.omega.in(sqlpp::value_list(std::vector{1.7, 2.5, 17., 0.})), + "tab_foo.omega IN(1.7,2.5,17,0)"); + + // Sub select + compare(__LINE__, foo.omega.in(select(bar.alpha).from(bar).unconditionally()), + "tab_foo.omega IN(SELECT tab_bar.alpha FROM tab_bar)"); + + // Empty lists (not normally covered by SQL) + compare(__LINE__, foo.omega.in(), getFalse()); + compare(__LINE__, foo.omega.in(sqlpp::value_list(std::vector{})), getFalse()); + + return 0; +} diff --git a/test_serializer/compare.h b/test_serializer/compare.h new file mode 100644 index 00000000..9709a44c --- /dev/null +++ b/test_serializer/compare.h @@ -0,0 +1,50 @@ +/* + * 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. + */ + +#ifndef SQLPP_TEST_SERIALIZER_H +#define SQLPP_TEST_SERIALIZER_H + +#include "MockDb.h" +#include + +namespace +{ + template + void compare(int lineNo, const Expression& expr, const std::string& expected) + { + MockDb::_serializer_context_t printer = {}; + + const auto result = serialize(expr, printer).str(); + + if (result != expected) + { + std::cerr << __FILE__ << " " << lineNo << '\n' << "Expected: -->|" << expected << "|<--\n" + << "Received: -->|" << result << "|<--\n"; + throw std::runtime_error("unexpected serialization result"); + } + } +} + +#endif