pub mod error;
mod graph;
#[cfg(feature = "rayon")]
mod graph_par;
mod node;
pub use graph::DepGraph;
#[cfg(feature = "rayon")]
pub use graph_par::Wrapper;
pub use node::Node;
#[cfg(test)]
mod tests {
use super::*;
#[cfg(feature = "rayon")]
use rayon::prelude::*;
use std::time::Duration;
#[cfg(feature = "rayon")]
#[test]
fn par_diamond_graph() {
let mut n1 = Node::new("1");
let mut n2 = Node::new("2");
let mut n3 = Node::new("3");
let n4 = Node::new("4");
n1.add_dep(n2.id());
n1.add_dep(n3.id());
n2.add_dep(n4.id());
n3.add_dep(n4.id());
let deps = vec![n1, n2, n3, n4];
let r = DepGraph::new(&deps);
let result = r.into_par_iter().map(|_| true).collect::<Vec<bool>>();
assert_eq!(result.len(), deps.len());
}
#[cfg(feature = "rayon")]
#[test]
fn par_diamond_graph_steps() {
let mut n1 = Node::new("1");
let mut n2 = Node::new("2");
let mut n3 = Node::new("3");
let n4 = Node::new("4");
n1.add_dep(n2.id());
n1.add_dep(n3.id());
n2.add_dep(n4.id());
n3.add_dep(n4.id());
let deps = vec![n1, n2, n3, n4];
let r = DepGraph::new(&deps);
let result = r
.into_par_iter()
.map(|node_id| (*node_id).parse::<u64>().unwrap())
.reduce(|| 0, |acc, x| acc + x);
assert_eq!(result, 10);
}
#[cfg(feature = "rayon")]
#[test]
fn par_diamond_graph_with_timeout() {
let mut n1 = Node::new("1");
let mut n2 = Node::new("2");
let mut n3 = Node::new("3");
let n4 = Node::new("4");
n1.add_dep(n2.id());
n1.add_dep(n3.id());
n2.add_dep(n4.id());
n3.add_dep(n4.id());
let deps = vec![n1, n2, n3, n4];
let r = DepGraph::new(&deps);
let result = r
.into_par_iter()
.with_timeout(Duration::from_secs(2))
.map(|_| true)
.collect::<Vec<bool>>();
assert_eq!(result.len(), deps.len());
}
#[test]
fn iter_diamond_graph() {
let mut n1 = Node::new("1");
let mut n2 = Node::new("2");
let mut n3 = Node::new("3");
let n4 = Node::new("4");
n1.add_dep(n2.id());
n1.add_dep(n3.id());
n2.add_dep(n4.id());
n3.add_dep(n4.id());
let deps = vec![n1, n2, n3, n4];
let r = DepGraph::new(&deps);
let result = r.into_iter().map(|_| true).collect::<Vec<bool>>();
assert_eq!(result.len(), deps.len());
}
#[cfg(feature = "rayon")]
#[test]
fn par_thousand_graph() {
let mut nodes: Vec<Node<_>> = (0..1000).map(|i| Node::new(format!("{}", i))).collect();
for i in 1..1000 {
nodes[i].add_dep("0".to_string());
}
let r = DepGraph::new(&nodes);
let result = r.into_par_iter().map(|_| true).collect::<Vec<bool>>();
assert_eq!(result.len(), nodes.len());
}
#[test]
fn iter_thousand_graph() {
let mut nodes: Vec<Node<_>> = (0..1000).map(|i| Node::new(format!("{}", i))).collect();
for i in 1..1000 {
nodes[i].add_dep("0".to_string());
}
let r = DepGraph::new(&nodes);
let result = r.into_iter().map(|_| true).collect::<Vec<bool>>();
assert_eq!(result.len(), nodes.len());
}
}