mod common;
const RM1_ID: &str = "RM1";
#[test]
fn road_marking_book_api() {
let road_network = common::create_malidrive_road_network(
"RoadWithAllDeviceTypes.xodr",
None,
Some("all_device_types_test_db.yaml"),
);
let book = road_network.road_marking_book();
let markings = book.road_markings();
assert_eq!(
markings.len(),
1,
"Expected exactly 1 road marking, got {}",
markings.len()
);
let ids: Vec<String> = markings.iter().map(|m| m.id()).collect();
assert!(ids.contains(&RM1_ID.to_string()), "Missing road marking {RM1_ID}");
assert!(book.get_road_marking(&RM1_ID.to_string()).is_some());
assert!(book.get_road_marking(&String::from("nonexistent_id")).is_none());
assert!(book.get_road_marking(&String::from("RO1")).is_none());
assert!(book.get_road_marking(&String::from("UNMATCHED1")).is_none());
}
#[test]
fn road_marking_api() {
let road_network = common::create_malidrive_road_network(
"RoadWithAllDeviceTypes.xodr",
None,
Some("all_device_types_test_db.yaml"),
);
let book = road_network.road_marking_book();
let tol = 1e-3;
let rm1 = book.get_road_marking(&RM1_ID.to_string()).expect("RM1 not found");
assert_eq!(rm1.id(), RM1_ID);
assert_eq!(rm1.name(), Some("Crosswalk1".to_string()));
assert_eq!(rm1.marking_type(), maliput::api::objects::RoadMarkingType::Crosswalk);
let pos1 = rm1.position();
assert!(
(pos1.inertial_position.x() - 120.0).abs() < tol,
"RM1 x: got {}",
pos1.inertial_position.x()
);
assert!(
(pos1.inertial_position.y() - 0.0).abs() < tol,
"RM1 y: got {}",
pos1.inertial_position.y()
);
assert!(
(pos1.inertial_position.z() - 0.0).abs() < tol,
"RM1 z: got {}",
pos1.inertial_position.z()
);
assert_eq!(rm1.bounding_box().get_vertices().len(), 8);
let outlines = rm1.outlines();
assert_eq!(outlines.len() as i32, rm1.num_outlines());
assert!(rm1.value().is_none());
}
#[test]
fn road_marking_related_lanes_test() {
let road_network = common::create_malidrive_road_network(
"RoadWithAllDeviceTypes.xodr",
None,
Some("all_device_types_test_db.yaml"),
);
let book = road_network.road_marking_book();
let rm1 = book.get_road_marking(&RM1_ID.to_string()).expect("RM1 not found");
let rm1_lanes = rm1.related_lanes();
assert_eq!(rm1_lanes.len(), 2, "RM1 expected 2 related lanes, got {:?}", rm1_lanes);
assert!(rm1_lanes.contains(&"1_0_-1".to_string()));
assert!(rm1_lanes.contains(&"1_0_1".to_string()));
}
#[test]
fn road_marking_book_find_by_lane_test() {
let road_network = common::create_malidrive_road_network(
"RoadWithAllDeviceTypes.xodr",
None,
Some("all_device_types_test_db.yaml"),
);
let book = road_network.road_marking_book();
let markings_minus1 = book.find_by_lane(&String::from("1_0_-1"));
assert_eq!(markings_minus1.len(), 1);
assert_eq!(markings_minus1[0].id(), RM1_ID);
let markings_plus1 = book.find_by_lane(&String::from("1_0_1"));
assert_eq!(markings_plus1.len(), 1);
assert_eq!(markings_plus1[0].id(), RM1_ID);
let markings_none = book.find_by_lane(&String::from("nonexistent_lane"));
assert!(markings_none.is_empty());
}
#[test]
fn road_marking_book_find_by_type_test() {
let road_network = common::create_malidrive_road_network(
"RoadWithAllDeviceTypes.xodr",
None,
Some("all_device_types_test_db.yaml"),
);
let book = road_network.road_marking_book();
let crosswalks = book.find_by_type(&maliput::api::objects::RoadMarkingType::Crosswalk);
assert_eq!(crosswalks.len(), 1);
assert_eq!(crosswalks[0].id(), RM1_ID);
let stop_lines = book.find_by_type(&maliput::api::objects::RoadMarkingType::StopLine);
assert!(stop_lines.is_empty());
let arrows = book.find_by_type(&maliput::api::objects::RoadMarkingType::ArrowForward);
assert!(arrows.is_empty());
let unknown = book.find_by_type(&maliput::api::objects::RoadMarkingType::Unknown);
assert!(unknown.is_empty());
}
#[test]
fn road_marking_book_is_empty_without_tcd_database() {
let road_network = common::create_malidrive_road_network("RoadWithAllDeviceTypes.xodr", None, None);
let book = road_network.road_marking_book();
assert!(book.road_markings().is_empty());
}