dep_graph/
node.rs

1use std::cmp::PartialEq;
2use std::collections::HashSet;
3use std::fmt;
4use std::hash::Hash;
5
6/// Single node in a dependency graph, which might have dependencies or be
7/// be used as a dependency by other nodes.
8///
9/// A node is represented by a unique identifier and may contain a list of
10/// dependencies.
11#[derive(Clone, Debug)]
12pub struct Node<I>
13where
14    I: Clone + fmt::Debug + Eq + Hash + PartialEq + Send + Sync,
15{
16    id: I,
17    deps: HashSet<I>,
18}
19
20impl<I> Node<I>
21where
22    I: Clone + fmt::Debug + Eq + Hash + PartialEq + Send + Sync,
23{
24    pub fn new(id: I) -> Node<I> {
25        Node {
26            id,
27            deps: HashSet::default(),
28        }
29    }
30
31    pub fn id(&self) -> &I {
32        &self.id
33    }
34    pub fn deps(&self) -> &HashSet<I> {
35        &self.deps
36    }
37    pub fn add_dep(&mut self, dep: I) {
38        self.deps.insert(dep);
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn empty_node() {
48        let node = Node::new("node");
49
50        assert_eq!(*node.id(), "node");
51        assert_eq!(node.deps().len(), 0);
52    }
53
54    #[test]
55    fn empty_usize_node() {
56        let node: Node<usize> = Node::new(42);
57
58        assert_eq!(*node.id(), 42);
59        assert_eq!(node.deps.len(), 0);
60    }
61
62    #[test]
63    fn one_dep() {
64        let mut root = Node::new("root");
65        let dep1 = Node::new("dep1");
66
67        root.add_dep(dep1.id());
68
69        assert_eq!(root.deps().len(), 1);
70    }
71
72    #[test]
73    fn two_deps() {
74        let mut root = Node::new("root");
75        let dep1 = Node::new("dep1");
76        let dep2 = Node::new("dep2");
77
78        root.add_dep(dep1.id());
79        root.add_dep(dep2.id());
80
81        assert_eq!(root.deps().len(), 2);
82        assert_eq!(dep1.deps().len(), 0);
83        assert_eq!(dep2.deps().len(), 0);
84    }
85
86    #[test]
87    fn diamonds() {
88        let mut root = Node::new("root");
89        let mut dep1 = Node::new("dep1");
90        let mut dep2 = Node::new("dep2");
91        let leaf = Node::new("leaf");
92
93        root.add_dep(dep1.id());
94        root.add_dep(dep2.id());
95        dep1.add_dep(leaf.id());
96        dep2.add_dep(leaf.id());
97
98        assert_eq!(root.deps().len(), 2);
99        assert_eq!(dep1.deps().len(), 1);
100        assert_eq!(dep2.deps().len(), 1);
101        assert_eq!(leaf.deps().len(), 0);
102    }
103}