dag: string DotOpts through to vertex

Fixes #11052

It appears that historically nodes did not expect DotOpts to ever be
nil. To avoid nil panics in general I'm in agreement with this behavior
so this modifies dag to always pass in a non-nil DotOpts. Tests
included.
This commit is contained in:
Mitchell Hashimoto 2017-01-08 11:59:18 -08:00
parent 4fd1035622
commit c8df3e5995
No known key found for this signature in database
GPG Key ID: 744E147AA52F5B0A
2 changed files with 42 additions and 3 deletions

View File

@ -79,7 +79,7 @@ func (g *marshalGraph) Dot(opts *DotOpts) []byte {
return w.Bytes()
}
func (v *marshalVertex) dot(g *marshalGraph) []byte {
func (v *marshalVertex) dot(g *marshalGraph, opts *DotOpts) []byte {
var buf bytes.Buffer
graphName := g.Name
if graphName == "" {
@ -89,7 +89,7 @@ func (v *marshalVertex) dot(g *marshalGraph) []byte {
name := v.Name
attrs := v.Attrs
if v.graphNodeDotter != nil {
node := v.graphNodeDotter.DotNode(name, nil)
node := v.graphNodeDotter.DotNode(name, opts)
if node == nil {
return []byte{}
}
@ -171,7 +171,7 @@ func (g *marshalGraph) writeBody(opts *DotOpts, w *indentWriter) {
continue
}
w.Write(v.dot(g))
w.Write(v.dot(g, opts))
}
var dotEdges []string

39
dag/dot_test.go Normal file
View File

@ -0,0 +1,39 @@
package dag
import (
"reflect"
"testing"
)
func TestGraphDot_opts(t *testing.T) {
var v testDotVertex
var g Graph
g.Add(&v)
opts := &DotOpts{MaxDepth: 42}
actual := g.Dot(opts)
if len(actual) == 0 {
t.Fatal("should not be empty")
}
if !v.DotNodeCalled {
t.Fatal("should call DotNode")
}
if !reflect.DeepEqual(v.DotNodeOpts, opts) {
t.Fatalf("bad; %#v", v.DotNodeOpts)
}
}
type testDotVertex struct {
DotNodeCalled bool
DotNodeTitle string
DotNodeOpts *DotOpts
DotNodeReturn *DotNode
}
func (v *testDotVertex) DotNode(title string, opts *DotOpts) *DotNode {
v.DotNodeCalled = true
v.DotNodeTitle = title
v.DotNodeOpts = opts
return v.DotNodeReturn
}