@@ -84,6 +84,8 @@ MATCHER(EdgeEqual, "") {
8484 Eq (expected.tag )),
8585 Field (" ids" , &g2o::AbstractGraph::AbstractEdge::ids,
8686 ElementsAreArray (expected.ids )),
87+ Field (" level" , &g2o::AbstractGraph::AbstractEdge::level,
88+ Eq (expected.level )),
8789 Field (" param_ids" , &g2o::AbstractGraph::AbstractEdge::param_ids,
8890 ElementsAreArray (expected.param_ids )),
8991 Field (" measurement" , &g2o::AbstractGraph::AbstractEdge::measurement,
@@ -124,7 +126,7 @@ class AbstractGraphIO : public TestWithParam<g2o::io::Format> {
124126
125127 abstract_graph_.edges ().emplace_back (
126128 " EDGE_SE2" , std::vector<int >{1 , 2 }, std::vector<double >{0.1 , 0.2 , 0.3 },
127- std::vector<double >{1 ., 2 ., 3 ., 4 ., 5 ., 6 .}, std::vector<int >(),
129+ std::vector<double >{1 ., 2 ., 3 ., 4 ., 5 ., 6 .}, std::vector<int >(), 1 ,
128130 std::vector<g2o::AbstractGraph::AbstractData>{
129131 {" VERTEX_TAG" , " more fancy data" },
130132 {" VERTEX_TAG" , " even more fancy data" }});
@@ -247,6 +249,7 @@ class OptimizableGraphIO : public TestWithParam<g2o::io::Format> {
247249 e2 ->vertices ()[1 ] = optimizer_ptr_->vertex (2 );
248250 e2 ->setMeasurement (g2o::SE2 (0 , 1 , 0 ));
249251 e2 ->setInformation (g2o::MatrixN<3 >::Identity ());
252+ e2 ->setLevel (0 );
250253 optimizer_ptr_->addEdge (e2 );
251254 }
252255 std::unique_ptr<g2o::SparseOptimizer> optimizer_ptr_;
@@ -305,6 +308,44 @@ TEST_P(OptimizableGraphIO, SaveAndLoad) {
305308 EXPECT_THAT (buffer.str (), Eq (buffer_after_loading.str ()));
306309}
307310
311+ TEST_P (OptimizableGraphIO, SaveAndLoadWithDifferentEdgeLevels) {
312+ g2o::io::Format format = GetParam ();
313+
314+ // Manually set different levels for the edges
315+ auto edge_iter = optimizer_ptr_->edges ().begin ();
316+ static_cast <g2o::OptimizableGraph::Edge*>(edge_iter->get ())->setLevel (2 );
317+ ++edge_iter;
318+ static_cast <g2o::OptimizableGraph::Edge*>(edge_iter->get ())->setLevel (5 );
319+
320+ std::stringstream buffer (format == g2o::io::Format::kBinary
321+ ? std::ios_base::binary | std::ios_base::in |
322+ std::ios_base::out
323+ : std::ios_base::in | std::ios_base::out);
324+ constexpr int kLevelToSave = 2 ;
325+ bool save_result = optimizer_ptr_->save (buffer, format, kLevelToSave );
326+ ASSERT_THAT (save_result, IsTrue ());
327+ EXPECT_THAT (buffer.str (), Not (IsEmpty ()));
328+
329+ auto loaded_optimizer = g2o::internal::createOptimizerForTests ();
330+ loaded_optimizer->load (buffer, format);
331+
332+ EXPECT_THAT (loaded_optimizer->vertices (), Not (IsEmpty ()));
333+ EXPECT_THAT (loaded_optimizer->edges (), Not (IsEmpty ()));
334+
335+ for (const auto & edge_ptr : loaded_optimizer->edges ()) {
336+ ASSERT_NE (edge_ptr, nullptr );
337+ EXPECT_THAT (
338+ static_cast <g2o::OptimizableGraph::Edge*>(edge_ptr.get ())->level (),
339+ Eq (kLevelToSave ));
340+ }
341+
342+ std::stringstream buffer_after_loading;
343+ save_result =
344+ loaded_optimizer->save (buffer_after_loading, format, kLevelToSave );
345+ ASSERT_THAT (save_result, IsTrue ());
346+ EXPECT_THAT (buffer.str (), Eq (buffer_after_loading.str ()));
347+ }
348+
308349namespace {
309350// We can always test G2O format, others depend on libraries
310351const auto kFileformatsToTest =
0 commit comments