diff --git a/digraph/graphviz_test.go b/digraph/graphviz_test.go index fce1ebb6f..5595188ed 100644 --- a/digraph/graphviz_test.go +++ b/digraph/graphviz_test.go @@ -1,44 +1,101 @@ package digraph import ( - "bytes" - "strings" - "testing" + "bytes" + "reflect" + "sort" + "strings" + "testing" ) +var testTable = []struct { + BasicData string // Basic graph data + ExpectedDigraphData string // Digraph data which should be generated from BasicData +}{ + { + `a -> b ; foo + a -> c + b -> d + b -> e + `, + `digraph { + "a"; + "a" -> "b" [label="foo"]; + "a" -> "c" [label="Edge"]; + "b"; + "b" -> "d" [label="Edge"]; + "b" -> "e" [label="Edge"]; + "c"; + "d"; + "e"; + }`, + }, + { + `a -> c ; foo + a -> d + b -> c + b -> e + a -> f + `, + `digraph { + "a"; + "a" -> "c" [label="foo"]; + "a" -> "f" [label="Edge"]; + "a" -> "d" [label="Edge"]; + "b"; + "b" -> "c" [label="Edge"]; + "b" -> "e" [label="Edge"]; + "c"; + "d"; + "e"; + "f"; + }`, + }, +} + +// Nieve normalizer. Takes a string, splits it and sorts it. +func normalize(input string) []string { + out := strings.Split(input, "\n") + + // trim each line + for i, str := range out { + out[i] = strings.TrimSpace(str) + } + + sort.Strings(out) + return out +} + func TestWriteDot(t *testing.T) { - nodes := ParseBasic(`a -> b ; foo -a -> c -b -> d -b -> e -`) - var nlist []Node - for _, n := range nodes { - nlist = append(nlist, n) - } + // Build []Node from BasicNode map + var buildNodes = func(nodes map[string]*BasicNode) []Node { + var nlist []Node + for _, n := range nodes { + nlist = append(nlist, n) + } + return nlist + } - buf := bytes.NewBuffer(nil) - if err := WriteDot(buf, nlist); err != nil { - t.Fatalf("err: %s", err) - } + // Get a normalized string representation of the file + var writeFile = func(nlist []Node) string { + buf := bytes.NewBuffer(nil) + if err := WriteDot(buf, nlist); err != nil { + t.Fatalf("err: %s", err) + } + return strings.TrimSpace(string(buf.Bytes())) + } - actual := strings.TrimSpace(string(buf.Bytes())) - expected := strings.TrimSpace(writeDotStr) - if actual != expected { - t.Fatalf("bad: %s", actual) - } + // For each entry in the test table construct an + // actual and expected values and compare. + for _, data := range testTable { + nodes := buildNodes(ParseBasic(data.BasicData)) + actual := normalize(writeFile(nodes)) + expected := normalize(strings.TrimSpace(data.ExpectedDigraphData)) + + // Deep equal the array values + if !reflect.DeepEqual(actual, expected) { + t.Logf("Expected:\n%s", expected) + t.Fatalf("Bad:\n%s", actual) + } + } } - -const writeDotStr = ` -digraph { - "a"; - "a" -> "b" [label="foo"]; - "a" -> "c" [label="Edge"]; - "b"; - "b" -> "d" [label="Edge"]; - "b" -> "e" [label="Edge"]; - "c"; - "d"; - "e"; -} -`