#include "catch.hpp" #include #include #include #include #include #include template struct NumericTest { static void test(lua_State* state) { const I max_value = std::numeric_limits::max(); const I min_value = std::numeric_limits::lowest(); const I avg_value = (max_value + min_value) / 2; // Largest value CHECK(luwra::Value::push(state, max_value) == 1); CHECK(luwra::Value::read(state, -1) == max_value); // Lowest value CHECK(luwra::Value::push(state, min_value) == 1); CHECK(luwra::Value::read(state, -1) == min_value); // Average value CHECK(luwra::Value::push(state, avg_value) == 1); CHECK(luwra::Value::read(state, -1) == avg_value); } }; struct TautologyTest { static void test(lua_State*) {} }; template using SelectNumericTest = typename std::conditional< luwra::internal::NumericContainedValueBase::qualifies, NumericTest, TautologyTest >::type; TEST_CASE("types_numeric") { lua_State* state = luaL_newstate(); // Integer-based types SelectNumericTest::test(state); SelectNumericTest::test(state); SelectNumericTest::test(state); SelectNumericTest::test(state); SelectNumericTest::test(state); SelectNumericTest::test(state); SelectNumericTest::test(state); SelectNumericTest::test(state); // Number-based types SelectNumericTest::test(state); SelectNumericTest::test(state); SelectNumericTest::test(state); lua_close(state); } TEST_CASE("types_string") { lua_State* state = luaL_newstate(); const char* test_cstr = "Luwra Test String"; std::string test_str(test_cstr); // Safety first REQUIRE(test_str == test_cstr); // Push both strings REQUIRE(luwra::Value::push(state, test_cstr) == 1); REQUIRE(luwra::Value::push(state, test_str) == 1); // They must be equal to Lua REQUIRE(luwra::equal(state, -1, -2)); // Extraction as C string must not change the string's value const char* l_cstr1 = luwra::Value::read(state, -1); const char* l_cstr2 = luwra::Value::read(state, -2); REQUIRE(std::strcmp(test_cstr, l_cstr1) == 0); REQUIRE(std::strcmp(test_cstr, l_cstr2) == 0); REQUIRE(std::strcmp(test_str.c_str(), l_cstr1) == 0); REQUIRE(std::strcmp(test_str.c_str(), l_cstr2) == 0); REQUIRE(std::strcmp(l_cstr1, l_cstr2) == 0); // Extraction as C++ string must not change the string's value std::string l_str1 = luwra::Value::read(state, -1); std::string l_str2 = luwra::Value::read(state, -2); REQUIRE(l_str1 == test_cstr); REQUIRE(l_str2 == test_cstr); REQUIRE(test_str == l_str1); REQUIRE(test_str == l_str2); REQUIRE(l_str1 == l_str2); lua_close(state); } TEST_CASE("types_tuple") { lua_State* state = luaL_newstate(); int a = 13; std::string b("Hello"); float c = 0.37; // Push normal tuple auto tuple = std::make_tuple(a, b, c); REQUIRE(luwra::Value::push(state, tuple) == 3); // Push nested tuple auto tuple_nested = std::make_tuple(a, b, c, tuple); REQUIRE(luwra::Value::push(state, tuple_nested) == 6); lua_close(state); } TEST_CASE("types_bool") { lua_State* state = luaL_newstate(); bool value = true; REQUIRE(luwra::Value::push(state, value) == 1); REQUIRE(luwra::Value::read(state, -1) == value); lua_close(state); }