type_traits.cpp (3846B)
1 #include "libshit/lua/type_traits.hpp" 2 3 #include "libshit/doctest.hpp" 4 #include "libshit/lua/base.hpp" 5 6 #include <string> 7 8 namespace Libshit::Lua::Test 9 { 10 TEST_SUITE_BEGIN("Libshit::Lua::TypeTraits"); 11 12 TEST_CASE("random pushes") 13 { 14 State vm; 15 16 vm.Push(15); 17 CHECK(lua_tointeger(vm, -1) == 15); 18 lua_pop(vm, 1); 19 20 vm.Push(3.1415); 21 CHECK(lua_tonumber(vm, -1) == 3.1415); 22 lua_pop(vm, 1); 23 24 vm.Push("hello, world"); 25 CHECK(std::string{lua_tostring(vm, -1)} == "hello, world"); 26 lua_pop(vm, 1); 27 28 vm.Push(true); 29 CHECK(lua_isboolean(vm, -1)); 30 CHECK(lua_toboolean(vm, -1) == true); 31 lua_pop(vm, 1); 32 33 vm.Push<const char*>(nullptr); 34 CHECK(lua_isnil(vm, -1)); 35 lua_pop(vm, 1); 36 37 CHECK(lua_gettop(vm) == 0); 38 } 39 40 TEST_CASE("successful gets") 41 { 42 State vm; 43 44 lua_pushinteger(vm, 12); 45 CHECK(vm.Get<int>() == 12); 46 lua_pop(vm, 1); 47 48 lua_pushnumber(vm, 2.7182); 49 CHECK(vm.Get<double>() == 2.7182); 50 lua_pop(vm, 1); 51 52 lua_pushliteral(vm, "foo"); 53 CHECK(std::string(vm.Get<const char*>()) == "foo"); 54 CHECK(vm.Get<std::string>() == "foo"); 55 lua_pop(vm, 1); 56 57 lua_pushboolean(vm, 0); 58 CHECK(vm.Get<bool>() == false); 59 lua_pop(vm, 1); 60 61 CHECK(lua_gettop(vm) == 0); 62 } 63 64 TEST_CASE("optional vals") 65 { 66 State vm; 67 68 lua_pushinteger(vm, 19); 69 auto opt = vm.Opt<int>(1); 70 REQUIRE(opt); 71 CHECK(*opt == 19); 72 lua_pop(vm, 1); 73 74 REQUIRE(lua_isnone(vm, 1)); 75 opt = vm.Opt<int>(1); 76 CHECK_FALSE(opt); 77 78 lua_pushnil(vm); 79 opt = vm.Opt<int>(1); 80 CHECK_FALSE(opt); 81 lua_pop(vm, 1); 82 83 CHECK(lua_gettop(vm) == 0); 84 } 85 86 TEST_CASE("fail get") 87 { 88 State vm; 89 90 lua_pushboolean(vm, true); 91 LIBSHIT_CHECK_LUA_THROWS( 92 vm, 1, vm.Get<int>(), "invalid lua value: integer expected, got boolean"); 93 94 lua_pushboolean(vm, true); 95 LIBSHIT_CHECK_LUA_THROWS( 96 vm, 1, vm.Get<double>(), "invalid lua value: number expected, got boolean"); 97 98 lua_pushboolean(vm, true); 99 LIBSHIT_CHECK_LUA_THROWS( 100 vm, 1, vm.Get<const char*>(), "invalid lua value: string expected, got boolean"); 101 102 lua_pushboolean(vm, true); 103 LIBSHIT_CHECK_LUA_THROWS( 104 vm, 1, vm.Get<std::string>(), "invalid lua value: string expected, got boolean"); 105 106 lua_pushinteger(vm, 77); 107 LIBSHIT_CHECK_LUA_THROWS( 108 vm, 1, vm.Get<bool>(), "invalid lua value: boolean expected, got number"); 109 } 110 111 TEST_CASE("fail check") 112 { 113 State vm; 114 115 #define BADARG "bad argument #1 to '?' " 116 lua_pushboolean(vm, true); 117 LIBSHIT_CHECK_LUA_THROWS( 118 vm, 1, vm.Check<int>(1), BADARG "(integer expected, got boolean)"); 119 120 lua_pushboolean(vm, true); 121 LIBSHIT_CHECK_LUA_THROWS( 122 vm, 1, vm.Check<double>(1), BADARG "(number expected, got boolean)"); 123 124 lua_pushboolean(vm, true); 125 LIBSHIT_CHECK_LUA_THROWS( 126 vm, 1, vm.Check<const char*>(1), BADARG "(string expected, got boolean)"); 127 128 lua_pushboolean(vm, true); 129 LIBSHIT_CHECK_LUA_THROWS( 130 vm, 1, vm.Check<std::string>(1), BADARG "(string expected, got boolean)"); 131 132 lua_pushinteger(vm, 77); 133 LIBSHIT_CHECK_LUA_THROWS( 134 vm, 1, vm.Check<bool>(1), BADARG "(boolean expected, got number)"); 135 } 136 137 TEST_CASE("opt correct") 138 { 139 State vm; 140 141 lua_pushinteger(vm, 72); 142 auto opt = vm.Opt<int>(1); 143 REQUIRE(opt); 144 CHECK(*opt == 72); 145 lua_pop(vm, 1); 146 147 CHECK(lua_gettop(vm) == 0); 148 } 149 150 TEST_CASE("opt nil/none") 151 { 152 State vm; 153 154 auto opt = vm.Opt<int>(1); 155 CHECK(!opt); 156 157 lua_pushnil(vm); 158 opt = vm.Opt<int>(1); 159 CHECK(!opt); 160 lua_pop(vm, 1); 161 162 CHECK(lua_gettop(vm) == 0); 163 } 164 165 TEST_CASE("opt invalid") 166 { 167 State vm; 168 169 lua_pushliteral(vm, "foo"); 170 LIBSHIT_CHECK_LUA_THROWS( 171 vm, 1, vm.Opt<int>(1), BADARG "(integer expected, got string)"); 172 } 173 #undef BADARG 174 175 TEST_SUITE_END(); 176 }