-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathserializable.cpp
More file actions
114 lines (84 loc) · 3.05 KB
/
serializable.cpp
File metadata and controls
114 lines (84 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "utility/serializable.hpp"
#include <rclcpp/executors.hpp>
#include <rclcpp/parameter_map.hpp>
#include <yaml-cpp/yaml.h>
#include <filesystem>
#include <gtest/gtest.h>
using namespace rmcs::util;
static_assert(details::rclcpp_node_trait<rclcpp::Node>, " ");
static_assert(details::yaml_cpp_trait<YAML::Node>, " ");
constexpr auto kFilePath = __FILE__;
struct T : Serializable {
int mem1;
std::string mem2;
double mem3;
std::vector<double> mem4;
static constexpr std::tuple metas {
&T::mem1,
"mem1",
&T::mem2,
"mem2",
&T::mem3,
"mem3",
&T::mem4,
"mem4",
};
};
TEST(serializable, rclcpp_init) {
const auto current_file = std::filesystem::path(kFilePath);
const auto current_path = current_file.parent_path();
const auto current_yaml = current_path / "serializable.yaml";
const auto argv = std::array<const char*, 4> {
"ignored-executable-name",
"--ros-args",
"--params-file",
current_yaml.c_str(),
};
const auto argc = int { sizeof(argv) / sizeof(argv[0]) };
rclcpp::init(argc, argv.data());
}
TEST(serializable, node_adapter) {
auto param = std::string {};
static_assert(details::rclcpp_node_trait<rclcpp::Node>, " ");
auto rclcpp_node = rclcpp::Node { "not_a_empty_name_that_rclcpp_like" };
auto rclcpp_adapter = details::NodeAdapter<rclcpp::Node> { rclcpp_node };
auto ret1 = rclcpp_adapter.get_param("", param);
static_assert(details::yaml_cpp_trait<YAML::Node>, " ");
auto yaml_node = YAML::Node {};
auto yaml_adapter = details::NodeAdapter<YAML::Node> { yaml_node };
auto ret2 = yaml_adapter.get_param("", param);
}
// @NOTE:
// 只引入 yaml-cpp/node/node.h 会找不到链接符号
// 哭(
TEST(serializable, yaml_cpp) {
using namespace rmcs::util;
const auto current_file = std::filesystem::path(kFilePath);
const auto current_path = current_file.parent_path();
const auto yaml_path = current_path / "serializable.yaml";
auto yaml_root = YAML::LoadFile(yaml_path.string());
auto yaml_node = yaml_root["serializable"]["ros__parameters"]["test"];
ASSERT_TRUE(yaml_node.IsMap());
auto t = T {};
auto adapter = details::NodeAdapter<YAML::Node> { yaml_node };
auto ret = t.serialize("", adapter);
if (!ret.has_value()) {
std::cerr << "YAML Error: " << ret.error() << "\n";
GTEST_FAIL();
}
std::cout << "YAML Print Data:\n" << t.printable();
}
TEST(serializable, rclcpp) {
using namespace rmcs::util;
auto options = rclcpp::NodeOptions {}.automatically_declare_parameters_from_overrides(true);
auto node = std::make_shared<rclcpp::Node>("serializable", options);
auto t = T {};
auto ret = t.serialize("test", *node);
if (!ret.has_value()) {
RCLCPP_ERROR(node->get_logger(), "Error: %s", ret.error().c_str());
GTEST_FAIL();
}
const auto printable = t.printable();
RCLCPP_INFO(node->get_logger(), "Print Data:\n%s", printable.c_str());
rclcpp::shutdown();
}