types.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "catch.hpp"
  2. #include <lua.hpp>
  3. #include <luwra.hpp>
  4. #include <cstring>
  5. #include <string>
  6. #include <utility>
  7. #include <type_traits>
  8. template <typename I>
  9. struct NumericTest {
  10. static
  11. void test(lua_State* state) {
  12. const I max_value = std::numeric_limits<I>::max();
  13. const I min_value = std::numeric_limits<I>::lowest();
  14. const I avg_value = (max_value + min_value) / 2;
  15. // Largest value
  16. REQUIRE(luwra::Value<I>::push(state, max_value) == 1);
  17. REQUIRE(luwra::Value<I>::read(state, -1) == max_value);
  18. lua_pop(state, 1);
  19. // Lowest value
  20. REQUIRE(luwra::Value<I>::push(state, min_value) == 1);
  21. REQUIRE(luwra::Value<I>::read(state, -1) == min_value);
  22. lua_pop(state, 1);
  23. // Average value
  24. REQUIRE(luwra::Value<I>::push(state, avg_value) == 1);
  25. REQUIRE(luwra::Value<I>::read(state, -1) == avg_value);
  26. lua_pop(state, 1);
  27. }
  28. };
  29. struct TautologyTest {
  30. static
  31. void test(lua_State*) {}
  32. };
  33. template <typename B, typename I>
  34. using SelectNumericTest =
  35. typename std::conditional<
  36. luwra::internal::NumericContainedValueBase<I, B>::qualifies,
  37. NumericTest<I>,
  38. TautologyTest
  39. >::type;
  40. TEST_CASE("Test Value specialization for numeric C types", "types_numeric") {
  41. lua_State* state = luaL_newstate();
  42. // Integer-based types
  43. SelectNumericTest<lua_Integer, signed short>::test(state);
  44. SelectNumericTest<lua_Integer, unsigned short>::test(state);
  45. SelectNumericTest<lua_Integer, signed int>::test(state);
  46. SelectNumericTest<lua_Integer, unsigned int>::test(state);
  47. SelectNumericTest<lua_Integer, signed long int>::test(state);
  48. SelectNumericTest<lua_Integer, unsigned long int>::test(state);
  49. SelectNumericTest<lua_Integer, signed long long int>::test(state);
  50. SelectNumericTest<lua_Integer, unsigned long long int>::test(state);
  51. // Number-based types
  52. SelectNumericTest<lua_Number, float>::test(state);
  53. SelectNumericTest<lua_Number, double>::test(state);
  54. SelectNumericTest<lua_Number, long double>::test(state);
  55. lua_close(state);
  56. }
  57. TEST_CASE("Test Value specialization for string types", "types_string") {
  58. lua_State* state = luaL_newstate();
  59. const char* test_cstr = "Luwra Test String";
  60. std::string test_str(test_cstr);
  61. // Safety first
  62. REQUIRE(test_str == test_cstr);
  63. // Push both strings
  64. REQUIRE(luwra::Value<const char*>::push(state, test_cstr) == 1);
  65. REQUIRE(luwra::Value<std::string>::push(state, test_str) == 1);
  66. // They must be equal to Lua
  67. REQUIRE(lua_compare(state, -1, -2, LUA_OPEQ));
  68. // Extraction as C string must not change the string's value
  69. const char* l_cstr1 = luwra::Value<const char*>::read(state, -1);
  70. const char* l_cstr2 = luwra::Value<const char*>::read(state, -2);
  71. REQUIRE(std::strcmp(test_cstr, l_cstr1) == 0);
  72. REQUIRE(std::strcmp(test_cstr, l_cstr2) == 0);
  73. REQUIRE(std::strcmp(test_str.c_str(), l_cstr1) == 0);
  74. REQUIRE(std::strcmp(test_str.c_str(), l_cstr2) == 0);
  75. REQUIRE(std::strcmp(l_cstr1, l_cstr2) == 0);
  76. // Extraction as C++ string must not change the string's value
  77. std::string l_str1 = luwra::Value<std::string>::read(state, -1);
  78. std::string l_str2 = luwra::Value<std::string>::read(state, -2);
  79. REQUIRE(l_str1 == test_cstr);
  80. REQUIRE(l_str2 == test_cstr);
  81. REQUIRE(test_str == l_str1);
  82. REQUIRE(test_str == l_str2);
  83. REQUIRE(l_str1 == l_str2);
  84. lua_pop(state, 2);
  85. lua_close(state);
  86. }