Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/flow/internal/dag/tarjan_test.go
4096 views
1
package dag
2
3
import (
4
"reflect"
5
"sort"
6
"testing"
7
)
8
9
func TestGraphStronglyConnected(t *testing.T) {
10
var g Graph
11
var (
12
nodeA = stringNode("a")
13
nodeB = stringNode("b")
14
)
15
g.Add(nodeA)
16
g.Add(nodeB)
17
g.AddEdge(Edge{nodeA, nodeB})
18
g.AddEdge(Edge{nodeB, nodeA})
19
20
actual := sortSlice(StronglyConnectedComponents(&g))
21
expected := [][]Node{{nodeA, nodeB}}
22
if !reflect.DeepEqual(actual, expected) {
23
t.Fatalf("error calculating strongly connected components: expected %s, got %s", expected, actual)
24
}
25
}
26
27
func TestGraphNotStronglyConnected(t *testing.T) {
28
var g Graph
29
var (
30
nodeA = stringNode("a")
31
nodeB = stringNode("b")
32
)
33
g.Add(nodeA)
34
g.Add(nodeB)
35
g.AddEdge(Edge{nodeA, nodeB})
36
37
actual := sortSlice(StronglyConnectedComponents(&g))
38
expected := [][]Node{{nodeA}, {nodeB}}
39
if !reflect.DeepEqual(actual, expected) {
40
t.Fatalf("error calculating strongly connected components: expected %s, got %s", expected, actual)
41
}
42
}
43
44
func TestGraphStronglyConnectedMulti(t *testing.T) {
45
var g Graph
46
var (
47
nodeA = stringNode("a")
48
nodeB = stringNode("b")
49
nodeC = stringNode("c")
50
nodeD = stringNode("d")
51
nodeE = stringNode("e")
52
)
53
g.Add(nodeA)
54
g.Add(nodeB)
55
g.AddEdge(Edge{nodeA, nodeB})
56
g.AddEdge(Edge{nodeB, nodeA})
57
g.Add(nodeC)
58
g.Add(nodeD)
59
g.Add(nodeE)
60
g.AddEdge(Edge{nodeC, nodeD})
61
g.AddEdge(Edge{nodeD, nodeE})
62
g.AddEdge(Edge{nodeE, nodeC})
63
64
actual := sortSlice(StronglyConnectedComponents(&g))
65
expected := [][]Node{{nodeA, nodeB}, {nodeC, nodeD, nodeE}}
66
if !reflect.DeepEqual(actual, expected) {
67
t.Fatalf("error calculating strongly connected components: expected %s, got %s", expected, actual)
68
}
69
}
70
71
func sortSlice(nodeSets [][]Node) [][]Node {
72
var sorted [][]Node
73
74
// Sort nodes of the detected cycle by id
75
for _, ns := range nodeSets {
76
sort.Slice(ns, func(i, j int) bool {
77
return ns[i].NodeID() < ns[j].NodeID()
78
})
79
sorted = append(sorted, ns)
80
}
81
// Sort the final slice by the first element of the cycle
82
sort.Slice(sorted, func(i, j int) bool {
83
return sorted[i][0].NodeID() < sorted[j][0].NodeID()
84
})
85
return sorted
86
}
87
88
type stringNode string
89
90
func (s stringNode) NodeID() string { return string(s) }
91
92