use itertools::Itertools;
use pathfinding::prelude::{DijkstraReachableItem, dijkstra_reach};
use std::collections::HashMap;
#[test]
fn dijkstra_reach_numbers() {
let reach = dijkstra_reach(&0, |prev| vec![(prev + 1, 1), (prev * 2, *prev)])
.take_while(|x| x.total_cost < 100)
.collect_vec();
assert!(reach.iter().all(|x| x.node == x.total_cost));
assert!((0..100).all(|x| reach.iter().any(|y| x == y.total_cost)));
assert!(
reach
.iter()
.map(|x| x.total_cost)
.tuple_windows()
.all(|(a, b)| b >= a)
);
}
#[test]
fn dijkstra_reach_graph() {
let mut graph = HashMap::new();
graph.insert("A", vec![("B", 2), ("C", 5)]);
graph.insert("B", vec![("C", 2)]);
graph.insert("C", vec![]);
let reach = dijkstra_reach(&"A", |prev| graph[prev].clone()).collect_vec();
assert_eq!(
reach,
vec![
DijkstraReachableItem {
node: "A",
parent: None,
total_cost: 0,
},
DijkstraReachableItem {
node: "B",
parent: Some("A"),
total_cost: 2,
},
DijkstraReachableItem {
node: "C",
parent: Some("B"),
total_cost: 4,
},
]
);
}