pgraph: Add LookupEdge function

The new LookupEdge function lets you find which vertices are associated
with a particular edge, if any.
This commit is contained in:
James Shubin
2023-04-20 15:45:46 -04:00
parent 3f5957d30e
commit 7075b8b973
2 changed files with 85 additions and 0 deletions

View File

@@ -288,6 +288,21 @@ func (g *Graph) FindEdge(v1, v2 Vertex) Edge {
return edge
}
// LookupEdge takes an edge and tries to find the vertex pair that connects it.
// If it finds a match, then it returns the pair and true. Otherwise it returns
// false.
func (g *Graph) LookupEdge(e Edge) (Vertex, Vertex, bool) {
for v1, x := range g.adjacency {
for v2, edge := range x {
if edge == e {
return v1, v2, true
}
}
}
return nil, nil, false // not found
}
// Vertices returns a randomly sorted slice of all vertices in the graph. The
// order is random, because the map implementation is intentionally so!
func (g *Graph) Vertices() []Vertex {

View File

@@ -938,6 +938,76 @@ func TestFindEdge2(t *testing.T) {
}
}
func TestLookupEdge1(t *testing.T) {
g, _ := NewGraph("g")
v1 := NV("v1")
v2 := NV("v2")
v3 := NV("v3")
v4 := NV("v4")
v5 := NV("v5")
v6 := NV("v6")
v7 := NV("v7")
e1 := NE("e1")
e2 := NE("e2")
e3 := NE("e3")
e4 := NE("e4")
e5 := NE("e5")
e6 := NE("e6")
e7 := NE("e7")
e8 := NE("e8")
e9 := NE("e9")
e10 := NE("e10")
g.AddEdge(v1, v2, e1)
g.AddEdge(v1, v4, e2)
g.AddEdge(v1, v3, e3)
g.AddEdge(v2, v3, e4)
g.AddEdge(v2, v4, e5)
g.AddEdge(v2, v6, e6)
g.AddEdge(v2, v5, e7)
g.AddEdge(v3, v6, e8)
g.AddEdge(v4, v7, e9)
g.AddEdge(v5, v7, e10)
if x, y, found := g.LookupEdge(e1); !found || x != v1 || y != v2 {
t.Errorf("vertices v1, v2 were not returned")
}
if x, y, found := g.LookupEdge(e2); !found || x != v1 || y != v4 {
t.Errorf("vertices v1, v4 were not returned")
}
if x, y, found := g.LookupEdge(e3); !found || x != v1 || y != v3 {
t.Errorf("vertices v1, v3 were not returned")
}
if x, y, found := g.LookupEdge(e4); !found || x != v2 || y != v3 {
t.Errorf("vertices v2, v3 were not returned")
}
if x, y, found := g.LookupEdge(e5); !found || x != v2 || y != v4 {
t.Errorf("vertices v2, v4 were not returned")
}
if x, y, found := g.LookupEdge(e6); !found || x != v2 || y != v6 {
t.Errorf("vertices v2, v6 were not returned")
}
if x, y, found := g.LookupEdge(e7); !found || x != v2 || y != v5 {
t.Errorf("vertices v2, v5 were not returned")
}
if x, y, found := g.LookupEdge(e8); !found || x != v3 || y != v6 {
t.Errorf("vertices v3, v6 were not returned")
}
if x, y, found := g.LookupEdge(e9); !found || x != v4 || y != v7 {
t.Errorf("vertices v4, v7 were not returned")
}
if x, y, found := g.LookupEdge(e10); !found || x != v5 || y != v7 {
t.Errorf("vertices v5, v7 were not returned")
}
e99 := NE("e99")
if _, _, found := g.LookupEdge(e99); found {
t.Errorf("unexpected vertices were found")
}
}
func TestSetValue(t *testing.T) {
g, _ := NewGraph("SetValue")