#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 #include #include #include #include #include using namespace sophiar; using boost::asio::awaitable; using boost::asio::co_spawn; using boost::asio::detached; using namespace std::chrono_literals; awaitable test_callback() { int test_flag = 0; auto callback_token = REGISTER_CALLBACK([&]() { ++test_flag; }); auto var_index = REQUIRE_VARIABLE(u64int_obj, "var_num"); auto attach_token = ATTACH_CALLBACK(var_index, callback_token); UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1); co_await coro_sleep(50ms); BOOST_TEST(test_flag == 1); DETACH_CALLBACK(attach_token); UPDATE_VARIABLE_VAL(u64int_obj, var_index, 1); co_await coro_sleep(50ms); BOOST_TEST(test_flag == 1); ATTACH_CALLBACK(var_index, callback_token); UPDATE_VARIABLE_VAL(u64int_obj, var_index, 2); co_await coro_sleep(50ms); BOOST_TEST(test_flag == 2); 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 = REGISTER_CALLBACK([&]() { SPDLOG_DEBUG("callback 1"); ++test_flag; UPDATE_VARIABLE_VAL(double_obj, var_index_2, 1.0); }); auto callback_token_2 = REGISTER_CALLBACK([&]() { SPDLOG_DEBUG("callback 2"); ++test_flag_2; }); ATTACH_CALLBACK(var_index, callback_token_1); 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 = REGISTER_CORO_CALLBACK([&]() -> awaitable { 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 = REGISTER_CORO_CALLBACK([&]() -> awaitable { co_await coro_sleep(100ms); SPDLOG_DEBUG("coro callback 2"); ++test_flag_2; co_return; }); ATTACH_CALLBACK(var_index, coro_token_1); 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); UNREGISTER_CALLBACK(callback_token_1); UNREGISTER_CALLBACK(callback_token_2); UNREGISTER_CALLBACK(coro_token_1); UNREGISTER_CALLBACK(coro_token_2); test_flag = 0; callback_token = REGISTER_CALLBACK([&]() { ++test_flag; }); ATTACH_CALLBACK(var_index, callback_token); 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(); }