github.com/hashicorp/packer@v1.14.3/internal/dag/tarjan_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package dag 5 6 import ( 7 "sort" 8 "strings" 9 "testing" 10 ) 11 12 func TestGraphStronglyConnected(t *testing.T) { 13 var g Graph 14 g.Add(1) 15 g.Add(2) 16 g.Connect(BasicEdge(1, 2)) 17 g.Connect(BasicEdge(2, 1)) 18 19 actual := strings.TrimSpace(testSCCStr(StronglyConnected(&g))) 20 expected := strings.TrimSpace(testGraphStronglyConnectedStr) 21 if actual != expected { 22 t.Fatalf("bad: %s", actual) 23 } 24 } 25 26 func TestGraphStronglyConnected_two(t *testing.T) { 27 var g Graph 28 g.Add(1) 29 g.Add(2) 30 g.Connect(BasicEdge(1, 2)) 31 g.Connect(BasicEdge(2, 1)) 32 g.Add(3) 33 34 actual := strings.TrimSpace(testSCCStr(StronglyConnected(&g))) 35 expected := strings.TrimSpace(testGraphStronglyConnectedTwoStr) 36 if actual != expected { 37 t.Fatalf("bad: %s", actual) 38 } 39 } 40 41 func TestGraphStronglyConnected_three(t *testing.T) { 42 var g Graph 43 g.Add(1) 44 g.Add(2) 45 g.Connect(BasicEdge(1, 2)) 46 g.Connect(BasicEdge(2, 1)) 47 g.Add(3) 48 g.Add(4) 49 g.Add(5) 50 g.Add(6) 51 g.Connect(BasicEdge(4, 5)) 52 g.Connect(BasicEdge(5, 6)) 53 g.Connect(BasicEdge(6, 4)) 54 55 actual := strings.TrimSpace(testSCCStr(StronglyConnected(&g))) 56 expected := strings.TrimSpace(testGraphStronglyConnectedThreeStr) 57 if actual != expected { 58 t.Fatalf("bad: %s", actual) 59 } 60 } 61 62 func testSCCStr(list [][]Vertex) string { 63 var lines []string 64 for _, vs := range list { 65 result := make([]string, len(vs)) 66 for i, v := range vs { 67 result[i] = VertexName(v) 68 } 69 70 sort.Strings(result) 71 lines = append(lines, strings.Join(result, ",")) 72 } 73 74 sort.Strings(lines) 75 return strings.Join(lines, "\n") 76 } 77 78 const testGraphStronglyConnectedStr = `1,2` 79 80 const testGraphStronglyConnectedTwoStr = ` 81 1,2 82 3 83 ` 84 85 const testGraphStronglyConnectedThreeStr = ` 86 1,2 87 3 88 4,5,6 89 `