libshit

Just some random shit
git clone https://git.neptards.moe/neptards/libshit.git
Log | Files | Refs | Submodules | README | LICENSE

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 }