use ultragraph::prelude::*;
#[derive(Default, Debug, Copy, Clone, Hash, Eq, PartialEq)]
pub struct Data {
x: u8,
}
pub fn main() {
test_get_node();
test_outgoing_edges();
test_shortest_path();
}
fn test_get_node() {
println!("test_get_node");
let mut g = ultragraph::with_capacity::<Data>(10);
let root_index = g.add_root_node(Data { x: 3 });
let node_a_index = g.add_node(Data { x: 7 });
let node_b_index = g.add_node(Data { x: 9 });
let node_c_index = g.add_node(Data { x: 11 });
let res = g.add_edge(root_index, node_a_index);
assert!(res.is_ok());
let res = g.add_edge(node_a_index, node_b_index);
assert!(res.is_ok());
let res = g.add_edge(root_index, node_c_index);
assert!(res.is_ok());
let node = g.get_node(node_a_index);
assert!(node.is_some());
let data = node.unwrap();
assert_eq!(data.x, 7);
let neighbors = g.outgoing_edges(root_index).unwrap();
assert_eq!(neighbors.len(), 2);
println!("Neighbors of root node: ");
for n in neighbors {
let node = g.get_node(n).unwrap();
println!("node: {:?}", node);
}
}
fn test_shortest_path() {
println!("test_shortest_path");
let mut g = ultragraph::with_capacity::<Data>(10);
assert!(g.is_empty());
let expected = 0;
let actual = g.number_nodes();
assert_eq!(expected, actual);
let root_index = g.add_root_node(Data { x: 1 });
let node_a_index = g.add_node(Data { x: 6 });
let node_b_index = g.add_node(Data { x: 9 });
let node_c_index = g.add_node(Data { x: 11 });
let node_d_index = g.add_node(Data { x: 13 });
let node_e_index = g.add_node(Data { x: 17 });
let node_f_index = g.add_node(Data { x: 23 });
let res = g.add_edge(root_index, node_a_index);
assert!(res.is_ok());
let res = g.add_edge(node_a_index, node_b_index);
assert!(res.is_ok());
let res = g.add_edge(node_b_index, node_c_index);
assert!(res.is_ok());
let res = g.add_edge(node_c_index, node_e_index);
assert!(res.is_ok());
let res = g.add_edge(node_a_index, node_d_index);
assert!(res.is_ok());
let res = g.add_edge(node_d_index, node_e_index);
assert!(res.is_ok());
let res = g.add_edge(node_e_index, node_f_index);
assert!(res.is_ok());
let path = g
.shortest_path(node_a_index, node_f_index)
.expect("Failed to get Shortest path");
assert_eq!(path.len(), 4);
assert_eq!(
path,
vec![node_a_index, node_d_index, node_e_index, node_f_index]
);
println!("Shortest path: {:?}", path)
}
fn test_outgoing_edges() {
println!("test_outgoing_edges");
let mut g = ultragraph::with_capacity::<Data>(10);
assert!(g.is_empty());
let expected = 0;
let actual = g.number_nodes();
assert_eq!(expected, actual);
let root_index = g.add_root_node(Data { x: 1 });
let node_a_index = g.add_node(Data { x: 6 });
let node_b_index = g.add_node(Data { x: 9 });
let res = g.add_edge(root_index, node_a_index);
assert!(res.is_ok());
let expected = true;
let actual = g.contains_edge(root_index, node_a_index);
assert_eq!(expected, actual);
let res = g.add_edge(root_index, node_b_index);
assert!(res.is_ok());
let expected = true;
let actual = g.contains_edge(root_index, node_b_index);
assert_eq!(expected, actual);
let neighbors = g.outgoing_edges(node_a_index).unwrap();
assert_eq!(neighbors.len(), 0);
let neighbors = g.outgoing_edges(node_b_index).unwrap();
assert_eq!(neighbors.len(), 0);
let neighbors = g.outgoing_edges(root_index).unwrap();
assert_eq!(neighbors.len(), 2);
println!("Neighbors of root node: ");
for n in neighbors {
let node = g.get_node(n).unwrap();
println!("node: {:?}", node);
}
}