main.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #define BOOST_TEST_DYN_LINK
  2. #define BOOST_TEST_MAIN // in only one cpp file
  3. #include <boost/test/unit_test.hpp>
  4. #include "core/small_obj.hpp"
  5. #include "core/tristate_obj.hpp"
  6. #include "third_party/bitops.hpp"
  7. using namespace sophiar;
  8. BOOST_AUTO_TEST_CASE(test_small_obj) {
  9. struct test_obj : public small_obj<test_obj> {
  10. explicit test_obj(int &_p) : probe(_p) {
  11. probe = 1;
  12. }
  13. ~test_obj() {
  14. probe = 2;
  15. }
  16. int &probe;
  17. };
  18. int my_probe = 0;
  19. {
  20. auto obj = test_obj::new_instance(my_probe);
  21. BOOST_TEST(my_probe == 1);
  22. }
  23. BOOST_TEST(my_probe == 2);
  24. my_probe = 0;
  25. {
  26. test_obj::pointer obj_2;
  27. {
  28. auto obj = test_obj::new_instance(my_probe);
  29. obj_2 = obj;
  30. BOOST_TEST(my_probe == 1);
  31. BOOST_TEST(obj_2->ref_count == 2);
  32. }
  33. BOOST_TEST(my_probe == 1);
  34. BOOST_TEST(obj_2->ref_count == 1);
  35. }
  36. BOOST_TEST(my_probe == 2);
  37. }
  38. BOOST_AUTO_TEST_CASE(test_tristate_obj) {
  39. struct test_type : public tristate_obj<test_type> {
  40. bool on_init() {
  41. probe = std::setbit(probe, 0);
  42. return true;
  43. };
  44. bool on_start() {
  45. probe = std::setbit(probe, 1);
  46. return true;
  47. };
  48. void on_stop() {
  49. probe = std::setbit(probe, 2);
  50. };
  51. void on_reset() {
  52. probe = std::setbit(probe, 3);
  53. };
  54. explicit test_type(int &_p) : probe(_p) {}
  55. int &probe;
  56. };
  57. int probe = 0;
  58. test_type test_obj(probe);
  59. BOOST_TEST(test_obj.state == ST_INITIAL);
  60. test_obj.init();
  61. BOOST_TEST(test_obj.state == ST_PENDING);
  62. BOOST_TEST(std::testbit(probe, 0));
  63. test_obj.start();
  64. BOOST_TEST(test_obj.state == ST_RUNNING);
  65. BOOST_TEST(std::testbit(probe, 1));
  66. test_obj.stop();
  67. BOOST_TEST(test_obj.state == ST_PENDING);
  68. BOOST_TEST(std::testbit(probe, 2));
  69. test_obj.reset();
  70. BOOST_TEST(test_obj.state == ST_INITIAL);
  71. BOOST_TEST(std::testbit(probe, 3));
  72. probe = 0;
  73. test_obj.init();
  74. test_obj.start();
  75. test_obj.reset();
  76. BOOST_TEST(test_obj.state == ST_INITIAL);
  77. BOOST_TEST(std::popcount(probe) == 4);
  78. struct test_type_2 : public tristate_obj<test_type_2> {
  79. void after_init() {
  80. probe = std::setbit(probe, 0);
  81. }
  82. void after_start() {
  83. probe = std::setbit(probe, 1);
  84. }
  85. void after_stop() {
  86. probe = std::setbit(probe, 2);
  87. }
  88. void after_reset() {
  89. probe = std::setbit(probe, 3);
  90. }
  91. explicit test_type_2(int &_p) : probe(_p) {}
  92. int &probe;
  93. };
  94. probe = 0;
  95. test_type_2 obj_2(probe);
  96. obj_2.init();
  97. BOOST_TEST(std::testbit(probe, 0));
  98. obj_2.start();
  99. BOOST_TEST(std::testbit(probe, 1));
  100. obj_2.stop();
  101. BOOST_TEST(std::testbit(probe, 2));
  102. obj_2.reset();
  103. BOOST_TEST(std::testbit(probe, 3));
  104. struct test_type_3 : public tristate_obj<test_type_3> {
  105. void after_state_change(state_type old_state) {
  106. switch (old_state) {
  107. case ST_INITIAL:
  108. probe = std::setbit(probe, 0);
  109. break;
  110. case ST_PENDING:
  111. probe = std::setbit(probe, 1);
  112. break;
  113. case ST_RUNNING:
  114. probe = std::setbit(probe, 2);
  115. break;
  116. default:
  117. return;
  118. }
  119. }
  120. explicit test_type_3(int &_p) : probe(_p) {}
  121. int &probe;
  122. };
  123. probe = 0;
  124. test_type_3 obj_3(probe);
  125. obj_3.init();
  126. BOOST_TEST(std::testbit(probe, 0));
  127. obj_3.start();
  128. BOOST_TEST(std::testbit(probe, 1));
  129. obj_3.stop();
  130. BOOST_TEST(std::testbit(probe, 2));
  131. probe = 0;
  132. obj_3.reset();
  133. BOOST_TEST(std::testbit(probe, 1));
  134. struct test_type_4 : public tristate_obj<test_type_4> {
  135. auto on_init() {
  136. return boost::indeterminate;
  137. }
  138. auto on_start() {
  139. return boost::indeterminate;
  140. }
  141. void _init_finished(bool flag) {
  142. init_finished(flag);
  143. }
  144. void _start_finished(bool flag) {
  145. start_finished(flag);
  146. }
  147. void after_init() {
  148. probe = std::setbit(probe, 0);
  149. }
  150. void after_start() {
  151. probe = std::setbit(probe, 1);
  152. }
  153. explicit test_type_4(int &_p) : probe(_p) {}
  154. int &probe;
  155. };
  156. probe = 0;
  157. test_type_4 obj_4(probe);
  158. obj_4.init();
  159. BOOST_TEST(obj_4.state == ST_INITIALIZING);
  160. BOOST_TEST(!std::testbit(probe, 0));
  161. obj_4._init_finished(false);
  162. BOOST_TEST(obj_4.state == ST_INITIAL);
  163. BOOST_TEST(!std::testbit(probe, 0));
  164. obj_4.init();
  165. obj_4._init_finished(true);
  166. BOOST_TEST(obj_4.state == ST_PENDING);
  167. BOOST_TEST(std::testbit(probe, 0));
  168. obj_4.start();
  169. BOOST_TEST(obj_4.state == ST_STARING);
  170. BOOST_TEST(!std::testbit(probe, 1));
  171. obj_4._start_finished(false);
  172. BOOST_TEST(obj_4.state == ST_PENDING);
  173. BOOST_TEST(!std::testbit(probe, 1));
  174. obj_4.start();
  175. obj_4._start_finished(true);
  176. BOOST_TEST(obj_4.state == ST_RUNNING);
  177. BOOST_TEST(std::testbit(probe, 1));
  178. }