mirror of
https://github.com/gonum/gonum.git
synced 2025-11-03 11:21:14 +08:00
graph: test all slicer helper functions
This commit is contained in:
316
graph/nodes_edges_test.go
Normal file
316
graph/nodes_edges_test.go
Normal file
@@ -0,0 +1,316 @@
|
||||
// Copyright ©2019 The Gonum Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package graph_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"gonum.org/v1/gonum/graph"
|
||||
"gonum.org/v1/gonum/graph/iterator"
|
||||
"gonum.org/v1/gonum/graph/multi"
|
||||
"gonum.org/v1/gonum/graph/simple"
|
||||
)
|
||||
|
||||
// nodes
|
||||
// edges
|
||||
// weightededges
|
||||
// lines
|
||||
// weightedlines
|
||||
// empty
|
||||
|
||||
var nodesOfTests = []struct {
|
||||
name string
|
||||
nodes graph.Nodes
|
||||
want []graph.Node
|
||||
}{
|
||||
{
|
||||
name: "nil",
|
||||
nodes: nil,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "empty",
|
||||
nodes: graph.Empty,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no nodes",
|
||||
nodes: iterator.NewOrderedNodes(nil),
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "implicit nodes",
|
||||
nodes: iterator.NewImplicitNodes(-1, 4, func(id int) graph.Node { return simple.Node(id) }),
|
||||
want: []graph.Node{simple.Node(-1), simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(3)},
|
||||
},
|
||||
{
|
||||
name: "no slice method",
|
||||
nodes: basicNodes{iterator.NewOrderedNodes([]graph.Node{simple.Node(-1), simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(3)})},
|
||||
want: []graph.Node{simple.Node(-1), simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(3)},
|
||||
},
|
||||
{
|
||||
name: "explicit nodes",
|
||||
nodes: iterator.NewOrderedNodes([]graph.Node{simple.Node(-1), simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(3)}),
|
||||
want: []graph.Node{simple.Node(-1), simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(3)},
|
||||
},
|
||||
}
|
||||
|
||||
type basicNodes struct {
|
||||
graph.Nodes
|
||||
}
|
||||
|
||||
func TestNodesOf(t *testing.T) {
|
||||
for _, test := range nodesOfTests {
|
||||
got := graph.NodesOf(test.nodes)
|
||||
if !reflect.DeepEqual(got, test.want) {
|
||||
t.Errorf("unexpected result for %q: got:%v want:%v", test.name, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var edgesOfTests = []struct {
|
||||
name string
|
||||
edges graph.Edges
|
||||
want []graph.Edge
|
||||
}{
|
||||
{
|
||||
name: "nil",
|
||||
edges: nil,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "empty",
|
||||
edges: graph.Empty,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no edges",
|
||||
edges: iterator.NewOrderedEdges(nil),
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no slice method",
|
||||
edges: basicEdges{iterator.NewOrderedEdges([]graph.Edge{
|
||||
simple.Edge{F: simple.Node(-1), T: simple.Node(0)},
|
||||
simple.Edge{F: simple.Node(1), T: simple.Node(2)},
|
||||
simple.Edge{F: simple.Node(3), T: simple.Node(4)},
|
||||
})},
|
||||
want: []graph.Edge{
|
||||
simple.Edge{F: simple.Node(-1), T: simple.Node(0)},
|
||||
simple.Edge{F: simple.Node(1), T: simple.Node(2)},
|
||||
simple.Edge{F: simple.Node(3), T: simple.Node(4)},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "explicit edges",
|
||||
edges: iterator.NewOrderedEdges([]graph.Edge{
|
||||
simple.Edge{F: simple.Node(-1), T: simple.Node(0)},
|
||||
simple.Edge{F: simple.Node(1), T: simple.Node(2)},
|
||||
simple.Edge{F: simple.Node(3), T: simple.Node(4)},
|
||||
}),
|
||||
want: []graph.Edge{
|
||||
simple.Edge{F: simple.Node(-1), T: simple.Node(0)},
|
||||
simple.Edge{F: simple.Node(1), T: simple.Node(2)},
|
||||
simple.Edge{F: simple.Node(3), T: simple.Node(4)},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
type basicEdges struct {
|
||||
graph.Edges
|
||||
}
|
||||
|
||||
func TestEdgesOf(t *testing.T) {
|
||||
for _, test := range edgesOfTests {
|
||||
got := graph.EdgesOf(test.edges)
|
||||
if !reflect.DeepEqual(got, test.want) {
|
||||
t.Errorf("unexpected result for %q: got:%v want:%v", test.name, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var weightedEdgesOfTests = []struct {
|
||||
name string
|
||||
edges graph.WeightedEdges
|
||||
want []graph.WeightedEdge
|
||||
}{
|
||||
{
|
||||
name: "nil",
|
||||
edges: nil,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "empty",
|
||||
edges: graph.Empty,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no edges",
|
||||
edges: iterator.NewOrderedWeightedEdges(nil),
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no slice method",
|
||||
edges: basicWeightedEdges{iterator.NewOrderedWeightedEdges([]graph.WeightedEdge{
|
||||
simple.WeightedEdge{F: simple.Node(-1), T: simple.Node(0), W: 1},
|
||||
simple.WeightedEdge{F: simple.Node(1), T: simple.Node(2), W: 2},
|
||||
simple.WeightedEdge{F: simple.Node(3), T: simple.Node(4), W: 3},
|
||||
})},
|
||||
want: []graph.WeightedEdge{
|
||||
simple.WeightedEdge{F: simple.Node(-1), T: simple.Node(0), W: 1},
|
||||
simple.WeightedEdge{F: simple.Node(1), T: simple.Node(2), W: 2},
|
||||
simple.WeightedEdge{F: simple.Node(3), T: simple.Node(4), W: 3},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "explicit edges",
|
||||
edges: iterator.NewOrderedWeightedEdges([]graph.WeightedEdge{
|
||||
simple.WeightedEdge{F: simple.Node(-1), T: simple.Node(0), W: 1},
|
||||
simple.WeightedEdge{F: simple.Node(1), T: simple.Node(2), W: 2},
|
||||
simple.WeightedEdge{F: simple.Node(3), T: simple.Node(4), W: 3},
|
||||
}),
|
||||
want: []graph.WeightedEdge{
|
||||
simple.WeightedEdge{F: simple.Node(-1), T: simple.Node(0), W: 1},
|
||||
simple.WeightedEdge{F: simple.Node(1), T: simple.Node(2), W: 2},
|
||||
simple.WeightedEdge{F: simple.Node(3), T: simple.Node(4), W: 3},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
type basicWeightedEdges struct {
|
||||
graph.WeightedEdges
|
||||
}
|
||||
|
||||
func TestWeightedEdgesOf(t *testing.T) {
|
||||
for _, test := range weightedEdgesOfTests {
|
||||
got := graph.WeightedEdgesOf(test.edges)
|
||||
if !reflect.DeepEqual(got, test.want) {
|
||||
t.Errorf("unexpected result for %q: got:%v want:%v", test.name, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var linesOfTests = []struct {
|
||||
name string
|
||||
lines graph.Lines
|
||||
want []graph.Line
|
||||
}{
|
||||
{
|
||||
name: "nil",
|
||||
lines: nil,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "empty",
|
||||
lines: graph.Empty,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no edges",
|
||||
lines: iterator.NewOrderedLines(nil),
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no slice method",
|
||||
lines: basicLines{iterator.NewOrderedLines([]graph.Line{
|
||||
multi.Line{F: multi.Node(-1), T: multi.Node(0), UID: -1},
|
||||
multi.Line{F: multi.Node(1), T: multi.Node(2), UID: 0},
|
||||
multi.Line{F: multi.Node(3), T: multi.Node(4), UID: 1},
|
||||
})},
|
||||
want: []graph.Line{
|
||||
multi.Line{F: multi.Node(-1), T: multi.Node(0), UID: -1},
|
||||
multi.Line{F: multi.Node(1), T: multi.Node(2), UID: 0},
|
||||
multi.Line{F: multi.Node(3), T: multi.Node(4), UID: 1},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "explicit edges",
|
||||
lines: iterator.NewOrderedLines([]graph.Line{
|
||||
multi.Line{F: multi.Node(-1), T: multi.Node(0), UID: -1},
|
||||
multi.Line{F: multi.Node(1), T: multi.Node(2), UID: 0},
|
||||
multi.Line{F: multi.Node(3), T: multi.Node(4), UID: 1},
|
||||
}),
|
||||
want: []graph.Line{
|
||||
multi.Line{F: multi.Node(-1), T: multi.Node(0), UID: -1},
|
||||
multi.Line{F: multi.Node(1), T: multi.Node(2), UID: 0},
|
||||
multi.Line{F: multi.Node(3), T: multi.Node(4), UID: 1},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
type basicLines struct {
|
||||
graph.Lines
|
||||
}
|
||||
|
||||
func TestLinesOf(t *testing.T) {
|
||||
for _, test := range linesOfTests {
|
||||
got := graph.LinesOf(test.lines)
|
||||
if !reflect.DeepEqual(got, test.want) {
|
||||
t.Errorf("unexpected result for %q: got:%v want:%v", test.name, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var weightedLinesOfTests = []struct {
|
||||
name string
|
||||
lines graph.WeightedLines
|
||||
want []graph.WeightedLine
|
||||
}{
|
||||
{
|
||||
name: "nil",
|
||||
lines: nil,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "empty",
|
||||
lines: graph.Empty,
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no edges",
|
||||
lines: iterator.NewOrderedWeightedLines(nil),
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "no slice method",
|
||||
lines: basicWeightedLines{iterator.NewOrderedWeightedLines([]graph.WeightedLine{
|
||||
multi.WeightedLine{F: multi.Node(-1), T: multi.Node(0), W: 1, UID: -1},
|
||||
multi.WeightedLine{F: multi.Node(1), T: multi.Node(2), W: 2, UID: 0},
|
||||
multi.WeightedLine{F: multi.Node(3), T: multi.Node(4), W: 3, UID: 1},
|
||||
})},
|
||||
want: []graph.WeightedLine{
|
||||
multi.WeightedLine{F: multi.Node(-1), T: multi.Node(0), W: 1, UID: -1},
|
||||
multi.WeightedLine{F: multi.Node(1), T: multi.Node(2), W: 2, UID: 0},
|
||||
multi.WeightedLine{F: multi.Node(3), T: multi.Node(4), W: 3, UID: 1},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "explicit edges",
|
||||
lines: iterator.NewOrderedWeightedLines([]graph.WeightedLine{
|
||||
multi.WeightedLine{F: multi.Node(-1), T: multi.Node(0), W: 1, UID: -1},
|
||||
multi.WeightedLine{F: multi.Node(1), T: multi.Node(2), W: 2, UID: 0},
|
||||
multi.WeightedLine{F: multi.Node(3), T: multi.Node(4), W: 3, UID: 1},
|
||||
}),
|
||||
want: []graph.WeightedLine{
|
||||
multi.WeightedLine{F: multi.Node(-1), T: multi.Node(0), W: 1, UID: -1},
|
||||
multi.WeightedLine{F: multi.Node(1), T: multi.Node(2), W: 2, UID: 0},
|
||||
multi.WeightedLine{F: multi.Node(3), T: multi.Node(4), W: 3, UID: 1},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
type basicWeightedLines struct {
|
||||
graph.WeightedLines
|
||||
}
|
||||
|
||||
func TestWeightedLinesOf(t *testing.T) {
|
||||
for _, test := range weightedLinesOfTests {
|
||||
got := graph.WeightedLinesOf(test.lines)
|
||||
if !reflect.DeepEqual(got, test.want) {
|
||||
t.Errorf("unexpected result for %q: got:%v want:%v", test.name, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user