wrappers.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include <catch.hpp>
  2. #include <luwra.hpp>
  3. static int dummy_void_result = 0;
  4. static void dummy1() { dummy_void_result = 1337; }
  5. static void dummy2(int a) { dummy_void_result = 1337 - a; }
  6. static void dummy3(int a, int b) { dummy_void_result = 1337 * a + b; }
  7. static int dummy4() { return 1337; }
  8. static int dummy5(int a) { return 1337 - a; }
  9. static int dummy6(int a, int b) { return 1337 * a + b; }
  10. #define LUWRA_GW_TEST_PTRS(param, type) \
  11. { \
  12. luwra::CFunction wrap_auto = LUWRA_WRAP(param); \
  13. luwra::CFunction wrap_manual = &luwra::internal::GenericWrapper<type>::invoke<&param>; \
  14. REQUIRE(wrap_auto != nullptr); \
  15. REQUIRE(wrap_manual != nullptr); \
  16. REQUIRE(wrap_auto == wrap_manual); \
  17. }
  18. #define LUWRA_GW_TEST_FUNC_VOID(func, params) \
  19. { \
  20. dummy_void_result = 0; \
  21. func params; \
  22. \
  23. int expected_result = dummy_void_result; \
  24. \
  25. luwra::StateWrapper state; \
  26. state.set("func", LUWRA_WRAP(func)); \
  27. \
  28. dummy_void_result = 0; \
  29. REQUIRE(state.runString("func" #params) == LUA_OK); \
  30. \
  31. REQUIRE(expected_result == dummy_void_result); \
  32. }
  33. #define LUWRA_GW_TEST_FUNC_NONVOID(func, params) \
  34. { \
  35. int expected_result = func params; \
  36. \
  37. luwra::StateWrapper state; \
  38. state.set("func", LUWRA_WRAP(func)); \
  39. \
  40. REQUIRE(state.runString("return func" #params) == LUA_OK); \
  41. int given_result = luwra::read<int>(state, -1); \
  42. \
  43. REQUIRE(expected_result == given_result); \
  44. }
  45. TEST_CASE("GenericWrapper<R(A...)>") {
  46. LUWRA_GW_TEST_PTRS(dummy1, void());
  47. LUWRA_GW_TEST_PTRS(dummy2, void(int));
  48. LUWRA_GW_TEST_PTRS(dummy3, void(int, int));
  49. LUWRA_GW_TEST_PTRS(dummy4, int());
  50. LUWRA_GW_TEST_PTRS(dummy5, int(int));
  51. LUWRA_GW_TEST_PTRS(dummy6, int(int, int));
  52. LUWRA_GW_TEST_FUNC_VOID(dummy1, ());
  53. LUWRA_GW_TEST_FUNC_VOID(dummy2, (13));
  54. LUWRA_GW_TEST_FUNC_VOID(dummy3, (13, 37));
  55. LUWRA_GW_TEST_FUNC_NONVOID(dummy4, ());
  56. LUWRA_GW_TEST_FUNC_NONVOID(dummy5, (13));
  57. LUWRA_GW_TEST_FUNC_NONVOID(dummy6, (13, 37));
  58. }
  59. struct Dummy {
  60. int field;
  61. const int const_field;
  62. Dummy(int a = 0, int b = 0):
  63. field(a),
  64. const_field(b)
  65. {}
  66. void dummy1() { field = 1337; }
  67. void dummy2(int a) { field = 1337 - a; }
  68. void dummy3(int a, int b) { field = 1337 * a + b; }
  69. int dummy4() { return 1337; }
  70. int dummy5(int a) { return 1337 - a; }
  71. int dummy6(int a, int b) { return 1337 * a + b; }
  72. void dummy7() volatile { field = 1337; }
  73. void dummy8(int a) volatile { field = 1337 - a; }
  74. void dummy9(int a, int b) volatile { field = 1337 * a + b; }
  75. int dummy10() volatile { return 1337; }
  76. int dummy11(int a) volatile { return 1337 - a; }
  77. int dummy12(int a, int b) volatile { return 1337 * a + b; }
  78. int dummy13() const { return 1337; }
  79. int dummy14(int a) const { return 1337 - a; }
  80. int dummy15(int a, int b) const { return 1337 * a + b; }
  81. int dummy16() const volatile { return 1337; }
  82. int dummy17(int a) const volatile { return 1337 - a; }
  83. int dummy18(int a, int b) const volatile { return 1337 * a + b; }
  84. };
  85. #define LUWRA_GW_TEST_METH_VOID(meth, params) \
  86. { \
  87. Dummy d1; \
  88. d1.meth params; \
  89. \
  90. luwra::StateWrapper state; \
  91. state.set("d2", Dummy()); \
  92. state.set("meth", LUWRA_WRAP(__LUWRA_NS_RESOLVE(Dummy, meth))); \
  93. \
  94. Dummy& d2 = state.get<Dummy&>("d2"); \
  95. \
  96. REQUIRE(state.runString("(function (...) meth(d2, ...) end)" #params) == LUA_OK); \
  97. REQUIRE(d1.field == d2.field); \
  98. }
  99. #define LUWRA_GW_TEST_METH_NONVOID(meth, params) \
  100. { \
  101. Dummy d1; \
  102. int expected_result = d1.meth params; \
  103. \
  104. luwra::StateWrapper state; \
  105. state.set("d2", Dummy()); \
  106. state.set("meth", LUWRA_WRAP(__LUWRA_NS_RESOLVE(Dummy, meth))); \
  107. \
  108. REQUIRE(state.runString("return (function (...) return meth(d2, ...) end)" #params) == LUA_OK); \
  109. int given_result = luwra::read<int>(state, -1); \
  110. REQUIRE(expected_result == given_result); \
  111. }
  112. TEST_CASE("R (T::*)(A...)") {
  113. LUWRA_GW_TEST_PTRS(Dummy::dummy1, void (Dummy::*)());
  114. LUWRA_GW_TEST_PTRS(Dummy::dummy2, void (Dummy::*)(int));
  115. LUWRA_GW_TEST_PTRS(Dummy::dummy3, void (Dummy::*)(int, int));
  116. LUWRA_GW_TEST_PTRS(Dummy::dummy4, int (Dummy::*)());
  117. LUWRA_GW_TEST_PTRS(Dummy::dummy5, int (Dummy::*)(int));
  118. LUWRA_GW_TEST_PTRS(Dummy::dummy6, int (Dummy::*)(int, int));
  119. LUWRA_GW_TEST_METH_VOID(dummy1, ());
  120. LUWRA_GW_TEST_METH_VOID(dummy2, (13));
  121. LUWRA_GW_TEST_METH_VOID(dummy3, (13, 37));
  122. LUWRA_GW_TEST_METH_NONVOID(dummy4, ());
  123. LUWRA_GW_TEST_METH_NONVOID(dummy5, (13));
  124. LUWRA_GW_TEST_METH_NONVOID(dummy6, (13, 37));
  125. }
  126. TEST_CASE("R (T::*)(A...) volatile") {
  127. LUWRA_GW_TEST_PTRS(Dummy::dummy7, void (Dummy::*)() volatile);
  128. LUWRA_GW_TEST_PTRS(Dummy::dummy8, void (Dummy::*)(int) volatile);
  129. LUWRA_GW_TEST_PTRS(Dummy::dummy9, void (Dummy::*)(int, int) volatile);
  130. LUWRA_GW_TEST_PTRS(Dummy::dummy10, int (Dummy::*)() volatile);
  131. LUWRA_GW_TEST_PTRS(Dummy::dummy11, int (Dummy::*)(int) volatile);
  132. LUWRA_GW_TEST_PTRS(Dummy::dummy12, int (Dummy::*)(int, int) volatile);
  133. LUWRA_GW_TEST_METH_VOID(dummy7, ());
  134. LUWRA_GW_TEST_METH_VOID(dummy8, (13));
  135. LUWRA_GW_TEST_METH_VOID(dummy9, (13, 37));
  136. LUWRA_GW_TEST_METH_NONVOID(dummy10, ());
  137. LUWRA_GW_TEST_METH_NONVOID(dummy11, (13));
  138. LUWRA_GW_TEST_METH_NONVOID(dummy12, (13, 37));
  139. }
  140. TEST_CASE("R (T::*)(A...) const") {
  141. LUWRA_GW_TEST_PTRS(Dummy::dummy13, int (Dummy::*)() const);
  142. LUWRA_GW_TEST_PTRS(Dummy::dummy14, int (Dummy::*)(int) const);
  143. LUWRA_GW_TEST_PTRS(Dummy::dummy15, int (Dummy::*)(int, int) const);
  144. LUWRA_GW_TEST_METH_NONVOID(dummy13, ());
  145. LUWRA_GW_TEST_METH_NONVOID(dummy14, (13));
  146. LUWRA_GW_TEST_METH_NONVOID(dummy15, (13, 37));
  147. }
  148. TEST_CASE("R (T::*)(A...) const volatile") {
  149. LUWRA_GW_TEST_PTRS(Dummy::dummy16, int (Dummy::*)() const volatile);
  150. LUWRA_GW_TEST_PTRS(Dummy::dummy17, int (Dummy::*)(int) const volatile);
  151. LUWRA_GW_TEST_PTRS(Dummy::dummy18, int (Dummy::*)(int, int) const volatile);
  152. LUWRA_GW_TEST_METH_NONVOID(dummy16, ());
  153. LUWRA_GW_TEST_METH_NONVOID(dummy17, (13));
  154. LUWRA_GW_TEST_METH_NONVOID(dummy18, (13, 37));
  155. }
  156. TEST_CASE("const R T::*") {
  157. LUWRA_GW_TEST_PTRS(Dummy::const_field, const int (Dummy::*));
  158. luwra::StateWrapper state;
  159. state.set("dummy", Dummy(13, 37));
  160. state.set("accessor", LUWRA_WRAP(Dummy::const_field));
  161. Dummy& dummy = state.get<Dummy&>("dummy");
  162. REQUIRE(dummy.const_field == 37);
  163. REQUIRE(state.runString("return accessor(dummy)") == LUA_OK);
  164. REQUIRE(luwra::read<int>(state, -1) == dummy.const_field);
  165. }
  166. TEST_CASE("R T::*") {
  167. LUWRA_GW_TEST_PTRS(Dummy::field, int (Dummy::*));
  168. luwra::StateWrapper state;
  169. state.set("accessor", LUWRA_WRAP(Dummy::field));
  170. state.set("dummy", Dummy(13, 37));
  171. Dummy& dummy = state.get<Dummy&>("dummy");
  172. REQUIRE(dummy.field == 13);
  173. REQUIRE(state.runString("return accessor(dummy)") == LUA_OK);
  174. REQUIRE(luwra::read<int>(state, -1) == dummy.field);
  175. REQUIRE(state.runString("accessor(dummy, 1337)") == LUA_OK);
  176. REQUIRE(dummy.field == 1337);
  177. }