| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- #define BOOST_TEST_DYN_LINK
- #include "core/basic_obj_types.hpp"
- #include "core/global_defs.h"
- #include "core/sophiar_pool.h"
- #include "utility/debug_utility.hpp"
- #include <boost/asio/awaitable.hpp>
- #include <boost/asio/co_spawn.hpp>
- #include <boost/asio/detached.hpp>
- #include <boost/test/unit_test.hpp>
- #include <spdlog/spdlog.h>
- #include <fstream>
- using namespace sophiar;
- using boost::asio::awaitable;
- using boost::asio::co_spawn;
- using boost::asio::detached;
- using namespace std::chrono_literals;
- awaitable<void> test_callback() {
- int test_flag = 0;
- auto callback_token = global_sophiar_pool->register_callback([&]() { ++test_flag; });
- auto var_index = REQUIRE_VARIABLE(u64int_obj, "var_num");
- auto attach_token = global_sophiar_pool->attach_callback(var_index, callback_token);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 1);
- global_sophiar_pool->detach_callback(attach_token);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 1);
- global_sophiar_pool->attach_callback(var_index, callback_token);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 2);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 2);
- global_sophiar_pool->unregister_callback(callback_token);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 2);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 2);
- int test_flag_2 = 0;
- auto var_index_2 = REQUIRE_VARIABLE(double_obj, "var_float");
- auto callback_token_1 = global_sophiar_pool->register_callback([&]() {
- SPDLOG_DEBUG("callback 1");
- ++test_flag;
- UPDATE_VARIABLE_VAL(double_obj, var_index_2, 1.0);
- });
- auto callback_token_2 = global_sophiar_pool->register_callback([&]() {
- SPDLOG_DEBUG("callback 2");
- ++test_flag_2;
- });
- global_sophiar_pool->attach_callback(var_index, callback_token_1);
- global_sophiar_pool->attach_callback(var_index_2, callback_token_2);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 3);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 3);
- BOOST_TEST(test_flag_2 == 1);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 4);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 4);
- BOOST_TEST(test_flag_2 == 2);
- auto coro_token_1 = global_sophiar_pool->register_coro_callback([&]() -> awaitable<void> {
- co_await coro_sleep(100ms);
- SPDLOG_DEBUG("coro callback 1");
- ++test_flag;
- UPDATE_VARIABLE_VAL(double_obj, var_index_2, 1.0);
- co_return;
- });
- auto coro_token_2 = global_sophiar_pool->register_coro_callback([&]() -> awaitable<void> {
- co_await coro_sleep(100ms);
- SPDLOG_DEBUG("coro callback 2");
- ++test_flag_2;
- co_return;
- });
- global_sophiar_pool->attach_callback(var_index, coro_token_1);
- global_sophiar_pool->attach_callback(var_index_2, coro_token_2);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 5);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 5);
- BOOST_TEST(test_flag_2 == 3);
- co_await coro_sleep(200ms);
- BOOST_TEST(test_flag == 6);
- BOOST_TEST(test_flag_2 == 5);
- global_sophiar_pool->unregister_callback(callback_token_1);
- global_sophiar_pool->unregister_callback(callback_token_2);
- global_sophiar_pool->unregister_callback(coro_token_1);
- global_sophiar_pool->unregister_callback(coro_token_2);
- test_flag = 0;
- callback_token = global_sophiar_pool->register_callback([&]() { ++test_flag; });
- global_sophiar_pool->attach_callback(var_index, callback_token);
- global_sophiar_pool->attach_callback(var_index_2, callback_token);
- UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1);
- UPDATE_VARIABLE_VAL(double_obj, var_index_2, 1.0);
- co_await coro_sleep(50ms);
- BOOST_TEST(test_flag == 1);
- co_return;
- }
- BOOST_AUTO_TEST_CASE(test_sophiar_pool) {
- spdlog::set_level(spdlog::level::trace);
- std::ifstream config_file("data/sophiar_pool_config.json");
- BOOST_TEST(config_file.is_open());
- auto config = nlohmann::json::parse(config_file);
- initialize(config);
- {
- auto var_index = REQUIRE_VARIABLE(bool_obj, "var_bool");
- auto var_ptr = QUERY_VARIABLE(bool_obj, var_index);
- BOOST_TEST(var_ptr != nullptr);
- BOOST_TEST(var_ptr->value == true);
- }
- {
- auto var_index = REQUIRE_VARIABLE(u64int_obj, "var_num");
- auto var_ptr = QUERY_VARIABLE(u64int_obj, var_index);
- BOOST_TEST(var_ptr != nullptr);
- BOOST_TEST(var_ptr->value == 12345678);
- }
- {
- auto var_index = REQUIRE_VARIABLE(double_obj, "var_float");
- auto var_ptr = QUERY_VARIABLE(double_obj, var_index);
- BOOST_TEST(var_ptr != nullptr);
- BOOST_TEST(var_ptr->value == 1234.5678);
- }
- {
- auto var_index = REQUIRE_VARIABLE(scalarxyz_obj, "var_vec");
- auto var_ptr = QUERY_VARIABLE(scalarxyz_obj, var_index);
- BOOST_TEST(var_ptr != nullptr);
- BOOST_TEST(var_ptr->value.z() == 3);
- }
- {
- auto var_index = REQUIRE_VARIABLE(transform_obj, "var_trans");
- auto var_ptr = QUERY_VARIABLE(transform_obj, var_index);
- BOOST_TEST(var_ptr != nullptr);
- BOOST_TEST(var_ptr->value.translation().z() == 6);
- }
- {
- auto var_index = REQUIRE_VARIABLE(transform_obj, "var_trans");
- auto var_ptr = QUERY_VARIABLE(transform_obj, var_index);
- BOOST_TEST(var_ptr != nullptr);
- BOOST_TEST(var_ptr->value.translation().z() == 6);
- }
- {
- auto var_index = REQUIRE_VARIABLE(array6_obj, "var_array");
- auto var_ptr = QUERY_VARIABLE(array6_obj, var_index);
- BOOST_TEST(var_ptr != nullptr);
- BOOST_TEST(var_ptr->value[0] == 6);
- }
- co_spawn(*global_context, test_callback(), detached);
- global_context->run();
- }
|