github.com/qiniu/go-sdk/v7@v7.27.0/internal/pkg/toposort/toposort_test.go (about) 1 //go:build unit 2 3 package toposort 4 5 import ( 6 "strings" 7 "testing" 8 ) 9 10 func TestToposort(t *testing.T) { 11 sorted, err := Toposort([]Edge{ 12 {"A", "B"}, 13 {"A", "C"}, 14 {"B", "D"}, 15 {"C", "D"}, 16 {"E", nil}, 17 }) 18 if err != nil { 19 t.Fatal(err) 20 } 21 assertBefore(t, sorted, "A", "B") 22 assertBefore(t, sorted, "A", "C") 23 assertBefore(t, sorted, "B", "D") 24 assertBefore(t, sorted, "C", "D") 25 if !contains(sorted, "E") { 26 t.Fatalf("missing unconnected vertex: %v", sorted) 27 } 28 } 29 30 func TestToposortDuplicateEdges(t *testing.T) { 31 sorted, err := Toposort([]Edge{ 32 {"A", "B"}, 33 {"A", "B"}, 34 {"B", "C"}, 35 }) 36 if err != nil { 37 t.Fatal(err) 38 } 39 assertBefore(t, sorted, "A", "B") 40 assertBefore(t, sorted, "B", "C") 41 } 42 43 func TestToposortCycle(t *testing.T) { 44 _, err := Toposort([]Edge{ 45 {"A", "B"}, 46 {"B", "C"}, 47 {"C", "A"}, 48 }) 49 if err == nil || !strings.Contains(err.Error(), "cycle") { 50 t.Fatalf("expected cycle error, got %v", err) 51 } 52 } 53 54 func TestToposortSelfEdge(t *testing.T) { 55 if _, err := Toposort([]Edge{{"A", "A"}}); err == nil { 56 t.Fatal("expected self-edge error") 57 } 58 } 59 60 func TestToposortR(t *testing.T) { 61 sorted, err := ToposortR([]Edge{{"A", "B"}, {"B", "C"}}) 62 if err != nil { 63 t.Fatal(err) 64 } 65 assertBefore(t, sorted, "C", "B") 66 assertBefore(t, sorted, "B", "A") 67 } 68 69 func assertBefore(t *testing.T, sorted []interface{}, first, second string) { 70 t.Helper() 71 firstIndex := indexOf(sorted, first) 72 secondIndex := indexOf(sorted, second) 73 if firstIndex == -1 || secondIndex == -1 || firstIndex >= secondIndex { 74 t.Fatalf("expected %q before %q in %v", first, second, sorted) 75 } 76 } 77 78 func contains(sorted []interface{}, expected string) bool { 79 return indexOf(sorted, expected) != -1 80 } 81 82 func indexOf(sorted []interface{}, expected string) int { 83 for index, vertex := range sorted { 84 if vertex == expected { 85 return index 86 } 87 } 88 return -1 89 }