From 4515235a7271ec6eab883c2851257f94fc4b54bc Mon Sep 17 00:00:00 2001 From: Ilia Udalov Date: Thu, 19 Jan 2017 01:36:41 +0300 Subject: [PATCH] C++ test initial support with gtest framework --- .gitmodules | 3 ++ CMakeLists.txt | 22 ++++++++++- tests/gtest | 1 + tests/shared-table.cpp | 90 +++++++++++++++++++++++------------------- tests/test_main.cpp | 6 +++ 5 files changed, 79 insertions(+), 43 deletions(-) create mode 160000 tests/gtest create mode 100644 tests/test_main.cpp diff --git a/.gitmodules b/.gitmodules index 6ad9de7..0963394 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "src/sol"] path = src/sol url = https://github.com/ThePhD/sol2.git +[submodule "tests/gtest"] + path = tests/gtest + url = https://github.com/google/googletest.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d585c3..c1a767e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,11 @@ FILE(GLOB SOURCES src/*.cpp src/*.h) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build) +if(APPLE) + # Supress CMP0042 + set(CMAKE_MACOSX_RPATH 1) +endif() + add_library(woofer SHARED ${SOURCES}) target_link_libraries(woofer -lpthread ${LUA_LIBRARY}) @@ -21,10 +26,23 @@ set(ENABLE_WARNINGS "-Wall -Wextra -pedantic") set(BUILD_FLAVOR "-O3 -UNDEBUG") set_target_properties(woofer PROPERTIES COMPILE_FLAGS "${ENABLE_WARNINGS} ${GENERAL} ${BUILD_FLAVOR}") +#---------- +# TESTS --- +#---------- + +FILE(GLOB TEST_SOURCES tests/*.cpp) +set(GTEST_DIR tests/gtest/googletest) + +include_directories(${GTEST_DIR}/include ${GTEST_DIR}) +add_executable(tests ${TEST_SOURCES} ${GTEST_DIR}/src/gtest-all.cc) +target_link_libraries(tests woofer) + +set_target_properties(tests PROPERTIES COMPILE_FLAGS "${ENABLE_WARNINGS} ${GENERAL} ${BUILD_FLAVOR}") + #---------- # INSTALL - #---------- -FILE(GLOB TESTS tests/*) +FILE(GLOB TESTS tests/*.lua) FILE(GLOB LUA_SOURCES lua-api/*.lua) -install(FILES ${TESTS} ${LUA_SOURCES} DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) \ No newline at end of file +install(FILES ${TESTS} ${LUA_SOURCES} DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) diff --git a/tests/gtest b/tests/gtest new file mode 160000 index 0000000..5e7fd50 --- /dev/null +++ b/tests/gtest @@ -0,0 +1 @@ +Subproject commit 5e7fd50e17b6edf1cadff973d0ec68966cf3265e diff --git a/tests/shared-table.cpp b/tests/shared-table.cpp index 7f85c35..d2acc91 100644 --- a/tests/shared-table.cpp +++ b/tests/shared-table.cpp @@ -1,18 +1,26 @@ -#include +#include #include "shared-table.h" -#include "lua-utils.h" - -#include using namespace core; -BOOST_AUTO_TEST_CASE(singleThreadSet) { +namespace { + +void bootstrapState(sol::state& lua) { + lua.open_libraries( + sol::lib::base, + sol::lib::string + ); + SharedTable::bind(lua); +} + +} + +TEST(sharedTable, singleThreadSet) { + SharedTable st; sol::state lua; bootstrapState(lua); - SharedTable st; - lua["st"] = &st; auto res1 = lua.script(R"( @@ -23,14 +31,14 @@ st.del = "secret" st.del = nil )"); if (!res1.valid()) { - BOOST_FAIL("Set res1 failed"); + FAIL() << "Set res1 failed"; } - BOOST_CHECK(lua["st"]["fst"] == std::string("first")); - BOOST_CHECK(lua["st"]["snd"] == (double)2); - BOOST_CHECK(lua["st"]["thr"] == true); - BOOST_CHECK(lua["st"]["del"] == sol::nil); - BOOST_CHECK(lua["st"]["nex"] == sol::nil); + ASSERT_EQ(lua["st"]["fst"], std::string("first")); + ASSERT_EQ(lua["st"]["snd"], (double)2); + ASSERT_EQ(lua["st"]["thr"], true); + ASSERT_EQ(lua["st"]["del"], sol::nil); + ASSERT_EQ(lua["st"]["nex"], sol::nil); auto res2 = lua.script(R"( st[1] = 3 @@ -41,30 +49,30 @@ st[42] = nil st.deleted = st[42] == nil )"); if (!res2.valid()) { - BOOST_FAIL("Set res2 failed"); + FAIL() << "Set res2 failed"; } - BOOST_CHECK(lua["st"][1] == 3); - BOOST_CHECK(lua["st"][2] == std::string("number")); - BOOST_CHECK(lua["st"][-1] == false); - BOOST_CHECK(lua["st"]["deleted"] == true); + ASSERT_EQ(lua["st"][1], 3); + ASSERT_EQ(lua["st"][2], std::string("number")); + ASSERT_EQ(lua["st"][-1], false); + ASSERT_EQ(lua["st"]["deleted"], true); auto res3 = lua.script(R"( st[true] = false st[false] = 9 )"); if (!res3.valid()) { - BOOST_FAIL("Set res3 failed"); + FAIL() << "Set res3 failed"; } - BOOST_CHECK(lua["st"][true] == false); - BOOST_CHECK(lua["st"][false] == 9); + ASSERT_EQ(lua["st"][true], false); + ASSERT_EQ(lua["st"][false], 9); } -BOOST_AUTO_TEST_CASE(asGlobalTable) { +TEST(sharedTable, asGlobalTable) { sol::state lua; SharedTable st; - bootstrapState(lua); + SharedTable::bind(lua); lua["st"] = &st; @@ -75,12 +83,12 @@ b = false s = "Oo" )"); - BOOST_CHECK(lua["n"] == 1); - BOOST_CHECK(lua["b"] == false); - BOOST_CHECK(lua["s"] == std::string("Oo")); + ASSERT_EQ(lua["n"], 1); + ASSERT_EQ(lua["b"], false); + ASSERT_EQ(lua["s"], std::string("Oo")); } -BOOST_AUTO_TEST_CASE(severalStates) { +TEST(sharedTable, severalStates) { sol::state lua1, lua2; bootstrapState(lua1); bootstrapState(lua2); @@ -96,19 +104,19 @@ cats.sparky = false cats.wow = 3 )"); - BOOST_CHECK(lua2["dogs"]["fluffy"] == std::string("gav")); - BOOST_CHECK(lua2["dogs"]["sparky"] == false); - BOOST_CHECK(lua2["dogs"]["wow"] == 3); + ASSERT_EQ(lua2["dogs"]["fluffy"], std::string("gav")); + ASSERT_EQ(lua2["dogs"]["sparky"], false); + ASSERT_EQ(lua2["dogs"]["wow"], 3); } -BOOST_AUTO_TEST_CASE(multipleThreads) { +TEST(sharedTable, multipleThreads) { SharedTable st; std::vector threads; threads.emplace_back([&](){ sol::state lua; - bootstrapState(lua); + bootstrapState(lua);; lua["st"] = &st; lua.script(R"( while not st.ready do end @@ -140,12 +148,12 @@ st.thr = true)"); for(auto& thread : threads) { thread.join(); } - BOOST_CHECK(lua["st"]["fst"] == true); - BOOST_CHECK(lua["st"]["snd"] == true); - BOOST_CHECK(lua["st"]["thr"] == true); + ASSERT_EQ(lua["st"]["fst"], true); + ASSERT_EQ(lua["st"]["snd"], true); + ASSERT_EQ(lua["st"]["thr"], true); } -BOOST_AUTO_TEST_CASE(nestedTables) { +TEST(sharedTable, nestedTables) { SharedTable recursive, st1, st2; sol::state lua; bootstrapState(lua); @@ -160,11 +168,11 @@ st1.proxy.value = true recursive.next = recursive recursive.val = "yes" )"); - BOOST_CHECK(lua["st2"]["value"] == true); - BOOST_CHECK(lua["recursive"]["next"]["next"]["next"]["val"] == std::string("yes")); + ASSERT_EQ(lua["st2"]["value"], true); + ASSERT_EQ(lua["recursive"]["next"]["next"]["next"]["val"], std::string("yes")); } -BOOST_AUTO_TEST_CASE(playingWithFunctions) { +TEST(sharedTable, playingWithFunctions) { SharedTable st; sol::state lua; bootstrapState(lua); @@ -180,7 +188,7 @@ st.fn() )"); sol::function sf = lua["st"]["fn"]; - BOOST_CHECK((bool)sf()); + ASSERT_TRUE((bool)sf()); sol::state lua2; bootstrapState(lua2); @@ -194,5 +202,5 @@ end sol::function sf2 = lua["st"]["fn2"]; - BOOST_CHECK(sf2(std::string("SUCCESS")).get() == std::string("*SUCCESS*")); + ASSERT_EQ(sf2(std::string("SUCCESS")).get(), std::string("*SUCCESS*")); } diff --git a/tests/test_main.cpp b/tests/test_main.cpp new file mode 100644 index 0000000..b42b721 --- /dev/null +++ b/tests/test_main.cpp @@ -0,0 +1,6 @@ +#include "gtest/gtest.h" + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file