diff --git a/sol.scratch.cpp b/sol.scratch.cpp index b12fb7fa..c5affbdc 100644 --- a/sol.scratch.cpp +++ b/sol.scratch.cpp @@ -1,13 +1,13 @@ +#define CATCH_CONFIG_MAIN +#include #include -#include -#include -std::string free_func_yo() { - std::cout << "free_func_yo()" << std::endl; +std::string free_function() { + std::cout << "free_function()" << std::endl; return "test"; } -struct member_test { +struct object { std::string operator() () { std::cout << "member_test()" << std::endl; @@ -16,32 +16,75 @@ struct member_test { }; -void run_test(sol::state& lua) { +void run_script(sol::state& lua) { lua.script("assert(os.fun() == \"test\")\n" "assert(os.name == \"windows\")"); } -int main( ) { +TEST_CASE( "simple/set_global", "Check if the set_global works properly." ) { sol::state lua; - lua.open_libraries( sol::lib::base, sol::lib::os ); + lua.set( "a", 9 ); + REQUIRE_NOTHROW( lua.script( "if a ~= 9 then error('wrong value') end" ) ); + + lua.set( "d", "hello" ); + REQUIRE_NOTHROW( lua.script( "if d ~= 'hello' then error('expected \\'hello\\', got '.. tostring(d)) end" ) ); + + lua.set( "e", std::string( "hello" ) ); + REQUIRE_NOTHROW( lua.script( "if d ~= 'hello' then error('expected \\'hello\\', got '.. tostring(d)) end" ) ); + + lua.set( "f", true ); + REQUIRE_NOTHROW( lua.script( "if f ~= true then error('wrong value') end" ) ); +} + +TEST_CASE( "simple/get", "Tests if the get function works properly." ) { + sol::state lua; + + lua.script( "a = 9" ); + auto a = lua.get( "a" ); + REQUIRE( a == 9.0 ); + + lua.script( "b = nil" ); + REQUIRE_NOTHROW( auto b = lua.get( "b" ) ); + + lua.script( "d = 'hello'" ); + auto d = lua.get( "d" ); + REQUIRE( d == "hello" ); + + lua.script( "e = true" ); + auto e = lua.get( "e" ); + REQUIRE( e == true ); +} + +TEST_CASE( "simple/addition", "" ) { + sol::state lua; + + lua.set( "b", 0.2 ); + lua.script( "c = 9 + b" ); + auto c = lua.get( "c" ); + + REQUIRE( c == 9.2 ); +} + +/* lua.get( "os" ).set( "name", "windows" ); + SECTION( "" ) lua.get( "os" ).set_function( "fun", [ ] ( ) { std::cout << "stateless lambda()" << std::endl; return "test"; } ); - run_test( lua ); + run_script( lua ); - lua.get( "os" ).set_function( "fun", &free_func_yo ); - run_test( lua ); + lua.get( "os" ).set_function( "fun", &free_function ); + run_script( lua ); // l-value, can optomize - auto lval = member_test( ); - lua.get( "os" ).set_function( "fun", &member_test::operator(), lval ); - run_test( lua ); + auto lval = object( ); + lua.get( "os" ).set_function( "fun", &object::operator(), lval ); + run_script( lua ); // Tests will begin failing here // stateful lambda: non-convertible, unoptomizable @@ -52,15 +95,16 @@ int main( ) { return "test"; } ); - run_test( lua ); + run_script( lua ); // r-value, cannot optomize - lua.get( "os" ).set_function( "fun", &member_test::operator(), member_test( ) ); - run_test( lua ); + lua.get( "os" ).set_function( "fun", &object::operator(), object( ) ); + run_script( lua ); // r-value, cannot optomize - auto rval = member_test( ); - lua.get( "os" ).set_function( "fun", &member_test::operator(), std::move( rval ) ); - run_test( lua ); + auto rval = object( ); + lua.get( "os" ).set_function( "fun", &object::operator(), std::move( rval ) ); + run_script( lua ); -} \ No newline at end of file +} +*/ diff --git a/sol/stack.hpp b/sol/stack.hpp index 1fa8a024..dc8cd811 100644 --- a/sol/stack.hpp +++ b/sol/stack.hpp @@ -45,7 +45,7 @@ inline T get_unsigned(lua_State* L, std::true_type, int index = -1) { template inline T get_unsigned(lua_State* L, std::false_type, int index = -1) { - return lua_tointeger(L, index); + return static_cast( lua_tointeger(L, index) ); } template @@ -62,6 +62,18 @@ inline T get_arithmetic(lua_State* L, std::true_type, int index = -1) { template inline T get_helper(lua_State* L, std::true_type, int index = -1) { + return get_nil(L, std::is_same(), index); +} + +template +inline T get_nil(lua_State* L, std::true_type, int index = -1) { + if (lua_isnil(L, index) == 0) + throw sol::sol_error("not nil"); + return nil_t{}; +} + +template +inline T get_nil(lua_State* L, std::false_type, int index = -1) { // T is a class type return T(L, index); }