diff --git a/src/commands/interactive.rs b/src/commands/interactive.rs index a6dfca6..ccd8177 100644 --- a/src/commands/interactive.rs +++ b/src/commands/interactive.rs @@ -1,5 +1,3 @@ -use std::time::Duration; - use clap::Args; use crate::{ @@ -8,7 +6,7 @@ use crate::{ database, maps::page_map::{PageMap, PageMapResult}, }, - indication::{spinner, ProgressBuilder}, + indication::ProgressBuilder, }; use super::ArgExecutor; diff --git a/src/data/algorithm/bfs.rs b/src/data/algorithm/bfs.rs index 72a5466..fa3e4dd 100644 --- a/src/data/algorithm/bfs.rs +++ b/src/data/algorithm/bfs.rs @@ -5,6 +5,10 @@ use log::debug; use crate::data::maps::link_map::LinkMap; pub fn find_shortest_path(start: i32, end: i32, links: &LinkMap) -> Option> { + if start == end { + return Some(vec![start]); + } + let mut queue = VecDeque::new(); let mut predecessor = HashMap::new(); let mut visited = HashSet::new(); // note: having a set of visited nodes improves performance by a few percent while increasing memory usage @@ -67,6 +71,30 @@ mod test { assert_eq!(path, Some(vec![1, 2])); } + #[test] + fn start_is_end() { + let link_map = LinkMap::new_with_progress( + vec![(1, 2), (1, 3), (3, 2)].into_iter().collect(), + ProgressBuilder::empty(), + ); + + let path = super::find_shortest_path(1, 1, &link_map); + + assert_eq!(path, Some(vec![1])); + } + + #[test] + fn no_way() { + let link_map = LinkMap::new_with_progress( + vec![(1, 2), (1, 3), (3, 2)].into_iter().collect(), + ProgressBuilder::empty(), + ); + + let path = super::find_shortest_path(2, 1, &link_map); + + assert_eq!(path, None); + } + #[test] fn single_possibility() { let link_map = LinkMap::new_with_progress( diff --git a/src/data/maps/link_map.rs b/src/data/maps/link_map.rs index ce355da..e12f65e 100644 --- a/src/data/maps/link_map.rs +++ b/src/data/maps/link_map.rs @@ -57,7 +57,7 @@ impl LinkMap { #[test] fn new_link_map() { - let links = VecDeque::from(vec![(1, 2), (1, 3), (3, 2)]); + let links = vec![(1, 2), (1, 3), (3, 2)].into_iter().collect(); let map = LinkMap::new_with_progress(links, ProgressBuilder::empty());