diff --git a/.travis.yml b/.travis.yml index f2ccad57..c9d8325d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,6 +47,11 @@ install: before_script: - mkdir build - cd build + - if [[ "$CONFIG" = "Debug" && "$TRAVIS_OS_NAME" = "linux" ]]; then + cp -r ../scripts/ . && + cp -r ../test_scripts/ . && + sudo apt-get install python-pyparsing; + fi - if [[ "$CXX" = "g++" && "$CONFIG" = "Debug" && "$TRAVIS_OS_NAME" = "linux" ]]; then export CXXFLAGS="--coverage"; fi - cmake .. -DCMAKE_BUILD_TYPE=$CONFIG -DCMAKE_PREFIX_PATH=$PWD/../date diff --git a/CMakeLists.txt b/CMakeLists.txt index d7767a8b..588002d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,4 +109,5 @@ add_subdirectory(test_types) add_subdirectory(test_serializer) add_subdirectory(test_static_asserts) add_subdirectory(test_constraints) +add_subdirectory(test_scripts) add_subdirectory(examples) diff --git a/test_scripts/CMakeLists.txt b/test_scripts/CMakeLists.txt new file mode 100644 index 00000000..84d29a4e --- /dev/null +++ b/test_scripts/CMakeLists.txt @@ -0,0 +1,72 @@ + +# Copyright (c) 2013-2016, Roland Bock, Alexey Elymanov +# 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(FindPythonInterp) +if (${PYTHONINTERP_FOUND}) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "import pyparsing" + RESULT_VARIABLE PythonRESULT + OUTPUT_VARIABLE PythonOUTPUT + ERROR_VARIABLE PythonERROR + ) + if (${PythonRESULT}) + message( STATUS "Pyparsing is not installed." ${PythonRESULT} ) + else() + message( STATUS "Pyparsing is installed: Enabling sql2ddl tests." ) + + set(test_scripts_names ddl2cpp) + #create header for inclusion, we don't want to depend on shell scripts + file(WRITE ddl2cpp_test.h " +#ifndef SQLPP_TEST_DDL2CPP_TEST_H +#define SQLPP_TEST_DDL2CPP_TEST +#include +std::string test_scripts_python_path = \"${PYTHON_EXECUTABLE}\"; +" ) +#some other definitions goes here +#... +#close header + file(APPEND ddl2cpp_test.h " +#endif +" ) + + create_test_sourcelist(test_scripts_sources test_scripts_main.cpp ${test_scripts_names}) + add_executable(sqlpp11_test_scripts ${test_scripts_sources}) + target_link_libraries(sqlpp11_test_scripts PRIVATE sqlpp11 sqlpp11_testing) + + foreach(test_scripts IN LISTS test_scripts_names) + add_test(NAME sqlpp11.test_scripts.${test_scripts} + COMMAND sqlpp11_test_scripts ${test_scripts} + ) + endforeach() + + endif() + #MESSAGE( STATUS "Python found:" ${PythonRESULT} ) + #MESSAGE( STATUS "Python found:" ${PythonOUTPUT} ) + #MESSAGE( STATUS "Python found:" ${PythonERROR} ) +endif() + + + diff --git a/test_scripts/ddl2cpp.cpp b/test_scripts/ddl2cpp.cpp new file mode 100644 index 00000000..520e9ec5 --- /dev/null +++ b/test_scripts/ddl2cpp.cpp @@ -0,0 +1,32 @@ +#include "ddl2cpp_util.h" + +int ddl2cpp(int, char* []) +{ + +#ifndef __MACH__ + std::ifstream file("../scripts/ddl2cpp"); + if (!file) + { + std::cout << "script tests should be started from the top level sqlpp11 directory. Where scripts/ dir is found\n"; + exit(1); + } + + assert(testSqlFile ("../test_scripts/ddl2cpp_sample_good.sql") == 0); + assert(testSqlFile ("../test_scripts/ddl2cpp_sample_bad.sql") > 0); + + /* maybe todo 1: test compile / use db_mock, for now we're just checking that ddl2cpp generates header without errors + */ + /* + MockDb db = {}; + MockDb::_serializer_context_t printer = {}; + + const auto f = test::TabFoo{}; + const auto t = test::TabBar{}; + const auto tab_a = f.as(sqlpp::alias::a); + + getColumn(db, t._epsilon); //underscore bug check + */ +#endif + return 0; +} + diff --git a/test_scripts/ddl2cpp_sample_bad.sql b/test_scripts/ddl2cpp_sample_bad.sql new file mode 100644 index 00000000..5c7c02f6 --- /dev/null +++ b/test_scripts/ddl2cpp_sample_bad.sql @@ -0,0 +1,18 @@ +TOTAL SQL GIBBERISH HERE +CREATETABLE tab_foo +(gdfgdsf + delta varchar(255, + _epsilon bigint, + `omega` double +); + +CREATE TABLE tab_bar + + alpha bigint AUTO_INCREMENT, + . 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 PRULL, + delta int +) + diff --git a/test_scripts/ddl2cpp_sample_good.sql b/test_scripts/ddl2cpp_sample_good.sql new file mode 100644 index 00000000..b478567c --- /dev/null +++ b/test_scripts/ddl2cpp_sample_good.sql @@ -0,0 +1,41 @@ +/* + * 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. + */ + +CREATE TABLE tab_foo +( + delta varchar(255), + _epsilon bigint, + `omega` double +); + +CREATE TABLE tab_bar +( + alpha bigint AUTO_INCREMENT, + beta varchar(255) NULL DEFAULT "", + gamma bool NOT NULL, + delta int +); + diff --git a/test_scripts/ddl2cpp_util.h b/test_scripts/ddl2cpp_util.h new file mode 100644 index 00000000..9b5c3afe --- /dev/null +++ b/test_scripts/ddl2cpp_util.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2013-2015, Roland Bock, Alexey Elymanov + * 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" //todo 1 +#include +#include +#include +#include +#include "ddl2cpp_test.h" +namespace { + int testSqlFile(const std::string pathToSqlFile) { + +#if defined _WIN64 || defined _WIN32 + std::string nullOutput = " > nul 2>&1"; +#else + std::string nullOutput = " > /dev/null 2>&1"; +#endif + + nullOutput = ""; + + std::string ddlHeaderPath = "../test_scripts/ddl2cpp_test_result_header"; + + std::string args = + " ../scripts/ddl2cpp -fail-on-parse " + + pathToSqlFile + " " + + ddlHeaderPath + + " ddlcpp2_test_namespace " + + nullOutput; + //test_scripts_python_path is a global variable from ddl2cpp_test.h, which is generated by cmake + auto python_args = test_scripts_python_path + args.c_str(); + return system(python_args.c_str()); + } +} \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b54773b0..df9335c6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -32,7 +32,7 @@ endif () set(test_names BooleanExpression CustomQuery - DateTime + DateTime Interpret Insert Remove