package kruskals

import (
"reflect"
"testing"
)

var testcases = []struct {
	graph, mst []WeightedEdge
}{
	{
		[]WeightedEdge{
			SimpleWeightedEdge{0, 3, 3},
			SimpleWeightedEdge{3, 1, 30},
			SimpleWeightedEdge{0, 1, 20},
			SimpleWeightedEdge{0, 4, 10},
			SimpleWeightedEdge{1, 4, 5},
			SimpleWeightedEdge{4, 2, 20},
			SimpleWeightedEdge{1, 2, 50},
			SimpleWeightedEdge{3, 0, 3},
		},
		[]WeightedEdge{
			SimpleWeightedEdge{0, 3, 3},
			SimpleWeightedEdge{1, 4, 5},
			SimpleWeightedEdge{0, 4, 10},
			SimpleWeightedEdge{4, 2, 20},
		},
	},
}

func TestMinimumSpanningTree(t *testing.T) {
	t.Parallel()
	for _, tc := range testcases {
		if result := MinimumSpanningTree(tc.graph); !reflect.DeepEqual(result, tc.mst) {
			t.Errorf("Expected %v, got %v", tc.mst, result)
		}
	}
}

func BenchmarkMinimumSpanningTree(b *testing.B) {
	for i := 0; i < b.N; i++ {
		for _, tc := range testcases {
			MinimumSpanningTree(tc.graph)
		}
	}
}