| // 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) |
| } |
| } |
| } |