use crate::core::{Graph, IgraphResult, VertexId};
pub fn are_adjacent(graph: &Graph, v1: VertexId, v2: VertexId) -> IgraphResult<bool> {
Ok(graph.find_eid(v1, v2)?.is_some())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::Graph;
#[test]
fn connected_undirected() {
let mut g = Graph::new(3, false).unwrap();
g.add_edges(vec![(0, 1), (1, 2)]).unwrap();
assert!(are_adjacent(&g, 0, 1).unwrap());
assert!(are_adjacent(&g, 1, 0).unwrap());
assert!(are_adjacent(&g, 1, 2).unwrap());
assert!(!are_adjacent(&g, 0, 2).unwrap());
}
#[test]
fn connected_directed() {
let mut g = Graph::new(3, true).unwrap();
g.add_edges(vec![(0, 1)]).unwrap();
assert!(are_adjacent(&g, 0, 1).unwrap());
assert!(!are_adjacent(&g, 1, 0).unwrap());
}
#[test]
fn self_loop() {
let mut g = Graph::new(2, false).unwrap();
g.add_edges(vec![(0, 0)]).unwrap();
assert!(are_adjacent(&g, 0, 0).unwrap());
assert!(!are_adjacent(&g, 0, 1).unwrap());
}
#[test]
fn no_edges() {
let g = Graph::new(5, false).unwrap();
assert!(!are_adjacent(&g, 0, 1).unwrap());
assert!(!are_adjacent(&g, 2, 4).unwrap());
}
#[test]
fn invalid_vertex() {
let g = Graph::new(3, false).unwrap();
assert!(are_adjacent(&g, 0, 5).is_err());
assert!(are_adjacent(&g, 10, 0).is_err());
}
#[test]
fn parallel_edges() {
let mut g = Graph::new(2, false).unwrap();
g.add_edges(vec![(0, 1), (0, 1)]).unwrap();
assert!(are_adjacent(&g, 0, 1).unwrap());
}
#[test]
fn single_vertex() {
let g = Graph::new(1, false).unwrap();
assert!(!are_adjacent(&g, 0, 0).unwrap());
}
#[test]
fn directed_both_directions() {
let mut g = Graph::new(2, true).unwrap();
g.add_edges(vec![(0, 1), (1, 0)]).unwrap();
assert!(are_adjacent(&g, 0, 1).unwrap());
assert!(are_adjacent(&g, 1, 0).unwrap());
}
}