sophiar_pool.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #define BOOST_TEST_DYN_LINK
  2. #include "core/basic_obj_types.hpp"
  3. #include "core/global_defs.h"
  4. #include "core/sophiar_pool.h"
  5. #include "utility/debug_utility.hpp"
  6. #include <boost/asio/awaitable.hpp>
  7. #include <boost/asio/co_spawn.hpp>
  8. #include <boost/asio/detached.hpp>
  9. #include <boost/test/unit_test.hpp>
  10. #include <spdlog/spdlog.h>
  11. #include <fstream>
  12. using namespace sophiar;
  13. using boost::asio::awaitable;
  14. using boost::asio::co_spawn;
  15. using boost::asio::detached;
  16. using namespace std::chrono_literals;
  17. awaitable<void> test_callback() {
  18. int test_flag = 0;
  19. auto callback_token = REGISTER_CALLBACK([&]() { ++test_flag; });
  20. auto var_index = REQUIRE_VARIABLE(u64int_obj, "var_num");
  21. auto attach_token = ATTACH_CALLBACK(var_index, callback_token);
  22. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1);
  23. co_await coro_sleep(50ms);
  24. BOOST_TEST(test_flag == 1);
  25. DETACH_CALLBACK(attach_token);
  26. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1);
  27. co_await coro_sleep(50ms);
  28. BOOST_TEST(test_flag == 1);
  29. ATTACH_CALLBACK(var_index, callback_token);
  30. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 2);
  31. co_await coro_sleep(50ms);
  32. BOOST_TEST(test_flag == 2);
  33. UNREGISTER_CALLBACK(callback_token);
  34. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 2);
  35. co_await coro_sleep(50ms);
  36. BOOST_TEST(test_flag == 2);
  37. int test_flag_2 = 0;
  38. auto var_index_2 = REQUIRE_VARIABLE(double_obj, "var_float");
  39. auto callback_token_1 = REGISTER_CALLBACK([&]() {
  40. SPDLOG_DEBUG("callback 1");
  41. ++test_flag;
  42. UPDATE_VARIABLE_VAL(double_obj, var_index_2, 1.0);
  43. });
  44. auto callback_token_2 = REGISTER_CALLBACK([&]() {
  45. SPDLOG_DEBUG("callback 2");
  46. ++test_flag_2;
  47. });
  48. ATTACH_CALLBACK(var_index, callback_token_1);
  49. ATTACH_CALLBACK(var_index_2, callback_token_2);
  50. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 3);
  51. co_await coro_sleep(50ms);
  52. BOOST_TEST(test_flag == 3);
  53. BOOST_TEST(test_flag_2 == 1);
  54. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 4);
  55. co_await coro_sleep(50ms);
  56. BOOST_TEST(test_flag == 4);
  57. BOOST_TEST(test_flag_2 == 2);
  58. auto coro_token_1 = REGISTER_CORO_CALLBACK([&]() -> awaitable<void> {
  59. co_await coro_sleep(100ms);
  60. SPDLOG_DEBUG("coro callback 1");
  61. ++test_flag;
  62. UPDATE_VARIABLE_VAL(double_obj, var_index_2, 1.0);
  63. co_return;
  64. });
  65. auto coro_token_2 = REGISTER_CORO_CALLBACK([&]() -> awaitable<void> {
  66. co_await coro_sleep(100ms);
  67. SPDLOG_DEBUG("coro callback 2");
  68. ++test_flag_2;
  69. co_return;
  70. });
  71. ATTACH_CALLBACK(var_index, coro_token_1);
  72. ATTACH_CALLBACK(var_index_2, coro_token_2);
  73. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 5);
  74. co_await coro_sleep(50ms);
  75. BOOST_TEST(test_flag == 5);
  76. BOOST_TEST(test_flag_2 == 3);
  77. co_await coro_sleep(200ms);
  78. BOOST_TEST(test_flag == 6);
  79. BOOST_TEST(test_flag_2 == 5);
  80. UNREGISTER_CALLBACK(callback_token_1);
  81. UNREGISTER_CALLBACK(callback_token_2);
  82. UNREGISTER_CALLBACK(coro_token_1);
  83. UNREGISTER_CALLBACK(coro_token_2);
  84. test_flag = 0;
  85. callback_token = REGISTER_CALLBACK([&]() { ++test_flag; });
  86. ATTACH_CALLBACK(var_index, callback_token);
  87. ATTACH_CALLBACK(var_index_2, callback_token);
  88. UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1);
  89. UPDATE_VARIABLE_VAL(double_obj, var_index_2, 1.0);
  90. co_await coro_sleep(50ms);
  91. BOOST_TEST(test_flag == 1);
  92. co_return;
  93. }
  94. BOOST_AUTO_TEST_CASE(test_sophiar_pool) {
  95. spdlog::set_level(spdlog::level::trace);
  96. std::ifstream config_file("data/sophiar_pool_config.json");
  97. BOOST_TEST(config_file.is_open());
  98. auto config = nlohmann::json::parse(config_file);
  99. initialize(config);
  100. {
  101. auto var_index = REQUIRE_VARIABLE(bool_obj, "var_bool");
  102. auto var_ptr = QUERY_VARIABLE(bool_obj, var_index);
  103. BOOST_TEST(var_ptr != nullptr);
  104. BOOST_TEST(var_ptr->value == true);
  105. }
  106. {
  107. auto var_index = REQUIRE_VARIABLE(u64int_obj, "var_num");
  108. auto var_ptr = QUERY_VARIABLE(u64int_obj, var_index);
  109. BOOST_TEST(var_ptr != nullptr);
  110. BOOST_TEST(var_ptr->value == 12345678);
  111. }
  112. {
  113. auto var_index = REQUIRE_VARIABLE(double_obj, "var_float");
  114. auto var_ptr = QUERY_VARIABLE(double_obj, var_index);
  115. BOOST_TEST(var_ptr != nullptr);
  116. BOOST_TEST(var_ptr->value == 1234.5678);
  117. }
  118. {
  119. auto var_index = REQUIRE_VARIABLE(scalarxyz_obj, "var_vec");
  120. auto var_ptr = QUERY_VARIABLE(scalarxyz_obj, var_index);
  121. BOOST_TEST(var_ptr != nullptr);
  122. BOOST_TEST(var_ptr->value.z() == 3);
  123. }
  124. {
  125. auto var_index = REQUIRE_VARIABLE(transform_obj, "var_trans");
  126. auto var_ptr = QUERY_VARIABLE(transform_obj, var_index);
  127. BOOST_TEST(var_ptr != nullptr);
  128. BOOST_TEST(var_ptr->value.translation().z() == 6);
  129. }
  130. {
  131. auto var_index = REQUIRE_VARIABLE(transform_obj, "var_trans");
  132. auto var_ptr = QUERY_VARIABLE(transform_obj, var_index);
  133. BOOST_TEST(var_ptr != nullptr);
  134. BOOST_TEST(var_ptr->value.translation().z() == 6);
  135. }
  136. {
  137. auto var_index = REQUIRE_VARIABLE(array6_obj, "var_array");
  138. auto var_ptr = QUERY_VARIABLE(array6_obj, var_index);
  139. BOOST_TEST(var_ptr != nullptr);
  140. BOOST_TEST(var_ptr->value[0] == 6);
  141. }
  142. co_spawn(*global_context, test_callback(), detached);
  143. global_context->run();
  144. }