snark-tool 0.4.0

snark-tool library contains structures and algorithm for (mainly) cubic graph analysis
Documentation
use crate::graph::edge::EdgeConstructor;
use crate::graph::graph::{Graph, GraphConstructor};
use crate::graph::undirected::edge::UndirectedEdge;
use crate::graph::undirected::simple_edge_graph::graph::SimpleEdgeGraph;

#[test]
fn should_create_graph() {
    let graph = get_graph();
    assert_eq!(graph.has_edge(0, 1), true);
    assert_eq!(graph.has_edge(0, 2), true);
    assert_eq!(graph.has_edge(1, 2), true);
    assert_eq!(graph.has_edge(2, 1), true);
    assert_eq!(graph.has_edge(3, 1), false);
    assert_eq!(graph.has_edge(1, 1), false);
    assert_eq!(graph.has_edge(1, 3), false);
}

#[test]
fn should_format_graph() {
    let graph = get_graph();
    let graph = format!("{}", graph);
    let string = "0: 1, 2\n1: 0, 2\n2: 0, 1\n";
    assert_eq!(graph, string);
}

#[test]
fn should_be_equal() {
    let first = get_graph();
    let mut second = SimpleEdgeGraph::with_capacity(3, 3);
    second.add_edge(2, 1);
    second.add_edge(0, 2);
    second.add_edge(0, 1);
    assert_eq!(first, second);
}

#[test]
fn should_not_be_equal() {
    let first = get_graph();
    let mut second = SimpleEdgeGraph::with_capacity(3, 3);
    second.add_edge(2, 1);
    second.add_edge(0, 2);
    second.add_edge(0, 3);
    assert_ne!(first, second);
}

fn get_graph() -> SimpleEdgeGraph {
    let mut graph = SimpleEdgeGraph::with_capacity(3, 3);
    graph.add_vertex();
    graph.add_vertex();
    graph.add_vertex();

    graph.add_edge(2, 0);
    graph.add_edge(2, 1);
    graph.add_edge(0, 1);
    graph
}

#[test]
fn should_iter_edges() {
    let graph = get_graph();
    let mut index = 0;
    for edge in graph.edges() {
        if index == 0 {
            assert_eq!(edge, &UndirectedEdge::new(0, 1));
        }
        if index == 1 {
            assert_eq!(edge, &UndirectedEdge::new(0, 2));
        }
        if index == 2 {
            assert_eq!(edge, &UndirectedEdge::new(1, 2));
        }
        index += 1;
    }
    assert_eq!(index, 3);
}

#[test]
fn should_iter_edges_of_vertex() {
    let graph = get_graph();
    let mut index = 0;
    for edge in graph.edges_of_vertex(1) {
        if index == 0 {
            assert_eq!(edge, &UndirectedEdge::new(0, 1));
        }
        if index == 1 {
            assert_eq!(edge, &UndirectedEdge::new(1, 2));
        }
        index += 1;
    }
    assert_eq!(index, 2);
}

#[test]
fn should_remove_edges_of_vertex() {
    let mut graph = get_graph();
    assert_eq!(graph.has_edge(0, 1), true);
    assert_eq!(graph.has_edge(0, 2), true);
    assert_eq!(graph.has_edge(1, 2), true);
    graph.remove_edge(0, 1);
    assert_eq!(graph.has_edge(0, 1), false);
    assert_eq!(graph.has_edge(0, 2), true);
    graph.remove_edges_of_vertex(0);
    assert_eq!(graph.has_edge(0, 1), false);
    assert_eq!(graph.has_edge(0, 2), false);
    assert_eq!(graph.has_edge(1, 2), true);
}