process.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include <cstdint>
  2. #include <gtest/gtest.h>
  3. #include <entt/process/process.hpp>
  4. struct fake_delta {};
  5. template<typename Delta>
  6. struct fake_process: entt::process<fake_process<Delta>, Delta> {
  7. using process_type = entt::process<fake_process<Delta>, Delta>;
  8. using delta_type = typename process_type::delta_type;
  9. void succeed() noexcept {
  10. process_type::succeed();
  11. }
  12. void fail() noexcept {
  13. process_type::fail();
  14. }
  15. void pause() noexcept {
  16. process_type::pause();
  17. }
  18. void unpause() noexcept {
  19. process_type::unpause();
  20. }
  21. void init() {
  22. init_invoked = true;
  23. }
  24. void succeeded() {
  25. succeeded_invoked = true;
  26. }
  27. void failed() {
  28. failed_invoked = true;
  29. }
  30. void aborted() {
  31. aborted_invoked = true;
  32. }
  33. void update(typename entt::process<fake_process<Delta>, Delta>::delta_type, void *data) {
  34. if(data) {
  35. (*static_cast<int *>(data))++;
  36. }
  37. update_invoked = true;
  38. }
  39. bool init_invoked{};
  40. bool update_invoked{};
  41. bool succeeded_invoked{};
  42. bool failed_invoked{};
  43. bool aborted_invoked{};
  44. };
  45. TEST(Process, Basics) {
  46. fake_process<int> process{};
  47. ASSERT_FALSE(process.alive());
  48. ASSERT_FALSE(process.finished());
  49. ASSERT_FALSE(process.paused());
  50. ASSERT_FALSE(process.rejected());
  51. process.succeed();
  52. process.fail();
  53. process.abort();
  54. process.pause();
  55. process.unpause();
  56. ASSERT_FALSE(process.alive());
  57. ASSERT_FALSE(process.finished());
  58. ASSERT_FALSE(process.paused());
  59. ASSERT_FALSE(process.rejected());
  60. process.tick(0);
  61. ASSERT_TRUE(process.alive());
  62. ASSERT_FALSE(process.finished());
  63. ASSERT_FALSE(process.paused());
  64. ASSERT_FALSE(process.rejected());
  65. process.pause();
  66. ASSERT_TRUE(process.alive());
  67. ASSERT_FALSE(process.finished());
  68. ASSERT_TRUE(process.paused());
  69. ASSERT_FALSE(process.rejected());
  70. process.unpause();
  71. ASSERT_TRUE(process.alive());
  72. ASSERT_FALSE(process.finished());
  73. ASSERT_FALSE(process.paused());
  74. ASSERT_FALSE(process.rejected());
  75. process.fail();
  76. ASSERT_FALSE(process.alive());
  77. ASSERT_FALSE(process.finished());
  78. ASSERT_FALSE(process.paused());
  79. ASSERT_FALSE(process.rejected());
  80. process.tick(0);
  81. ASSERT_FALSE(process.alive());
  82. ASSERT_FALSE(process.finished());
  83. ASSERT_FALSE(process.paused());
  84. ASSERT_TRUE(process.rejected());
  85. }
  86. TEST(Process, Succeeded) {
  87. fake_process<fake_delta> process{};
  88. process.tick({});
  89. process.tick({});
  90. process.succeed();
  91. process.tick({});
  92. ASSERT_FALSE(process.alive());
  93. ASSERT_TRUE(process.finished());
  94. ASSERT_FALSE(process.paused());
  95. ASSERT_FALSE(process.rejected());
  96. ASSERT_TRUE(process.init_invoked);
  97. ASSERT_TRUE(process.update_invoked);
  98. ASSERT_TRUE(process.succeeded_invoked);
  99. ASSERT_FALSE(process.failed_invoked);
  100. ASSERT_FALSE(process.aborted_invoked);
  101. }
  102. TEST(Process, Fail) {
  103. fake_process<int> process{};
  104. process.tick(0);
  105. process.tick(0);
  106. process.fail();
  107. process.tick(0);
  108. ASSERT_FALSE(process.alive());
  109. ASSERT_FALSE(process.finished());
  110. ASSERT_FALSE(process.paused());
  111. ASSERT_TRUE(process.rejected());
  112. ASSERT_TRUE(process.init_invoked);
  113. ASSERT_TRUE(process.update_invoked);
  114. ASSERT_FALSE(process.succeeded_invoked);
  115. ASSERT_TRUE(process.failed_invoked);
  116. ASSERT_FALSE(process.aborted_invoked);
  117. }
  118. TEST(Process, Data) {
  119. fake_process<fake_delta> process{};
  120. int value = 0;
  121. process.tick({});
  122. process.tick({}, &value);
  123. process.succeed();
  124. process.tick({}, &value);
  125. ASSERT_FALSE(process.alive());
  126. ASSERT_TRUE(process.finished());
  127. ASSERT_FALSE(process.paused());
  128. ASSERT_FALSE(process.rejected());
  129. ASSERT_EQ(value, 1);
  130. ASSERT_TRUE(process.init_invoked);
  131. ASSERT_TRUE(process.update_invoked);
  132. ASSERT_TRUE(process.succeeded_invoked);
  133. ASSERT_FALSE(process.failed_invoked);
  134. ASSERT_FALSE(process.aborted_invoked);
  135. }
  136. TEST(Process, AbortNextTick) {
  137. fake_process<int> process{};
  138. process.tick(0);
  139. process.abort();
  140. process.tick(0);
  141. ASSERT_FALSE(process.alive());
  142. ASSERT_FALSE(process.finished());
  143. ASSERT_FALSE(process.paused());
  144. ASSERT_TRUE(process.rejected());
  145. ASSERT_TRUE(process.init_invoked);
  146. ASSERT_FALSE(process.update_invoked);
  147. ASSERT_FALSE(process.succeeded_invoked);
  148. ASSERT_FALSE(process.failed_invoked);
  149. ASSERT_TRUE(process.aborted_invoked);
  150. }
  151. TEST(Process, AbortImmediately) {
  152. fake_process<fake_delta> process{};
  153. process.tick({});
  154. process.abort(true);
  155. ASSERT_FALSE(process.alive());
  156. ASSERT_FALSE(process.finished());
  157. ASSERT_FALSE(process.paused());
  158. ASSERT_TRUE(process.rejected());
  159. ASSERT_TRUE(process.init_invoked);
  160. ASSERT_FALSE(process.update_invoked);
  161. ASSERT_FALSE(process.succeeded_invoked);
  162. ASSERT_FALSE(process.failed_invoked);
  163. ASSERT_TRUE(process.aborted_invoked);
  164. }
  165. TEST(ProcessAdaptor, Resolved) {
  166. bool updated = false;
  167. auto lambda = [&updated](std::uint64_t, void *, auto resolve, auto) {
  168. ASSERT_FALSE(updated);
  169. updated = true;
  170. resolve();
  171. };
  172. auto process = entt::process_adaptor<decltype(lambda), std::uint64_t>{lambda};
  173. process.tick(0);
  174. process.tick(0);
  175. ASSERT_TRUE(process.finished());
  176. ASSERT_TRUE(updated);
  177. }
  178. TEST(ProcessAdaptor, Rejected) {
  179. bool updated = false;
  180. auto lambda = [&updated](std::uint64_t, void *, auto, auto rejected) {
  181. ASSERT_FALSE(updated);
  182. updated = true;
  183. rejected();
  184. };
  185. auto process = entt::process_adaptor<decltype(lambda), std::uint64_t>{lambda};
  186. process.tick(0);
  187. process.tick(0);
  188. ASSERT_TRUE(process.rejected());
  189. ASSERT_TRUE(updated);
  190. }
  191. TEST(ProcessAdaptor, Data) {
  192. int value = 0;
  193. auto lambda = [](std::uint64_t, void *data, auto resolve, auto) {
  194. *static_cast<int *>(data) = 42; // NOLINT
  195. resolve();
  196. };
  197. auto process = entt::process_adaptor<decltype(lambda), std::uint64_t>{lambda};
  198. process.tick(0);
  199. process.tick(0, &value);
  200. ASSERT_TRUE(process.finished());
  201. ASSERT_EQ(value, 42);
  202. }