graph/flow: improve consistency of coverage reports
diff --git a/graph/flow/control_flow_test.go b/graph/flow/control_flow_test.go
index d053ea6..3abd211 100644
--- a/graph/flow/control_flow_test.go
+++ b/graph/flow/control_flow_test.go
@@ -132,53 +132,60 @@
 func (n char) String() string { return string(n) }
 
 func TestDominators(t *testing.T) {
-	for _, test := range dominatorsTests {
-		g := simple.NewDirectedGraph()
-		for _, e := range test.edges {
-			g.SetEdge(e)
-		}
-
-		for _, alg := range []struct {
-			name string
-			fn   func(graph.Node, graph.Directed) DominatorTree
-		}{
-			{"Dominators", Dominators},
-			{"DominatorsSLT", DominatorsSLT},
-		} {
-			got := alg.fn(test.n, g)
-
-			if !reflect.DeepEqual(got.Root(), test.want.root) {
-				t.Errorf("unexpected dominator tree root from %s: got:%v want:%v",
-					alg.name, got.root, test.want.root)
+	// The dominator functions are non-deterministic due
+	// to map iteration ordering, so repeat the tests to
+	// ensure consistent coverage. The value of 100 was
+	// chosen empirically to have no observed reduction
+	// in coverage in several hundred runs of go test -cover.
+	for i := 0; i < 100; i++ {
+		for _, test := range dominatorsTests {
+			g := simple.NewDirectedGraph()
+			for _, e := range test.edges {
+				g.SetEdge(e)
 			}
 
-			if !reflect.DeepEqual(got.dominatorOf, test.want.dominatorOf) {
-				t.Errorf("unexpected dominator tree from %s: got:%v want:%v",
-					alg.name, got.dominatorOf, test.want.dominatorOf)
-			}
+			for _, alg := range []struct {
+				name string
+				fn   func(graph.Node, graph.Directed) DominatorTree
+			}{
+				{"Dominators", Dominators},
+				{"DominatorsSLT", DominatorsSLT},
+			} {
+				got := alg.fn(test.n, g)
 
-			for q, want := range test.want.dominatorOf {
-				node := got.DominatorOf(q)
-				if node != want {
-					t.Errorf("unexpected dominator tree result from %s dominated of %v: got:%v want:%v",
-						alg.name, q, node, want)
+				if !reflect.DeepEqual(got.Root(), test.want.root) {
+					t.Errorf("unexpected dominator tree root from %s: got:%v want:%v",
+						alg.name, got.root, test.want.root)
 				}
-			}
 
-			for _, nodes := range got.dominatedBy {
-				sort.Sort(ordered.ByID(nodes))
-			}
+				if !reflect.DeepEqual(got.dominatorOf, test.want.dominatorOf) {
+					t.Errorf("unexpected dominator tree from %s: got:%v want:%v",
+						alg.name, got.dominatorOf, test.want.dominatorOf)
+				}
 
-			if !reflect.DeepEqual(got.dominatedBy, test.want.dominatedBy) {
-				t.Errorf("unexpected dominator tree from %s: got:%v want:%v",
-					alg.name, got.dominatedBy, test.want.dominatedBy)
-			}
+				for q, want := range test.want.dominatorOf {
+					node := got.DominatorOf(q)
+					if node != want {
+						t.Errorf("unexpected dominator tree result from %s dominated of %v: got:%v want:%v",
+							alg.name, q, node, want)
+					}
+				}
 
-			for q, want := range test.want.dominatedBy {
-				nodes := got.DominatedBy(q)
-				if !reflect.DeepEqual(nodes, want) {
-					t.Errorf("unexpected dominator tree result from %s dominated by %v: got:%v want:%v",
-						alg.name, q, nodes, want)
+				for _, nodes := range got.dominatedBy {
+					sort.Sort(ordered.ByID(nodes))
+				}
+
+				if !reflect.DeepEqual(got.dominatedBy, test.want.dominatedBy) {
+					t.Errorf("unexpected dominator tree from %s: got:%v want:%v",
+						alg.name, got.dominatedBy, test.want.dominatedBy)
+				}
+
+				for q, want := range test.want.dominatedBy {
+					nodes := got.DominatedBy(q)
+					if !reflect.DeepEqual(nodes, want) {
+						t.Errorf("unexpected dominator tree result from %s dominated by %v: got:%v want:%v",
+							alg.name, q, nodes, want)
+					}
 				}
 			}
 		}