ttgraph 0.5.0

Typed/Transactional Graph container
Documentation
#![allow(dead_code)]
#![allow(unused_variables)]
#![allow(unused_mut)]

#[cfg(test)]
mod test_group {
  use std::collections::BTreeSet;

  use ttgraph::*;

  #[derive(TypedNode, Debug)]
  struct Node {
    #[group(group1, x)]
    a: NodeIndex,
    #[group(group1, x)]
    b: Vec<NodeIndex>,
    #[group(group2)]
    c: NodeIndex,
    inserted: NodeIndex,
    #[group(group2, x)]
    d: BTreeSet<NodeIndex>,
  }

  impl Default for Node {
    fn default() -> Self {
      Node {
        a: NodeIndex::empty(),
        b: Vec::default(),
        c: NodeIndex::empty(),
        inserted: NodeIndex::empty(),
        d: BTreeSet::default(),
      }
    }
  }

  node_enum! {
    #[derive(Debug)]
    enum Nodes{
      A(Node)
    }
  }

  #[test]
  fn test_link_group() {
    let ctx = Context::new();
    let mut graph = Graph::<Nodes>::new(&ctx);
    let mut trans = Transaction::new(&ctx);

    let x1 = trans.insert(Nodes::A(Node::default()));
    let x2 = trans.insert(Nodes::A(Node::default()));
    let x3 = trans.insert(Nodes::A(Node::default()));
    let x4 = trans.insert(Nodes::A(Node::default()));
    let x5 = trans.insert(Nodes::A(Node {
      a: x1,
      b: vec![x2, x3],
      c: x4,
      inserted: x2,
      d: BTreeSet::from([x1, x3]),
    }));

    graph.commit(trans).unwrap();

    let node = graph.get(x5).unwrap();
    assert_eq!(node.get_links_by_group("group1"), vec![x1, x2, x3]);
    assert_eq!(node.get_links_by_group("group2"), vec![x4, x1, x3]);
    assert_eq!(node.get_links_by_group("x"), vec![x1, x2, x3, x1, x3]);
  }

  #[derive(TypedNode, Debug)]
  struct NodeA {
    a: usize,
  }
  #[derive(TypedNode, Debug)]
  struct NodeB {
    b: usize,
  }
  #[derive(TypedNode, Debug)]
  struct NodeC {
    c: usize,
  }
  #[derive(TypedNode, Debug)]
  struct NodeD {
    d: usize,
  }

  node_enum! {
    #[derive(Debug)]
    enum MultiNodes{
      A(NodeA),
      B(NodeB),
      C(NodeC),
      D(NodeD),
    }
    group!{
      first{A, B},
      second{C, D},
      third{A, D},
      one{B},
      all{A, B, C, D},
    }
  }

  #[test]
  fn test_node_group() {
    let ctx = Context::new();
    let mut graph = Graph::<MultiNodes>::new(&ctx);
    let mut trans = Transaction::new(&ctx);

    let a = trans.insert(MultiNodes::A(NodeA { a: 1 }));
    let b = trans.insert(MultiNodes::B(NodeB { b: 2 }));
    let c = trans.insert(MultiNodes::C(NodeC { c: 3 }));
    let d = trans.insert(MultiNodes::D(NodeD { d: 4 }));

    graph.commit(trans).unwrap();

    assert_eq!(Vec::from_iter(graph.iter_group("first").map(|(x, _)| x)), vec![a, b]);
    assert_eq!(Vec::from_iter(graph.iter_group("second").map(|(x, _)| x)), vec![c, d]);
    assert_eq!(Vec::from_iter(graph.iter_group("third").map(|(x, _)| x)), vec![a, d]);
    assert_eq!(Vec::from_iter(graph.iter_group("one").map(|(x, _)| x)), vec![b]);
    assert_eq!(Vec::from_iter(graph.iter_group("all").map(|(x, _)| x)), vec![a, b, c, d]);
  }

  #[derive(TypedNode)]
  #[phantom_group(b)]
  struct A {
    #[group(a)]
    x: NodeIndex,
  }

  #[derive(TypedNode)]
  struct B {
    #[group(a)]
    x: NodeIndex,
    #[group(b)]
    y: NodeIndex,
  }

  node_enum! {
    enum NodeAB{
      A(A),
      B(B),
    }
    group!{ All{A, B} }
    link_type!{
      All.a : A,
      All.b : B,
    }
  }
}