global_obj_helper.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #define BOOST_TEST_DYN_LINK
  2. #include "core/sophiar_obj.hpp"
  3. #include "utility/global_obj_helper.hpp"
  4. #include "utility/debug_utility.hpp"
  5. #include <boost/asio/co_spawn.hpp>
  6. #include <boost/asio/detached.hpp>
  7. #include <boost/asio/this_coro.hpp>
  8. #include <boost/asio/use_awaitable.hpp>
  9. #include <boost/test/unit_test.hpp>
  10. #include <chrono>
  11. #include <iostream>
  12. #include <vector>
  13. using boost::asio::awaitable;
  14. using boost::asio::co_spawn;
  15. using boost::asio::detached;
  16. using boost::asio::use_awaitable;
  17. using namespace sophiar;
  18. using namespace std::chrono_literals;
  19. awaitable<void> test_global_obj_helper_1() {
  20. struct small_a : public small_obj<small_a> {
  21. int value;
  22. explicit small_a(int _value = 0) { value = _value; }
  23. };
  24. auto obj_a_index = global_sophiar_manager.register_global_obj<small_a>("obj_a");
  25. global_sophiar_manager.update_global_obj<small_a>(obj_a_index, small_a::new_instance(123));
  26. co_spawn(global_context, [=]() -> awaitable<void> {
  27. auto obj_a = global_obj_auto_sync_delegate<small_a>(
  28. global_sophiar_manager, obj_a_index);
  29. BOOST_TEST(obj_a->value == 123);
  30. co_await coro_sleep(10ms);
  31. BOOST_TEST(obj_a->value == 234);
  32. co_await coro_sleep(10ms);
  33. BOOST_TEST(obj_a->value == 456);
  34. co_return;
  35. }, detached);
  36. co_spawn(global_context, [=]() -> awaitable<void> {
  37. auto obj_a = global_obj_manual_sync_delegate<small_a>(
  38. global_sophiar_manager, obj_a_index);
  39. BOOST_TEST(obj_a->value == 123);
  40. co_await coro_sleep(10ms);
  41. BOOST_TEST(obj_a->value == 123);
  42. co_await obj_a.coro_wait_update(false);
  43. BOOST_TEST(obj_a->value == 234);
  44. co_return;
  45. }, detached);
  46. global_sophiar_manager.update_global_obj<small_a>(obj_a_index, small_a::new_instance(234));
  47. co_await coro_sleep(15ms);
  48. auto obj_a = global_obj_auto_sync_delegate<small_a>(
  49. global_sophiar_manager, obj_a_index);
  50. obj_a = small_a::new_instance(456);
  51. co_return;
  52. }
  53. BOOST_AUTO_TEST_CASE(test_global_obj_helper) {
  54. co_spawn(global_context, test_global_obj_helper_1(), detached);
  55. global_context.run();
  56. }