CARLA
 
载入中...
搜索中...
未找到
test_msgpack.cpp
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6// 引入测试所需的头文件
7#include "test.h"
9#include <carla/rpc/Actor.h>
10#include <carla/rpc/Response.h>
11// 引入线程相关的头文件,可能在测试中用于模拟并发场景
12#include <thread>
13// 使用 carla::rpc 命名空间
14using namespace carla::rpc;
15// 测试 MsgPack 对 Response 的序列化和反序列化功能
16TEST(msgpack, response) {
17 using mp = carla::MsgPack;// 使用 MsgPack 的别名 mp
18 const std::string error = "Uh ah an error!";// 定义一个错误字符串
19 Response<int> r = ResponseError(error);// 创建一个包含错误信息的 Response<int> 对象
20 auto s = mp::UnPack<decltype(r)>(mp::Pack(r));
21 ASSERT_TRUE(r.HasError());
22 ASSERT_EQ(r.GetError().What(), error);// 断言 r 的错误信息与预设的一致
23 ASSERT_TRUE(s.HasError());
24 ASSERT_EQ(s.GetError().What(), error);// 断言 s 的错误信息与预设的一致
25 r.Reset(42);// 将 r 重置为一个值为 42 的 Response
26 s = mp::UnPack<decltype(r)>(mp::Pack(r)); // 再次序列化和反序列化得到 s
27 ASSERT_FALSE(r.HasError());
28 ASSERT_EQ(r.Get(), 42);
29 ASSERT_FALSE(s.HasError());
30 ASSERT_EQ(s.Get(), 42);
31 r.SetError(error);// 再次设置 r 为错误状态
32 s = mp::UnPack<decltype(r)>(mp::Pack(r));
33 ASSERT_FALSE(r);// 断言 r 为 false,表示有错误
34 ASSERT_EQ(r.GetError().What(), error);
35 ASSERT_FALSE(s);
36 ASSERT_EQ(s.GetError().What(), error);
37 Response<std::vector<float>> rv; // 创建一个 Response<std::vector<float>> 对象
38 auto sv = mp::UnPack<decltype(rv)>(mp::Pack(rv)); // 序列化和反序列化得到 sv
39 // 断言 rv 和 sv 都有错误
40 ASSERT_TRUE(rv.HasError());
41 ASSERT_TRUE(sv.HasError());
42 Response<void> er;// 创建一个 Response<void> 对象 er
43 ASSERT_TRUE(er.HasError());
44 er = Response<void>::Success(); // 将 er 设置为成功状态
45 auto es = mp::UnPack<decltype(er)>(mp::Pack(er));// 序列化和反序列化得到 es
46 // 断言 er 和 es 都没有错误
47 ASSERT_FALSE(er.HasError());
48 ASSERT_FALSE(es.HasError());
49 er.SetError(error);
50 es = mp::UnPack<decltype(er)>(mp::Pack(er));
51 // 断言 er 和 es 都为 false,表示有错误
52 ASSERT_FALSE(er);
53 ASSERT_EQ(er.GetError().What(), error);
54 ASSERT_FALSE(es);
55 ASSERT_EQ(es.GetError().What(), error);
56}
57// 测试 MsgPack 对 Actor 的序列化和反序列化功能
58TEST(msgpack, actor) {
59 namespace c = carla;
60 namespace cg = carla::geom;
61 // 创建一个 Actor 对象
62 Actor actor;
63 // 设置 Actor 的各种属性
64 actor.id = 42u;
65 actor.description.uid = 2u;
66 actor.description.id = "actor.random.whatever";
67 actor.bounding_box = cg::BoundingBox{cg::Vector3D{1.0f, 2.0f, 3.0f}};
68// 序列化 actor,然后反序列化得到 result
69 auto buffer = c::MsgPack::Pack(actor);
70 auto result = c::MsgPack::UnPack<Actor>(buffer);
71// 断言 result 的属性与 actor 的属性一致
72 ASSERT_EQ(result.id, actor.id);
73 ASSERT_EQ(result.description.uid, actor.description.uid);
74 ASSERT_EQ(result.description.id, actor.description.id);
75 ASSERT_EQ(result.bounding_box, actor.bounding_box);
76}
77// 测试 MsgPack 对 boost::variant 的序列化和反序列化功能
78TEST(msgpack, variant) {
79 using mp = carla::MsgPack;
80// 创建一个 boost::variant2::variant<bool, float, std::string> 对象
81 boost::variant2::variant<bool, float, std::string> var;
82// 设置 var 为 bool 类型的值 true
83 var = true;
84 auto result = mp::UnPack<decltype(var)>(mp::Pack(var)); // 序列化和反序列化得到 result
85 ASSERT_EQ(result.index(), 0); // 断言 result 的索引为 0,表示 bool 类型
86 ASSERT_EQ(boost::variant2::get<bool>(result), true);// 断言 result 的 bool 值为 true
87
88 var = 42.0f;
89 result = mp::UnPack<decltype(var)>(mp::Pack(var));
90 ASSERT_EQ(result.index(), 1); // 断言 result 的索引为 1,表示 float 类型
91 ASSERT_EQ(boost::variant2::get<float>(result), 42.0f); // 断言 result 的 float 值为 42.0f
92// 设置 var 为 std::string 类型的值 "hola!"
93 var = std::string("hola!");
94 result = mp::UnPack<decltype(var)>(mp::Pack(var));
95 ASSERT_EQ(result.index(), 2);// 断言 result 的索引为 2,表示 std::string 类型
96 ASSERT_EQ(boost::variant2::get<std::string>(result), "hola!");// 断言 result 的 std::string 值为 "hola!"
97}
98// 测试 MsgPack 对 boost::optional 的序列化和反序列化功能
99TEST(msgpack, optional) {
100 using mp = carla::MsgPack;
101// 创建一个 boost::optional<float> 对象
102 boost::optional<float> var;
103// 序列化和反序列化得到 result
104 auto result = mp::UnPack<decltype(var)>(mp::Pack(var));
105 // 断言 result 没有值
106 ASSERT_FALSE(result.has_value());
107 // 设置 var 为 42.0f
108 var = 42.0f;
109 result = mp::UnPack<decltype(var)>(mp::Pack(var));
110 // 断言 result 有值且值为 42.0f
111 ASSERT_TRUE(result.has_value());
112 ASSERT_EQ(*result, 42.0f);
113}
ActorDescription description
Definition rpc/Actor.h:38
geom::BoundingBox bounding_box
Definition rpc/Actor.h:41
const std::string & What() const
Definition Response.h:37
void Reset(TValue &&value)
Definition Response.h:64
value_type & Get()
Definition Response.h:82
void SetError(Ts &&... args)
Definition Response.h:73
bool HasError() const
Definition Response.h:68
const error_type & GetError() const
Definition Response.h:77
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
TEST(msgpack, response)