use crate::conversions::FromGraph;
use crate::graph::{
integrity_check, Graph, GraphError, GraphWithMutableNodeValues, GraphWithMutableNodes,
NodeIndex,
};
use crate::nodes::MutableNodes;
pub struct EdgeNodeList<NI, E, N> {
edges: E,
nodes: N,
_phantom: core::marker::PhantomData<NI>,
}
impl<NI, E, N> EdgeNodeList<NI, E, N> {
pub fn new(edges: E, nodes: N) -> Result<Self, GraphError<NI>>
where
Self: Graph<NI, Error = GraphError<NI>>,
NI: NodeIndex,
{
let result = Self::new_unchecked(edges, nodes);
integrity_check::<NI, _>(&result)?;
Ok(result)
}
pub fn new_unchecked(edges: E, nodes: N) -> Self {
Self {
edges,
nodes,
_phantom: core::marker::PhantomData,
}
}
}
impl<NI, E, N> FromGraph<NI, GraphError<NI>> for EdgeNodeList<NI, E, N>
where
NI: NodeIndex + Copy + Default,
E: crate::edges::EdgesIterable<Node = NI> + crate::edges::MutableEdges<NI> + Default,
N: crate::nodes::NodesIterable<Node = NI> + crate::nodes::MutableNodes<NI> + Default,
{
fn from_graph<G>(source_graph: &G) -> Result<Self, GraphError<NI>>
where
G: Graph<NI>,
GraphError<NI>: From<G::Error>,
{
let mut edges = E::default();
let mut nodes = N::default();
for node in source_graph.iter_nodes()? {
if nodes.add(node).is_none() {
return Err(GraphError::OutOfCapacity);
}
}
for (source, destination) in source_graph.iter_edges()? {
if edges.add_edge((source, destination)).is_none() {
return Err(GraphError::OutOfCapacity);
}
}
Ok(Self::new_unchecked(edges, nodes))
}
}
impl<NI, E, N> Graph<NI> for EdgeNodeList<NI, E, N>
where
NI: NodeIndex,
N: crate::nodes::NodesIterable<Node = NI>,
E: crate::edges::EdgesIterable<Node = NI>,
{
type Error = GraphError<NI>;
fn iter_nodes(&self) -> Result<impl Iterator<Item = NI>, Self::Error> {
Ok(self.nodes.iter_nodes().copied())
}
fn iter_edges(&self) -> Result<impl Iterator<Item = (NI, NI)>, Self::Error> {
Ok(self.edges.iter_edges().map(|(a, b)| (*a, *b)))
}
}
impl<NI, E, N, V> crate::graph::GraphWithNodeValues<NI, V> for EdgeNodeList<NI, E, N>
where
NI: NodeIndex,
N: crate::nodes::NodesValuesIterable<V, Node = NI>,
E: crate::edges::EdgesIterable<Node = NI>,
{
fn node_value(&self, node: NI) -> Result<Option<&V>, Self::Error> {
self.nodes
.iter_nodes_values()
.find(|(n, _)| **n == node)
.map(|(_, value)| value)
.ok_or(GraphError::NodeNotFound(node))
}
fn iter_node_values<'a>(
&'a self,
) -> Result<impl Iterator<Item = (NI, Option<&'a V>)>, Self::Error>
where
V: 'a,
{
Ok(self.nodes.iter_nodes_values().map(|(n, v)| (*n, v)))
}
}
impl<NI, E, N, V> crate::graph::GraphWithEdgeValues<NI, V> for EdgeNodeList<NI, E, N>
where
NI: NodeIndex,
N: crate::nodes::NodesIterable<Node = NI>,
E: crate::edges::EdgesIterable<Node = NI> + crate::edges::EdgeValuesIterable<V, Node = NI>,
{
fn iter_edge_values<'a>(
&'a self,
) -> Result<impl Iterator<Item = (NI, NI, Option<&'a V>)>, Self::Error>
where
V: 'a,
{
Ok(self.edges.iter_edges_values().map(|(a, b, v)| (*a, *b, v)))
}
}
impl<NI, E, N> GraphWithMutableNodes<NI> for EdgeNodeList<NI, E, N>
where
NI: NodeIndex + PartialEq,
N: crate::nodes::NodesIterable<Node = NI> + MutableNodes<NI>,
E: crate::edges::EdgesIterable<Node = NI>,
{
fn add_node(&mut self, node: NI) -> Result<(), Self::Error> {
if self.contains_node(node)? {
return Err(GraphError::DuplicateNode(node));
}
self.nodes.add(node).ok_or(GraphError::OutOfCapacity)?;
Ok(())
}
fn remove_node(&mut self, node: NI) -> Result<(), Self::Error> {
if !self.contains_node(node)? {
return Err(GraphError::NodeNotFound(node));
}
if self.incoming_edges(node)?.next().is_some() {
return Err(GraphError::NodeHasIncomingEdges(node));
}
if self.outgoing_edges(node)?.next().is_some() {
return Err(GraphError::NodeHasOutgoingEdges(node));
}
self.nodes
.remove(node)
.ok_or(GraphError::NodeNotFound(node))?;
Ok(())
}
}
impl<NI, E, N, V> GraphWithMutableNodeValues<NI, V> for EdgeNodeList<NI, E, N>
where
NI: NodeIndex + PartialEq,
N: crate::nodes::NodesValuesIterable<V, Node = NI> + crate::nodes::MutableNodeValue<NI, V>,
E: crate::edges::EdgesIterable<Node = NI>,
{
fn add_node_value(&mut self, node: NI, value: V) -> Result<(), Self::Error> {
if self.contains_node(node)? {
return Err(GraphError::DuplicateNode(node));
}
self.nodes
.add_value(node, value)
.ok_or(GraphError::OutOfCapacity)?;
Ok(())
}
fn remove_node_value(&mut self, node: NI) -> Result<(), Self::Error> {
if !self.contains_node(node)? {
return Err(GraphError::NodeNotFound(node));
}
if self.incoming_edges(node)?.next().is_some() {
return Err(GraphError::NodeHasIncomingEdges(node));
}
if self.outgoing_edges(node)?.next().is_some() {
return Err(GraphError::NodeHasOutgoingEdges(node));
}
self.nodes
.remove_value(node)
.ok_or(GraphError::NodeNotFound(node))?;
Ok(())
}
}
impl<NI, E, N> crate::graph::GraphWithMutableEdges<NI> for EdgeNodeList<NI, E, N>
where
NI: NodeIndex + PartialEq,
N: crate::nodes::NodesIterable<Node = NI>,
E: crate::edges::EdgesIterable<Node = NI> + crate::edges::MutableEdges<NI>,
{
fn add_edge(&mut self, source: NI, destination: NI) -> Result<(), Self::Error> {
if !self.contains_node(source)? {
return Err(GraphError::EdgeHasInvalidNode(source));
}
if !self.contains_node(destination)? {
return Err(GraphError::EdgeHasInvalidNode(destination));
}
self.edges
.add_edge((source, destination))
.ok_or(GraphError::OutOfCapacity)?;
Ok(())
}
fn remove_edge(&mut self, source: NI, destination: NI) -> Result<(), Self::Error> {
self.edges
.remove_edge((source, destination))
.ok_or(GraphError::EdgeNotFound(source, destination))?;
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::adjacency_list::map_adjacency_list::MapAdjacencyList;
use crate::containers::maps::staticdict::Dictionary;
use crate::containers::maps::MapTrait;
use crate::edges::EdgeStructOption;
use crate::edges::EdgeValueStruct;
use crate::graph::{
GraphError, GraphWithEdgeValues, GraphWithMutableEdges, GraphWithMutableNodeValues,
GraphWithNodeValues,
};
use crate::nodes::NodeStructOption;
use crate::nodes::{NodeValueStructOption, NodesValuesIterable};
use crate::tests::{collect, collect_sorted};
#[test]
fn test_edge_node_list() {
let graph = EdgeNodeList::new([(0usize, 1usize), (0, 2), (1, 2)], [0, 1, 2]).unwrap();
let _: () = graph.iter_nodes().unwrap().for_each(|_x| {});
}
#[test]
fn test_edge_node_list_with_values() {
let edge_data = EdgeValueStruct([(0usize, 1usize, 5i32), (1, 2, 3), (0, 2, 8)]);
let graph = EdgeNodeList::new(edge_data, [0, 1, 2]).unwrap();
let mut edges_with_values = [(0usize, 0usize, 0i32); 8];
let edges_slice = collect(
graph
.iter_edge_values()
.unwrap()
.filter_map(|(src, dst, weight_opt)| weight_opt.map(|w| (src, dst, *w))),
&mut edges_with_values,
);
assert_eq!(edges_slice, &[(0, 1, 5), (1, 2, 3), (0, 2, 8)]);
let mut outgoing = [(0usize, 0i32); 8];
let outgoing_slice = collect_sorted(
graph
.outgoing_edge_values(0)
.unwrap()
.filter_map(|(dst, weight_opt)| weight_opt.map(|w| (dst, *w))),
&mut outgoing,
);
assert_eq!(outgoing_slice, &[(1, 5), (2, 8)]);
}
#[test]
fn test_iter_nodes_values() {
let node_data = NodeValueStructOption([
Some((0, Some("value_0"))), Some((1, Some("value_1"))), Some((2, None)), None, Some((3, Some("value_3"))), ]);
let mut nodes_and_values = [(0usize, None); 5];
let nodes_values_slice = collect(
node_data.iter_nodes_values().map(|(n, v)| (*n, v)),
&mut nodes_and_values,
);
assert_eq!(
nodes_values_slice,
&[
(0, Some(&Some("value_0"))),
(1, Some(&Some("value_1"))),
(2, Some(&None)), (3, Some(&Some("value_3")))
]
);
let edges = [(0usize, 1usize), (1, 2), (2, 3)];
let graph = EdgeNodeList::new(edges, node_data).unwrap();
assert_eq!(graph.node_value(0).unwrap(), Some(&Some("value_0")));
assert_eq!(graph.node_value(1).unwrap(), Some(&Some("value_1")));
assert_eq!(graph.node_value(2).unwrap(), Some(&None)); assert_eq!(graph.node_value(3).unwrap(), Some(&Some("value_3")));
assert!(matches!(
graph.node_value(99),
Err(GraphError::NodeNotFound(99))
));
}
#[test]
fn test_add_node_to_empty_graph() {
let edges: [(usize, usize); 0] = [];
let nodes = NodeStructOption([None, None, None]); let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
graph.add_node(42).unwrap();
assert!(graph.contains_node(42).unwrap());
assert_eq!(graph.iter_nodes().unwrap().count(), 1);
assert_eq!(graph.outgoing_edges(42).unwrap().count(), 0);
}
#[test]
fn test_add_node_to_existing_graph() {
let edges = [(0usize, 1usize), (1, 2)];
let nodes = NodeStructOption([Some(0), Some(1), Some(2), None, None]); let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
graph.add_node(3).unwrap();
assert!(graph.contains_node(0).unwrap());
assert!(graph.contains_node(1).unwrap());
assert!(graph.contains_node(2).unwrap());
assert!(graph.contains_node(3).unwrap());
assert_eq!(graph.iter_nodes().unwrap().count(), 4);
assert_eq!(graph.outgoing_edges(3).unwrap().count(), 0);
let mut edges = [0usize; 2];
let edges_slice = collect(graph.outgoing_edges(0).unwrap(), &mut edges);
assert_eq!(edges_slice, &[1]);
let mut edges = [0usize; 2];
let edges_slice = collect(graph.outgoing_edges(1).unwrap(), &mut edges);
assert_eq!(edges_slice, &[2]);
}
#[test]
fn test_add_node_capacity_exceeded() {
let edges = [(0usize, 1usize)];
let nodes = NodeStructOption([Some(0), Some(1)]); let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
let result = graph.add_node(2);
assert!(matches!(result, Err(GraphError::OutOfCapacity)));
assert_eq!(graph.iter_nodes().unwrap().count(), 2);
}
#[test]
fn test_add_multiple_nodes() {
let edges: [(usize, usize); 0] = [];
let nodes = NodeStructOption([None, None, None, None, None]); let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
graph.add_node(10).unwrap();
graph.add_node(20).unwrap();
graph.add_node(30).unwrap();
assert!(graph.contains_node(10).unwrap());
assert!(graph.contains_node(20).unwrap());
assert!(graph.contains_node(30).unwrap());
assert_eq!(graph.iter_nodes().unwrap().count(), 3);
assert_eq!(graph.iter_edges().unwrap().count(), 0);
assert_eq!(graph.outgoing_edges(10).unwrap().count(), 0);
assert_eq!(graph.outgoing_edges(20).unwrap().count(), 0);
assert_eq!(graph.outgoing_edges(30).unwrap().count(), 0);
}
#[test]
fn test_add_duplicate_node() {
let edges = [(0usize, 1usize)];
let nodes = NodeStructOption([Some(0), Some(1), None]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
let result = graph.add_node(0);
assert!(matches!(result, Err(GraphError::DuplicateNode(0))));
assert_eq!(graph.iter_nodes().unwrap().count(), 2);
}
#[test]
fn test_add_node_with_option_container() {
let edges = [(0usize, 1usize)];
let nodes = NodeStructOption([Some(0), Some(1), None]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
graph.add_node(2).unwrap();
assert!(graph.contains_node(0).unwrap());
assert!(graph.contains_node(1).unwrap());
assert!(graph.contains_node(2).unwrap());
assert_eq!(graph.iter_nodes().unwrap().count(), 3);
assert_eq!(graph.outgoing_edges(2).unwrap().count(), 0);
let result = graph.add_node(3);
assert!(matches!(result, Err(GraphError::OutOfCapacity)));
}
#[test]
fn test_add_remove_node_value_success() {
let edges = EdgeStructOption([None, None]);
let nodes = NodeValueStructOption([None, None, None]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
graph.add_node_value(1, 10).unwrap();
graph.add_node_value(2, 20).unwrap();
assert_eq!(graph.node_value(1).unwrap(), Some(&10));
assert_eq!(graph.node_value(2).unwrap(), Some(&20));
assert_eq!(graph.iter_nodes().unwrap().count(), 2);
graph.remove_node_value(1).unwrap();
assert!(matches!(
graph.node_value(1),
Err(GraphError::NodeNotFound(1))
));
let result = graph.remove_node_value(1);
assert!(matches!(result, Err(GraphError::NodeNotFound(1))));
assert_eq!(graph.iter_nodes().unwrap().count(), 1);
}
#[test]
fn test_add_node_value_errors() {
let edges = EdgeStructOption([None, None]);
let nodes = NodeValueStructOption([Some((0, 10)), Some((1, 20))]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
let result = graph.add_node_value(0, 99);
assert!(matches!(result, Err(GraphError::DuplicateNode(0))));
let result = graph.add_node_value(2, 30);
assert!(matches!(result, Err(GraphError::OutOfCapacity)));
}
#[test]
fn test_remove_node_value_with_incoming_edges() {
let edges = EdgeStructOption([Some((0usize, 1usize)), None]);
let nodes = NodeValueStructOption([Some((0, 5)), Some((1, 6))]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
let result = graph.remove_node_value(1);
assert!(matches!(result, Err(GraphError::NodeHasIncomingEdges(1))));
}
#[test]
fn test_remove_node_value_with_outgoing_edges() {
let edges = EdgeStructOption([Some((0usize, 1usize)), Some((0, 2))]);
let nodes = NodeValueStructOption([Some((0, 10)), Some((1, 20)), Some((2, 30))]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
assert_eq!(graph.outgoing_edges(0).unwrap().count(), 2);
let result = graph.remove_node_value(0);
assert!(matches!(result, Err(GraphError::NodeHasOutgoingEdges(0))));
}
#[test]
fn test_add_edge_success() {
let edges = EdgeStructOption([None, None, None, None, None]); let nodes = NodeStructOption([Some(0), Some(1), Some(2), None, None]); let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
assert!(graph.add_edge(0, 1).is_ok());
assert!(graph.add_edge(1, 2).is_ok());
assert!(graph.add_edge(0, 2).is_ok());
let edge_count = graph.iter_edges().unwrap().count();
assert_eq!(edge_count, 3);
let mut edges = [(0usize, 0usize); 8];
let edges_slice = collect_sorted(graph.iter_edges().unwrap(), &mut edges);
assert_eq!(edges_slice, &[(0, 1), (0, 2), (1, 2)]);
}
#[test]
fn test_add_edge_invalid_nodes() {
let edges = EdgeStructOption([None, None, None, None, None]);
let nodes = NodeStructOption([Some(0), Some(1), None, None, None]); let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
let result = graph.add_edge(2, 1);
assert!(matches!(result, Err(GraphError::EdgeHasInvalidNode(2))));
let result = graph.add_edge(0, 3);
assert!(matches!(result, Err(GraphError::EdgeHasInvalidNode(3))));
let result = graph.add_edge(5, 6);
assert!(matches!(result, Err(GraphError::EdgeHasInvalidNode(5))));
}
#[test]
fn test_add_edge_capacity_exceeded() {
let edges = EdgeStructOption([None, None]); let nodes = NodeStructOption([Some(0), Some(1), Some(2), None, None]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
assert!(graph.add_edge(0, 1).is_ok());
assert!(graph.add_edge(1, 2).is_ok());
let result = graph.add_edge(0, 2);
assert!(matches!(result, Err(GraphError::OutOfCapacity)));
}
#[test]
fn test_remove_edge_success() {
let edges = EdgeStructOption([Some((0, 1)), Some((1, 2)), Some((0, 2)), None, None]);
let nodes = NodeStructOption([Some(0), Some(1), Some(2), None, None]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
assert_eq!(graph.iter_edges().unwrap().count(), 3);
assert!(graph.remove_edge(1, 2).is_ok());
assert_eq!(graph.iter_edges().unwrap().count(), 2);
let mut edges = [(0usize, 0usize); 8];
let edges_slice = collect_sorted(graph.iter_edges().unwrap(), &mut edges);
assert_eq!(edges_slice, &[(0, 1), (0, 2)]);
}
#[test]
fn test_remove_edge_not_found() {
let edges = EdgeStructOption([Some((0, 1)), Some((1, 2)), None, None, None]);
let nodes = NodeStructOption([Some(0), Some(1), Some(2), None, None]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
let result = graph.remove_edge(0, 2);
assert!(matches!(result, Err(GraphError::EdgeNotFound(0, 2))));
assert_eq!(graph.iter_edges().unwrap().count(), 2);
}
#[test]
fn test_remove_edge_with_nonexistent_nodes() {
let edges = EdgeStructOption([Some((0, 1)), None, None, None, None]);
let nodes = NodeStructOption([Some(0), Some(1), None, None, None]); let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
let result = graph.remove_edge(2, 3);
assert!(matches!(result, Err(GraphError::EdgeNotFound(2, 3))));
assert_eq!(graph.iter_edges().unwrap().count(), 1);
}
#[test]
fn test_add_remove_edge_comprehensive() {
let edges = EdgeStructOption([None, None, None, None, None]);
let nodes = NodeStructOption([Some(0), Some(1), Some(2), Some(3), None]);
let mut graph = EdgeNodeList::new(edges, nodes).unwrap();
assert_eq!(graph.iter_edges().unwrap().count(), 0);
assert!(graph.add_edge(0, 1).is_ok());
assert!(graph.add_edge(1, 2).is_ok());
assert!(graph.add_edge(2, 3).is_ok());
assert!(graph.add_edge(0, 3).is_ok());
assert_eq!(graph.iter_edges().unwrap().count(), 4);
assert!(graph.remove_edge(1, 2).is_ok());
assert_eq!(graph.iter_edges().unwrap().count(), 3);
let result = graph.remove_edge(1, 2);
assert!(matches!(result, Err(GraphError::EdgeNotFound(1, 2))));
assert!(graph.add_edge(1, 2).is_ok());
assert_eq!(graph.iter_edges().unwrap().count(), 4);
let mut edges = [(0usize, 0usize); 8];
let sorted_edges = collect_sorted(graph.iter_edges().unwrap(), &mut edges);
assert_eq!(sorted_edges, &[(0, 1), (0, 3), (1, 2), (2, 3)]);
}
#[test]
fn test_edge_node_list_from_graph() {
let mut dict = Dictionary::<usize, [usize; 2], 8>::new();
dict.insert(0, [1, 2]).unwrap(); dict.insert(1, [2, 0]).unwrap(); dict.insert(2, [0, 1]).unwrap(); let source = MapAdjacencyList::new_unchecked(dict);
let edge_node_graph: EdgeNodeList<
usize,
EdgeStructOption<8, usize>,
NodeStructOption<4, usize>,
> = EdgeNodeList::from_graph(&source).unwrap();
let mut nodes = [0usize; 8];
let nodes_slice = collect_sorted(edge_node_graph.iter_nodes().unwrap(), &mut nodes);
assert_eq!(nodes_slice, &[0, 1, 2]);
let mut edges = [(0usize, 0usize); 16];
let edges_slice = collect(edge_node_graph.iter_edges().unwrap(), &mut edges);
assert_eq!(
edges_slice,
&[(0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)]
);
}
#[test]
fn test_edge_node_list_from_graph_empty() {
let dict = Dictionary::<usize, [usize; 2], 8>::default();
let source = MapAdjacencyList::new_unchecked(dict);
let edge_node_graph: EdgeNodeList<
usize,
EdgeStructOption<8, usize>,
NodeStructOption<4, usize>,
> = EdgeNodeList::from_graph(&source).unwrap();
assert_eq!(edge_node_graph.iter_nodes().unwrap().count(), 0);
assert_eq!(edge_node_graph.iter_edges().unwrap().count(), 0);
}
#[test]
fn test_edge_node_list_from_graph_node_capacity_exceeded() {
let mut dict = Dictionary::<usize, [usize; 1], 8>::new();
dict.insert(0, [1]).unwrap();
dict.insert(1, [2]).unwrap();
dict.insert(2, [3]).unwrap();
dict.insert(3, [0]).unwrap();
let source = MapAdjacencyList::new_unchecked(dict);
let result: Result<
EdgeNodeList<usize, EdgeStructOption<8, usize>, NodeStructOption<2, usize>>,
_,
> = EdgeNodeList::from_graph(&source);
assert!(matches!(result, Err(GraphError::OutOfCapacity)));
}
#[test]
fn test_edge_node_list_from_graph_edge_capacity_exceeded() {
let mut dict = Dictionary::<usize, [usize; 2], 8>::new();
dict.insert(0, [1, 2]).unwrap(); dict.insert(1, [2, 0]).unwrap(); dict.insert(2, [0, 1]).unwrap(); let source = MapAdjacencyList::new_unchecked(dict);
let result: Result<
EdgeNodeList<usize, EdgeStructOption<4, usize>, NodeStructOption<4, usize>>,
_,
> = EdgeNodeList::from_graph(&source);
assert!(matches!(result, Err(GraphError::OutOfCapacity)));
}
#[test]
fn test_edge_node_list_from_graph_single_node() {
let mut dict = Dictionary::<usize, [usize; 1], 8>::new();
dict.insert(42, [42]).unwrap(); let source = MapAdjacencyList::new_unchecked(dict);
let edge_node_graph: EdgeNodeList<
usize,
EdgeStructOption<8, usize>,
NodeStructOption<4, usize>,
> = EdgeNodeList::from_graph(&source).unwrap();
let mut nodes = [0usize; 4];
let nodes_slice = collect(edge_node_graph.iter_nodes().unwrap(), &mut nodes);
assert_eq!(nodes_slice, &[42]);
let mut edges = [(0usize, 0usize); 4];
let edges_slice = collect(edge_node_graph.iter_edges().unwrap(), &mut edges);
assert_eq!(edges_slice, &[(42, 42)]);
}
#[test]
fn test_edge_node_list_from_graph_chain() {
let mut dict = Dictionary::<usize, [usize; 1], 8>::new();
dict.insert(0, [1]).unwrap(); dict.insert(1, [2]).unwrap(); dict.insert(2, [0]).unwrap(); let source = MapAdjacencyList::new_unchecked(dict);
let edge_node_graph: EdgeNodeList<
usize,
EdgeStructOption<8, usize>,
NodeStructOption<8, usize>,
> = EdgeNodeList::from_graph(&source).unwrap();
let mut nodes = [0usize; 8];
let nodes_slice = collect_sorted(edge_node_graph.iter_nodes().unwrap(), &mut nodes);
assert_eq!(nodes_slice, &[0, 1, 2]);
let mut edges = [(0usize, 0usize); 8];
let edges_slice = collect_sorted(edge_node_graph.iter_edges().unwrap(), &mut edges);
assert_eq!(edges_slice, &[(0, 1), (1, 2), (2, 0)]);
let mut outgoing = [0usize; 2];
let outgoing_slice = collect(edge_node_graph.outgoing_edges(0).unwrap(), &mut outgoing);
assert_eq!(outgoing_slice, &[1]);
let outgoing_slice = collect(edge_node_graph.outgoing_edges(1).unwrap(), &mut outgoing);
assert_eq!(outgoing_slice, &[2]);
let outgoing_slice = collect(edge_node_graph.outgoing_edges(2).unwrap(), &mut outgoing);
assert_eq!(outgoing_slice, &[0]);
}
}