23-planner.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // SPDX-License-Identifier: MIT
  2. // SPDX-FileCopyrightText: 2022 Ivan Baidakou
  3. #if defined(__ANDROID__)
  4. #undef __ANDROID__
  5. #endif
  6. #include "catch.hpp"
  7. #include "rotor-light/planner.hpp"
  8. #include <vector>
  9. using namespace rotor_light;
  10. TEST_CASE("1 event planner", "[queue]") {
  11. using AppPlanner = Planner<1>;
  12. auto planner = AppPlanner();
  13. CHECK(!planner.consume(15));
  14. CHECK(planner.next_event() == 0);
  15. static int invoked = 0;
  16. static void *ptr = nullptr;
  17. auto cb = [](void *data) {
  18. ++invoked;
  19. ptr = data;
  20. };
  21. CHECK(planner.add_event(10, cb, &planner));
  22. CHECK(planner.next_event() == 10);
  23. CHECK(!planner.add_event(11, cb, &planner));
  24. CHECK(!planner.consume(9));
  25. SECTION("consume") {
  26. auto consumer = planner.consume(10);
  27. CHECK(consumer);
  28. consumer.call_next();
  29. CHECK(invoked == 1);
  30. CHECK(ptr == &planner);
  31. CHECK(!consumer);
  32. }
  33. SECTION("remove") {
  34. planner.remove_event(10, &planner);
  35. planner.remove_event(10, &planner);
  36. }
  37. CHECK(!planner.consume(15));
  38. CHECK(planner.next_event() == 0);
  39. }
  40. TEST_CASE("4 events planner", "[queue]") {
  41. using Vector = std::vector<int>;
  42. using AppPlanner = Planner<4>;
  43. auto planner = AppPlanner();
  44. CHECK(!planner.consume(15));
  45. static Vector order{};
  46. static int invoked = 0;
  47. static void *ptr = nullptr;
  48. static void *ptr2 = nullptr;
  49. static void *ptr3 = nullptr;
  50. static void *ptr4 = nullptr;
  51. auto refresh = []() {
  52. ptr = ptr2 = ptr3 = ptr4 = nullptr;
  53. invoked = 0;
  54. order = {};
  55. };
  56. auto cb1 = [](void *data) {
  57. ++invoked;
  58. ptr = data;
  59. order.emplace_back(1);
  60. };
  61. planner.add_event(10, cb1, &planner);
  62. auto cb2 = [](void *data) {
  63. ++invoked;
  64. ptr2 = data;
  65. order.emplace_back(2);
  66. };
  67. planner.add_event(8, cb2, &ptr);
  68. auto cb3 = [](void *data) {
  69. ++invoked;
  70. ptr3 = data;
  71. order.emplace_back(3);
  72. };
  73. planner.add_event(9, cb3, &ptr2);
  74. auto cb4 = [](void *data) {
  75. ++invoked;
  76. ptr4 = data;
  77. order.emplace_back(4);
  78. };
  79. planner.add_event(99, cb4, &ptr3);
  80. SECTION("consume all at once") {
  81. refresh();
  82. auto consumer = planner.consume(100);
  83. while (consumer) {
  84. consumer.call_next();
  85. }
  86. }
  87. SECTION("consume by one") {
  88. refresh();
  89. planner.consume(8).call_next();
  90. planner.consume(9).call_next();
  91. planner.consume(10).call_next();
  92. planner.consume(199).call_next();
  93. }
  94. SECTION("consume 2 and 2") {
  95. refresh();
  96. {
  97. CHECK(planner.next_event() == 8);
  98. auto c = planner.consume(9);
  99. c.call_next();
  100. c.call_next();
  101. CHECK(!c);
  102. }
  103. {
  104. CHECK(planner.next_event() == 10);
  105. auto c = planner.consume(100);
  106. c.call_next();
  107. c.call_next();
  108. CHECK(!c);
  109. }
  110. }
  111. SECTION("consume 1 and 3") {
  112. refresh();
  113. {
  114. auto c = planner.consume(8);
  115. c.call_next();
  116. CHECK(!c);
  117. }
  118. {
  119. auto c = planner.consume(100);
  120. c.call_next();
  121. c.call_next();
  122. c.call_next();
  123. CHECK(!c);
  124. }
  125. }
  126. SECTION("consume 3 and 1") {
  127. refresh();
  128. {
  129. auto c = planner.consume(50);
  130. c.call_next();
  131. c.call_next();
  132. c.call_next();
  133. CHECK(!c);
  134. }
  135. {
  136. auto c = planner.consume(100);
  137. c.call_next();
  138. CHECK(!c);
  139. }
  140. }
  141. CHECK(invoked == 4);
  142. CHECK(!planner.consume(200));
  143. CHECK(ptr == &planner);
  144. CHECK(ptr2 == &ptr);
  145. CHECK(ptr3 == &ptr2);
  146. CHECK(ptr4 == &ptr3);
  147. CHECK(order == Vector{2, 3, 1, 4});
  148. }
  149. TEST_CASE("3 events planner & events removal", "[queue]") {
  150. using AppPlanner = Planner<3>;
  151. auto planner = AppPlanner();
  152. auto some_val = int{5};
  153. auto some_val_2 = int{6};
  154. planner.add_event(
  155. 5, [](void *) {}, &planner);
  156. planner.add_event(
  157. 5, [](void *) {}, &some_val);
  158. planner.add_event(
  159. 6, [](void *) {}, &some_val_2);
  160. SECTION("remove 1-2-3") {
  161. planner.remove_event(5, &planner);
  162. planner.remove_event(5, &some_val);
  163. planner.remove_event(6, &some_val_2);
  164. }
  165. SECTION("remove 3-2-1") {
  166. planner.remove_event(6, &some_val_2);
  167. planner.remove_event(5, &some_val);
  168. planner.remove_event(5, &planner);
  169. }
  170. SECTION("remove 2-3-1") {
  171. planner.remove_event(5, &some_val);
  172. planner.remove_event(6, &some_val_2);
  173. planner.remove_event(5, &planner);
  174. }
  175. SECTION("remove 3-1-2") {
  176. planner.remove_event(5, &some_val);
  177. planner.remove_event(6, &some_val_2);
  178. planner.remove_event(5, &planner);
  179. }
  180. CHECK(planner.next_event() == 0);
  181. }