// Short cut!  Have you already done the matrix exercise?
// If it seems helpful, copy your code from the matrix exercise
// to this directory so you have access to it.  You can leave it as matrix.go
// and start a new file saddle_points.go with additional code that completes
// this exercise.  Submit only saddle_points.go for this exercise.

package matrix

import "testing"

var tests = []struct {
	m  string
	sp []Pair
}{
	{"2 1\n1 2", nil},
	{"1 2\n3 4", []Pair{{0, 1}}},
	{"18 3 39 19 91\n38 10 8 77 320\n3 4 8 6 7", []Pair{{2, 2}}},
	{"4 5 4\n3 5 5\n1 5 4", []Pair{{0, 1}, {1, 1}, {2, 1}}},
}

func TestSaddle(t *testing.T) {
	for _, test := range tests {
		m, err := New(test.m)
		if err != nil {
			t.Fatalf("TestSaddle needs working New.  "+
				"New(%s) returned %s.  Error not expected.",
				test.m, err)
		}
		if sp := m.Saddle(); !eq(sp, test.sp) {
			t.Fatalf("%v.Saddle() = %v, want %v", m, sp, test.sp)
		}
	}
}

func eq(got, exp []Pair) bool {
	if len(got) != len(exp) {
		return false
	}
exp:
	for _, e := range exp {
		for _, g := range got {
			if g == e {
				continue exp
			}
		}
		return false
	}
	return true
}

func BenchmarkSaddle(b *testing.B) {
	ms := make([]*Matrix, len(tests))
	var err error
	for i, test := range tests {
		if ms[i], err = New(test.m); err != nil {
			b.Fatalf("BenchmarkSaddle needs working New.  "+
				"New(%s) returned %s.  Error not expected.",
				test.m, err)
		}
	}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		for _, m := range ms {
			m.Saddle()
		}
	}
}
