mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 15:16:59 +08:00
317 lines
8.1 KiB
Go
317 lines
8.1 KiB
Go
// 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)
|
|
}
|
|
}
|
|
}
|