use assert_cmd::Command;
use predicates::prelude::*;
fn xodr_path(name: &str) -> String {
let manifest_dir = env!("CARGO_MANIFEST_DIR");
format!("{}/data/xodr/{}", manifest_dir, name)
}
#[allow(deprecated)]
fn maliput_query_cmd() -> Command {
Command::cargo_bin("maliput_query").expect("binary maliput_query should be built")
}
#[test]
fn no_args_shows_error() {
maliput_query_cmd()
.assert()
.failure()
.stderr(predicate::str::contains("Usage"));
}
#[test]
fn help_flag_shows_usage() {
maliput_query_cmd()
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Usage"))
.stdout(predicate::str::contains("ROAD_NETWORK_FILE_PATH"));
}
#[test]
fn version_flag() {
maliput_query_cmd()
.arg("--version")
.assert()
.success()
.stdout(predicate::str::is_empty().not());
}
#[test]
fn loads_road_network_and_responds_to_exit() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("exit\n")
.assert()
.success()
.stdout(predicate::str::contains("Road network loaded"))
.stdout(predicate::str::contains("Available commands"));
}
#[test]
fn invalid_file_path_fails() {
maliput_query_cmd()
.arg("/nonexistent/path/fake.xodr")
.write_stdin("exit\n")
.assert()
.failure();
}
#[test]
fn get_number_of_lanes() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("GetNumberOfLanes\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("Number of lanes:"));
}
#[test]
fn get_linear_tolerance() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("GetLinearTolerance\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("Linear tolerance"));
}
#[test]
fn get_angular_tolerance() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("GetAngularTolerance\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("Angular tolerance"));
}
#[test]
fn get_total_length() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("GetTotalLengthOfTheRoadGeometry\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("Total length of the road geometry"));
}
#[test]
fn print_all_lanes() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("PrintAllLanes\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("All lanes in the road geometry"));
}
#[test]
fn to_road_position() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("ToRoadPosition 0 0 0\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("Road Position Result"));
}
#[test]
fn invalid_query_shows_available_commands() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("FooBarBaz\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("Invalid query command"))
.stdout(predicate::str::contains("Available commands"));
}
#[test]
fn custom_linear_tolerance() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.args([&xodr, "--linear-tolerance", "0.5"])
.write_stdin("GetLinearTolerance\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("0.5"));
}
#[test]
fn multiple_queries_in_sequence() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("GetNumberOfLanes\nGetLinearTolerance\nGetAngularTolerance\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("Number of lanes"))
.stdout(predicate::str::contains("Linear tolerance"))
.stdout(predicate::str::contains("Angular tolerance"));
}
#[test]
fn allow_non_drivable_lanes_flag_is_applied() {
let xodr = xodr_path("TShapeRoad.xodr");
let default_output = maliput_query_cmd()
.arg(&xodr)
.write_stdin("GetNumberOfLanes\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("\"omit_nondrivable_lanes\": \"true\""))
.get_output()
.stdout
.clone();
let default_stdout = String::from_utf8(default_output).unwrap();
let with_flag_output = maliput_query_cmd()
.args([&xodr, "--allow-non-drivable-lanes"])
.write_stdin("GetNumberOfLanes\nexit\n")
.assert()
.success()
.stdout(predicate::str::contains("\"omit_nondrivable_lanes\": \"false\""))
.get_output()
.stdout
.clone();
let with_flag_stdout = String::from_utf8(with_flag_output).unwrap();
let re = regex::Regex::new(r"Number of lanes:\s*(\d+)").unwrap();
let default_count: u32 = re
.captures(&default_stdout)
.expect("should find lane count in default output")[1]
.parse()
.unwrap();
let with_flag_count: u32 = re
.captures(&with_flag_stdout)
.expect("should find lane count in --allow-non-drivable-lanes output")[1]
.parse()
.unwrap();
assert!(
with_flag_count > default_count,
"With --allow-non-drivable-lanes the lane count ({}) should be greater than the default ({})",
with_flag_count,
default_count
);
}
#[test]
fn disable_parallel_builder_policy_flag_is_applied() {
let xodr = xodr_path("TShapeRoad.xodr");
maliput_query_cmd()
.arg(&xodr)
.write_stdin("exit\n")
.assert()
.success()
.stdout(predicate::str::contains("\"build_policy\": \"parallel\""));
maliput_query_cmd()
.args([&xodr, "--disable-parallel-builder-policy"])
.write_stdin("exit\n")
.assert()
.success()
.stdout(predicate::str::contains("\"build_policy\": \"sequential\""));
}
#[test]
fn loaded_plugins_match_enabled_features() {
let xodr = xodr_path("TShapeRoad.xodr");
let mut expected_plugins: u32 = 0;
#[cfg(feature = "maliput_malidrive")]
{
expected_plugins += 1;
}
#[cfg(feature = "maliput_geopackage")]
{
expected_plugins += 1;
}
let expected_msg = format!("Number of plugins loaded: {}", expected_plugins);
maliput_query_cmd()
.args([&xodr, "--set-log-level", "trace"])
.write_stdin("exit\n")
.assert()
.success()
.stdout(predicate::str::contains(expected_msg));
}