vrp-cli 1.25.0

A command line interface for VRP solver
Documentation
use super::*;
use crate::extensions::import::import_problem;
use std::io::BufReader;

#[test]
fn can_read_csv_problem() {
    let jobs_csv = r"
ID,LAT,LNG,DEMAND,DURATION,TW_START,TW_END
job1,52.52599,13.45413,2,5,2020-07-04T08:00:00Z,2020-07-04T12:00:00Z
job2,52.5225,13.4095,1,3,,
job2,52.5165,13.3808,-1,3,,
job3,52.5316,13.3884,3,5,2020-07-04T08:00:00Z,2020-07-04T16:00:00Z
";
    let vehicles_csv = r"
ID,LAT,LNG,CAPACITY,TW_START,TW_END,AMOUNT,PROFILE
vehicle1,52.4664,13.4023,40,2020-07-04T08:00:00Z,2020-07-04T20:00:00Z,10,car
vehicle2,52.4959,13.3539,50,2020-07-04T08:00:00Z,2020-07-04T20:00:00Z,20,truck
";

    let result = read_csv_problem(BufReader::new(jobs_csv.as_bytes()), BufReader::new(vehicles_csv.as_bytes()))
        .expect("cannot read csv");

    assert_eq!(result.plan.jobs.len(), 3);
    assert_eq!(result.fleet.vehicles.len(), 2);
}

#[test]
fn can_propagate_format_error() {
    let invalid_jobs = r"
ID,LAT,LNG,DEMAND,DURATION,TW_START,TW_END
job2,52.5225,13.4095,1,3,,
job2,52.5165,13.3808,3,,
";

    let result = read_csv_problem(BufReader::new(invalid_jobs.as_bytes()), BufReader::new("".as_bytes()))
        .expect_err("Should return error!");

    assert_eq!(result.code, "E0000");
    assert_eq!(result.cause, "cannot read jobs");
    assert_eq!(result.action, "check jobs definition");
    assert!(result.details.is_some());

    let result =
        import_problem("csv", Some(vec![BufReader::new(invalid_jobs.as_bytes()), BufReader::new("".as_bytes())]))
            .expect_err("Should return error!")
            .to_string();

    assert_eq!(result, "cannot read csv: E0000, cause: 'cannot read jobs', action: 'check jobs definition'.");
}

parameterized_test! {can_handle_invalid_input_amount, input_size, {
        can_handle_invalid_input_amount_impl(input_size);
}}

can_handle_invalid_input_amount! {
        case01: None,
        case02: Some(0),
        case03: Some(1),
        case04: Some(3),
}

fn can_handle_invalid_input_amount_impl(input_size: Option<usize>) {
    let jobs_csv = r"
ID,LAT,LNG,DEMAND,DURATION,TW_START,TW_END
job1,52.5225,13.4095,1,3,,
";

    let result =
        import_problem("csv", input_size.map(|size| (0..size).map(|_| BufReader::new(jobs_csv.as_bytes())).collect()))
            .expect_err("Should return error!")
            .to_string();

    assert_eq!(result, "csv format expects two files with jobs and vehicles as an input");
}