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  }