Skip to content
Snippets Groups Projects
dijkstra_test.go 4.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • package dijkstra
    
    import (
    	"testing"
    
    	"github.com/stretchr/testify/assert"
    )
    
    func TestSPT(t *testing.T) {
    	tests := []struct {
    		name     string
    		nodes    []Node
    		edges    []Edge
    		expected SPT
    	}{
    		{
    			name: "Test #1",
    			nodes: []Node{
    				{
    					Name: "A",
    				},
    				{
    					Name: "B",
    				},
    				{
    					Name: "C",
    				},
    				{
    					Name: "D",
    				},
    			},
    			edges: []Edge{
    				{
    					NodeA:    Node{Name: "A"},
    					NodeB:    Node{Name: "B"},
    					Distance: 1,
    				},
    				{
    					NodeA:    Node{Name: "B"},
    					NodeB:    Node{Name: "A"},
    					Distance: 1,
    				},
    				{
    					NodeA:    Node{Name: "B"},
    					NodeB:    Node{Name: "C"},
    					Distance: 5,
    				},
    				{
    					NodeA:    Node{Name: "C"},
    					NodeB:    Node{Name: "B"},
    					Distance: 5,
    				},
    				{
    					NodeA:    Node{Name: "B"},
    					NodeB:    Node{Name: "D"},
    					Distance: 1,
    				},
    				{
    					NodeA:    Node{Name: "D"},
    					NodeB:    Node{Name: "B"},
    					Distance: 1,
    				},
    				{
    					NodeA:    Node{Name: "A"},
    					NodeB:    Node{Name: "D"},
    					Distance: 5,
    				},
    				{
    					NodeA:    Node{Name: "D"},
    					NodeB:    Node{Name: "A"},
    					Distance: 5,
    				},
    				{
    					NodeA:    Node{Name: "D"},
    					NodeB:    Node{Name: "C"},
    					Distance: 1,
    				},
    				{
    					NodeA:    Node{Name: "C"},
    					NodeB:    Node{Name: "D"},
    					Distance: 1,
    				},
    			},
    			expected: SPT{
    				Node{Name: "A"}: Path{
    					Edges:    []Edge{},
    					Distance: 0,
    				},
    				Node{Name: "B"}: Path{
    					Edges: []Edge{
    						{
    							NodeA:    Node{Name: "A"},
    							NodeB:    Node{Name: "B"},
    							Distance: 1,
    						},
    					},
    					Distance: 1,
    				},
    				Node{Name: "C"}: Path{
    					Edges: []Edge{
    						{
    							NodeA:    Node{Name: "A"},
    							NodeB:    Node{Name: "B"},
    							Distance: 1,
    						},
    						{
    							NodeA:    Node{Name: "B"},
    							NodeB:    Node{Name: "D"},
    							Distance: 1,
    						},
    						{
    							NodeA:    Node{Name: "D"},
    							NodeB:    Node{Name: "C"},
    							Distance: 1,
    						},
    					},
    					Distance: 3,
    				},
    				Node{Name: "D"}: Path{
    					Edges: []Edge{
    						{
    							NodeA:    Node{Name: "A"},
    							NodeB:    Node{Name: "B"},
    							Distance: 1,
    						},
    						{
    							NodeA:    Node{Name: "B"},
    							NodeB:    Node{Name: "D"},
    							Distance: 1,
    						},
    					},
    					Distance: 2,
    				},
    			},
    		},
    		{
    			name: "Test #2",
    			nodes: []Node{
    				{
    					Name: "A",
    				},
    				{
    					Name: "B",
    				},
    				{
    					Name: "C",
    				},
    				{
    					Name: "D",
    				},
    				{
    					Name: "E",
    				},
    			},
    			edges: []Edge{
    				{
    					NodeA:    Node{Name: "A"},
    					NodeB:    Node{Name: "B"},
    					Distance: 1,
    				},
    				{
    					NodeA:    Node{Name: "A"},
    					NodeB:    Node{Name: "D"},
    					Distance: 2,
    				},
    				{
    					NodeA:    Node{Name: "A"},
    					NodeB:    Node{Name: "E"},
    					Distance: 3,
    				},
    				{
    					NodeA:    Node{Name: "B"},
    					NodeB:    Node{Name: "C"},
    					Distance: 10,
    				},
    				{
    					NodeA:    Node{Name: "E"},
    					NodeB:    Node{Name: "C"},
    					Distance: 5,
    				},
    			},
    			expected: SPT{
    				Node{Name: "A"}: Path{
    					Edges:    []Edge{},
    					Distance: 0,
    				},
    				Node{Name: "B"}: Path{
    					Edges: []Edge{
    						{
    							NodeA:    Node{Name: "A"},
    							NodeB:    Node{Name: "B"},
    							Distance: 1,
    						},
    					},
    					Distance: 1,
    				},
    				Node{Name: "C"}: Path{
    					Edges: []Edge{
    						{
    							NodeA:    Node{Name: "A"},
    							NodeB:    Node{Name: "E"},
    							Distance: 3,
    						},
    						{
    							NodeA:    Node{Name: "E"},
    							NodeB:    Node{Name: "C"},
    							Distance: 5,
    						},
    					},
    					Distance: 8,
    				},
    				Node{Name: "D"}: Path{
    					Edges: []Edge{
    						{
    							NodeA:    Node{Name: "A"},
    							NodeB:    Node{Name: "D"},
    							Distance: 2,
    						},
    					},
    					Distance: 2,
    				},
    				Node{Name: "E"}: Path{
    					Edges: []Edge{
    						{
    							NodeA:    Node{Name: "A"},
    							NodeB:    Node{Name: "E"},
    							Distance: 3,
    						},
    					},
    					Distance: 3,
    				},
    			},
    		},
    	}
    
    	for _, test := range tests {
    		top := NewTopologay(test.nodes, test.edges)
    		spt := top.SPT(Node{Name: "A"})
    
    		assert.Equalf(t, test.expected, spt, "Test %q", test.name)
    	}
    }