26
26
#include < vector>
27
27
28
28
#include < cloe/component.hpp> // for DEFINE_COMPONENT_FACTORY
29
+ #include < cloe/component/ego_sensor.hpp> // for EgoSensor
29
30
#include < cloe/component/object_sensor.hpp> // for ObjectSensor
30
31
#include < cloe/core.hpp> // for Json
31
32
#include < fable/utility/gtest.hpp> // for assert_from_conf
@@ -35,11 +36,9 @@ using namespace cloe; // NOLINT(build/namespaces)
35
36
TEST (cloe_stack, serialization_of_empty_stack) {
36
37
Stack s;
37
38
38
- fable::assert_from_conf (s, R"(
39
- {
40
- "version": "4"
41
- }
42
- )" );
39
+ fable::assert_from_conf (s, R"( {
40
+ "version": "4"
41
+ })" );
43
42
44
43
Json expect = R"( {
45
44
"engine": {
@@ -120,19 +119,17 @@ TEST(cloe_stack, serialization_of_empty_stack) {
120
119
TEST (cloe_stack, serialization_with_logging) {
121
120
Stack s;
122
121
123
- assert_from_conf (s, R"(
124
- {
125
- "version": "4",
126
- "defaults": {
127
- "simulators": [
128
- { "binding": "vtd", "args": { "label_vehicle": "symbol" } }
129
- ]
130
- },
131
- "logging": [
132
- { "name": "*", "level": "info" }
122
+ assert_from_conf (s, R"( {
123
+ "version": "4",
124
+ "defaults": {
125
+ "simulators": [
126
+ { "binding": "vtd", "args": { "label_vehicle": "symbol" } }
133
127
]
134
- }
135
- )" );
128
+ },
129
+ "logging": [
130
+ { "name": "*", "level": "info" }
131
+ ]
132
+ })" );
136
133
137
134
Json expect = R"( {
138
135
"engine": {
@@ -249,25 +246,96 @@ DEFINE_COMPONENT_FACTORY(DummySensorFactory, DummySensorConf, "dummy_object_sens
249
246
DEFINE_COMPONENT_FACTORY_MAKE(DummySensorFactory, DummySensor, cloe::ObjectSensor)
250
247
251
248
TEST(cloe_stack, deserialization_of_component) {
252
- {
253
- std::shared_ptr<DummySensorFactory> cf = std::make_shared<DummySensorFactory>();
254
- ComponentConf cc = ComponentConf (" dummy_sensor" , cf);
255
- // Create a sensor component from the given configuration.
256
- fable::assert_from_conf (cc, R"(
257
- {
258
- "binding": "dummy_sensor",
259
- "name": "my_dummy_sensor",
260
- "from": "some_obj_sensor",
261
- "args" : {
262
- "freq" : 9
263
- }
264
- }
265
- )" );
266
- // In production code, "some_obj_sensor" would be fetched from a list of all
267
- // available sensors. Skip this step here.
268
- std::shared_ptr<cloe::Component> from = std::shared_ptr<cloe::NopObjectSensor>();
269
- auto d = std::dynamic_pointer_cast<DummySensor>(
270
- std::shared_ptr<cloe::Component>(std::move (cf->make (cc.args , from))));
271
- ASSERT_EQ (d->get_freq (), 9 );
249
+ // Create a sensor component from the given configuration.
250
+ std::shared_ptr<DummySensorFactory> cf = std::make_shared<DummySensorFactory>();
251
+ ComponentConf cc = ComponentConf (" dummy_sensor" , cf);
252
+ fable::assert_from_conf (cc, R"( {
253
+ "binding": "dummy_sensor",
254
+ "name": "my_dummy_sensor",
255
+ "from": "some_obj_sensor",
256
+ "args" : {
257
+ "freq" : 9
258
+ }
259
+ })" );
260
+
261
+ // In production code, "some_obj_sensor" would be fetched from a list of all
262
+ // available sensors. Skip this step here.
263
+ std::vector<std::shared_ptr<cloe::Component>> from = {std::shared_ptr<cloe::NopObjectSensor>()};
264
+ auto d = std::dynamic_pointer_cast<DummySensor>(
265
+ std::shared_ptr<cloe::Component>(std::move (cf->make (cc.args , from))));
266
+ ASSERT_EQ (d->get_freq (), 9 );
267
+ }
268
+
269
+ class FusionSensor : public NopObjectSensor {
270
+ public:
271
+ FusionSensor (const std::string& name, const DummySensorConf& conf,
272
+ std::vector<std::shared_ptr<ObjectSensor>> obj_sensors,
273
+ std::shared_ptr<EgoSensor> ego_sensor)
274
+ : NopObjectSensor(), config_(conf), obj_sensors_(obj_sensors), ego_sensor_(ego_sensor) {}
275
+
276
+ virtual ~FusionSensor () noexcept = default ;
277
+
278
+ uint64_t get_freq () const { return config_.freq ; }
279
+
280
+ private:
281
+ DummySensorConf config_;
282
+ std::vector<std::shared_ptr<ObjectSensor>> obj_sensors_;
283
+ std::shared_ptr<EgoSensor> ego_sensor_;
284
+ };
285
+
286
+ DEFINE_COMPONENT_FACTORY (FusionSensorFactory, DummySensorConf, " fusion_object_sensor" ,
287
+ " test component config" )
288
+
289
+ std::unique_ptr<::cloe::Component> FusionSensorFactory::make(
290
+ const ::cloe::Conf& c, std::vector<std::shared_ptr<cloe::Component>> comp_src) const {
291
+ decltype (config_) conf{config_};
292
+ if (!c->is_null ()) {
293
+ conf.from_conf (c);
272
294
}
295
+ std::vector<std::shared_ptr<ObjectSensor>> obj_sensors;
296
+ std::vector<std::shared_ptr<EgoSensor>> ego_sensors;
297
+ for (auto & comp : comp_src) {
298
+ auto obj_s = std::dynamic_pointer_cast<ObjectSensor>(comp);
299
+ if (obj_s != nullptr ) {
300
+ obj_sensors.push_back (obj_s);
301
+ continue ;
302
+ }
303
+ auto ego_s = std::dynamic_pointer_cast<EgoSensor>(comp);
304
+ if (ego_s != nullptr ) {
305
+ ego_sensors.push_back (ego_s);
306
+ continue ;
307
+ }
308
+ throw Error (" FusionSensorFactory: Source component type not supported: from {}" , comp->name ());
309
+ }
310
+ if (ego_sensors.size () != 1 ) {
311
+ throw Error (" FusionSensorFactory: {}: Require exactly one ego sensor." , this ->name ());
312
+ }
313
+ return std::make_unique<FusionSensor>(this ->name (), conf, obj_sensors, ego_sensors.front ());
314
+ }
315
+
316
+ TEST (cloe_stack, deserialization_of_fusion_component) {
317
+ // Create a sensor component from the given configuration.
318
+ std::shared_ptr<FusionSensorFactory> cf = std::make_shared<FusionSensorFactory>();
319
+ ComponentConf cc = ComponentConf (" fusion_object_sensor" , cf);
320
+ fable::assert_from_conf (cc, R"( {
321
+ "binding": "fusion_object_sensor",
322
+ "name": "my_fusion_sensor",
323
+ "from": [
324
+ "ego_sensor0",
325
+ "obj_sensor1",
326
+ "obj_sensor2"
327
+ ],
328
+ "args" : {
329
+ "freq" : 77
330
+ }
331
+ })" );
332
+
333
+ // In production code, a component list containing "ego_sensor0", ... would
334
+ // be generated. Skip this step here.
335
+ std::vector<std::shared_ptr<cloe::Component>> sensor_subset = {
336
+ std::make_shared<cloe::NopEgoSensor>(), std::make_shared<cloe::NopObjectSensor>(),
337
+ std::make_shared<cloe::NopObjectSensor>()};
338
+ auto f = std::dynamic_pointer_cast<FusionSensor>(
339
+ std::shared_ptr<cloe::Component>(std::move (cf->make (cc.args , sensor_subset))));
340
+ ASSERT_EQ (f->get_freq (), 77 );
273
341
}
0 commit comments