-use NodeLabels::*;
-use super::{Id, Labeller, Nodes, Edges, GraphWalk, render, Style};
-use super::LabelText::{self, LabelStr, EscStr, HtmlStr};
+use super::LabelText::{self, EscStr, HtmlStr, LabelStr};
+use super::{render, Edges, GraphWalk, Id, Labeller, Nodes, Style};
use std::io;
use std::io::prelude::*;
+use NodeLabels::*;
/// each node is an index in a vector in the graph.
type Node = usize;
}
fn edge(from: usize, to: usize, label: &'static str, style: Style) -> Edge {
- Edge {
- from,
- to,
- label,
- style,
- }
+ Edge { from, to, label, style }
}
struct LabelledGraph {
}
impl LabelledGraph {
- fn new(name: &'static str,
- node_labels: Trivial,
- edges: Vec<Edge>,
- node_styles: Option<Vec<Style>>)
- -> LabelledGraph {
+ fn new(
+ name: &'static str,
+ node_labels: Trivial,
+ edges: Vec<Edge>,
+ node_styles: Option<Vec<Style>>,
+ ) -> LabelledGraph {
let count = node_labels.len();
LabelledGraph {
name,
}
impl LabelledGraphWithEscStrs {
- fn new(name: &'static str,
- node_labels: Trivial,
- edges: Vec<Edge>)
- -> LabelledGraphWithEscStrs {
+ fn new(name: &'static str, node_labels: Trivial, edges: Vec<Edge>) -> LabelledGraphWithEscStrs {
LabelledGraphWithEscStrs { graph: LabelledGraph::new(name, node_labels, edges, None) }
}
}
fn empty_graph() {
let labels: Trivial = UnlabelledNodes(0);
let r = test_input(LabelledGraph::new("empty_graph", labels, vec![], None));
- assert_eq!(r.unwrap(),
-r#"digraph empty_graph {
+ assert_eq!(
+ r.unwrap(),
+ r#"digraph empty_graph {
}
-"#);
+"#
+ );
}
#[test]
fn single_node() {
let labels: Trivial = UnlabelledNodes(1);
let r = test_input(LabelledGraph::new("single_node", labels, vec![], None));
- assert_eq!(r.unwrap(),
-r#"digraph single_node {
+ assert_eq!(
+ r.unwrap(),
+ r#"digraph single_node {
N0[label="N0"];
}
-"#);
+"#
+ );
}
#[test]
let labels: Trivial = UnlabelledNodes(1);
let styles = Some(vec![Style::Dashed]);
let r = test_input(LabelledGraph::new("single_node", labels, vec![], styles));
- assert_eq!(r.unwrap(),
-r#"digraph single_node {
+ assert_eq!(
+ r.unwrap(),
+ r#"digraph single_node {
N0[label="N0"][style="dashed"];
}
-"#);
+"#
+ );
}
#[test]
fn single_edge() {
let labels: Trivial = UnlabelledNodes(2);
- let result = test_input(LabelledGraph::new("single_edge",
- labels,
- vec![edge(0, 1, "E", Style::None)],
- None));
- assert_eq!(result.unwrap(),
-r#"digraph single_edge {
+ let result = test_input(LabelledGraph::new(
+ "single_edge",
+ labels,
+ vec![edge(0, 1, "E", Style::None)],
+ None,
+ ));
+ assert_eq!(
+ result.unwrap(),
+ r#"digraph single_edge {
N0[label="N0"];
N1[label="N1"];
N0 -> N1[label="E"];
}
-"#);
+"#
+ );
}
#[test]
fn single_edge_with_style() {
let labels: Trivial = UnlabelledNodes(2);
- let result = test_input(LabelledGraph::new("single_edge",
- labels,
- vec![edge(0, 1, "E", Style::Bold)],
- None));
- assert_eq!(result.unwrap(),
-r#"digraph single_edge {
+ let result = test_input(LabelledGraph::new(
+ "single_edge",
+ labels,
+ vec![edge(0, 1, "E", Style::Bold)],
+ None,
+ ));
+ assert_eq!(
+ result.unwrap(),
+ r#"digraph single_edge {
N0[label="N0"];
N1[label="N1"];
N0 -> N1[label="E"][style="bold"];
}
-"#);
+"#
+ );
}
#[test]
fn test_some_labelled() {
let labels: Trivial = SomeNodesLabelled(vec![Some("A"), None]);
let styles = Some(vec![Style::None, Style::Dotted]);
- let result = test_input(LabelledGraph::new("test_some_labelled",
- labels,
- vec![edge(0, 1, "A-1", Style::None)],
- styles));
- assert_eq!(result.unwrap(),
-r#"digraph test_some_labelled {
+ let result = test_input(LabelledGraph::new(
+ "test_some_labelled",
+ labels,
+ vec![edge(0, 1, "A-1", Style::None)],
+ styles,
+ ));
+ assert_eq!(
+ result.unwrap(),
+ r#"digraph test_some_labelled {
N0[label="A"];
N1[label="N1"][style="dotted"];
N0 -> N1[label="A-1"];
}
-"#);
+"#
+ );
}
#[test]
fn single_cyclic_node() {
let labels: Trivial = UnlabelledNodes(1);
- let r = test_input(LabelledGraph::new("single_cyclic_node",
- labels,
- vec![edge(0, 0, "E", Style::None)],
- None));
- assert_eq!(r.unwrap(),
-r#"digraph single_cyclic_node {
+ let r = test_input(LabelledGraph::new(
+ "single_cyclic_node",
+ labels,
+ vec![edge(0, 0, "E", Style::None)],
+ None,
+ ));
+ assert_eq!(
+ r.unwrap(),
+ r#"digraph single_cyclic_node {
N0[label="N0"];
N0 -> N0[label="E"];
}
-"#);
+"#
+ );
}
#[test]
fn hasse_diagram() {
let labels = AllNodesLabelled(vec!["{x,y}", "{x}", "{y}", "{}"]);
- let r = test_input(LabelledGraph::new("hasse_diagram",
- labels,
- vec![edge(0, 1, "", Style::None),
- edge(0, 2, "", Style::None),
- edge(1, 3, "", Style::None),
- edge(2, 3, "", Style::None)],
- None));
- assert_eq!(r.unwrap(),
-r#"digraph hasse_diagram {
+ let r = test_input(LabelledGraph::new(
+ "hasse_diagram",
+ labels,
+ vec![
+ edge(0, 1, "", Style::None),
+ edge(0, 2, "", Style::None),
+ edge(1, 3, "", Style::None),
+ edge(2, 3, "", Style::None),
+ ],
+ None,
+ ));
+ assert_eq!(
+ r.unwrap(),
+ r#"digraph hasse_diagram {
N0[label="{x,y}"];
N1[label="{x}"];
N2[label="{y}"];
N1 -> N3[label=""];
N2 -> N3[label=""];
}
-"#);
+"#
+ );
}
#[test]
\\l",
"branch1",
"branch2",
- "afterward"]);
+ "afterward",
+ ]);
let mut writer = Vec::new();
- let g = LabelledGraphWithEscStrs::new("syntax_tree",
- labels,
- vec![edge(0, 1, "then", Style::None),
- edge(0, 2, "else", Style::None),
- edge(1, 3, ";", Style::None),
- edge(2, 3, ";", Style::None)]);
+ let g = LabelledGraphWithEscStrs::new(
+ "syntax_tree",
+ labels,
+ vec![
+ edge(0, 1, "then", Style::None),
+ edge(0, 2, "else", Style::None),
+ edge(1, 3, ";", Style::None),
+ edge(2, 3, ";", Style::None),
+ ],
+ );
render(&g, &mut writer).unwrap();
let mut r = String::new();
Read::read_to_string(&mut &*writer, &mut r).unwrap();
- assert_eq!(r,
-r#"digraph syntax_tree {
+ assert_eq!(
+ r,
+ r#"digraph syntax_tree {
N0[label="if test {\l branch1\l} else {\l branch2\l}\lafterward\l"];
N1[label="branch1"];
N2[label="branch2"];
N1 -> N3[label=";"];
N2 -> N3[label=";"];
}
-"#);
+"#
+ );
}
#[test]