Skip to content

Commit

Permalink
graph/encoding/dot: fix line visit marking
Browse files Browse the repository at this point in the history
  • Loading branch information
kortschak committed Dec 1, 2020
1 parent c6329a4 commit 37d1de1
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 4 deletions.
71 changes: 71 additions & 0 deletions graph/encoding/dot/decode_test.go
Expand Up @@ -393,6 +393,77 @@ func TestMultigraphDecoding(t *testing.T) {
}
}

func TestMultigraphLineIDsharing(t *testing.T) {
for i, test := range []struct {
directed bool
lines []multi.Line
expected string
}{
{
directed: true,
lines: []multi.Line{
{F: multi.Node(0), T: multi.Node(1), UID: 0},
{F: multi.Node(0), T: multi.Node(1), UID: 1},
{F: multi.Node(0), T: multi.Node(2), UID: 0},
{F: multi.Node(2), T: multi.Node(0), UID: 0},
},
expected: directedMultigraph,
},
{
directed: false,
lines: []multi.Line{
{F: multi.Node(0), T: multi.Node(1), UID: 0},
{F: multi.Node(0), T: multi.Node(1), UID: 1},
{F: multi.Node(0), T: multi.Node(2), UID: 0},
{F: multi.Node(0), T: multi.Node(2), UID: 1},
},
expected: undirectedMultigraph,
},
{
directed: true,
lines: []multi.Line{
{F: multi.Node(0), T: multi.Node(0), UID: 0},
{F: multi.Node(0), T: multi.Node(0), UID: 1},
{F: multi.Node(1), T: multi.Node(1), UID: 0},
{F: multi.Node(1), T: multi.Node(1), UID: 1},
},
expected: directedSelfLoopMultigraph,
},
{
directed: false,
lines: []multi.Line{
{F: multi.Node(0), T: multi.Node(0), UID: 0},
{F: multi.Node(0), T: multi.Node(0), UID: 1},
{F: multi.Node(1), T: multi.Node(1), UID: 0},
{F: multi.Node(1), T: multi.Node(1), UID: 1},
},
expected: undirectedSelfLoopMultigraph,
},
} {
var dst encoding.MultiBuilder
if test.directed {
dst = multi.NewDirectedGraph()
} else {
dst = multi.NewUndirectedGraph()
}

for _, l := range test.lines {
dst.SetLine(l)
}

buf, err := MarshalMulti(dst, "", "", "\t")
if err != nil {
t.Errorf("i=%d: unable to marshal graph; %v", i, dst)
continue
}
actual := string(buf)
if actual != test.expected {
t.Errorf("i=%d: graph content mismatch; want:\n%s\n\nactual:\n%s", i, test.expected, actual)
continue
}
}
}

const directedMultigraph = `digraph {
// Node definitions.
0;
Expand Down
18 changes: 14 additions & 4 deletions graph/encoding/dot/encode.go
Expand Up @@ -220,7 +220,7 @@ func (p *simpleGraphPrinter) print(g graph.Graph, name string, needsIndent, isSu
continue
}
p.visited[edge{inGraph: name, from: nid, to: tid}] = true
p.visited[edge{inGraph: name, from: tid, to: n.ID()}] = true
p.visited[edge{inGraph: name, from: tid, to: nid}] = true
}

if !havePrintedEdgeHeader {
Expand Down Expand Up @@ -432,6 +432,8 @@ type multiGraphPrinter struct {

type line struct {
inGraph string
from int64
to int64
id int64
}

Expand Down Expand Up @@ -510,10 +512,18 @@ func (p *multiGraphPrinter) print(g graph.Multigraph, name string, needsIndent,

for _, l := range lines {
lid := l.ID()
if p.visited[line{inGraph: name, id: lid}] {
continue
if isDirected {
if p.visited[line{inGraph: name, from: nid, to: tid, id: lid}] {
continue
}
p.visited[line{inGraph: name, from: nid, to: tid, id: lid}] = true
} else {
if p.visited[line{inGraph: name, from: nid, to: tid, id: lid}] {
continue
}
p.visited[line{inGraph: name, from: nid, to: tid, id: lid}] = true
p.visited[line{inGraph: name, from: tid, to: nid, id: lid}] = true
}
p.visited[line{inGraph: name, id: lid}] = true

if !havePrintedEdgeHeader {
p.buf.WriteByte('\n')
Expand Down

0 comments on commit 37d1de1

Please sign in to comment.