github.com/rmenn/terraform@v0.3.8-0.20150225065417-fc84b3a78802/dag/dag_test.go (about) 1 package dag 2 3 import ( 4 "fmt" 5 "reflect" 6 "sync" 7 "testing" 8 ) 9 10 func TestAcyclicGraphRoot(t *testing.T) { 11 var g AcyclicGraph 12 g.Add(1) 13 g.Add(2) 14 g.Add(3) 15 g.Connect(BasicEdge(3, 2)) 16 g.Connect(BasicEdge(3, 1)) 17 18 if root, err := g.Root(); err != nil { 19 t.Fatalf("err: %s", err) 20 } else if root != 3 { 21 t.Fatalf("bad: %#v", root) 22 } 23 } 24 25 func TestAcyclicGraphRoot_cycle(t *testing.T) { 26 var g AcyclicGraph 27 g.Add(1) 28 g.Add(2) 29 g.Add(3) 30 g.Connect(BasicEdge(1, 2)) 31 g.Connect(BasicEdge(2, 3)) 32 g.Connect(BasicEdge(3, 1)) 33 34 if _, err := g.Root(); err == nil { 35 t.Fatal("should error") 36 } 37 } 38 39 func TestAcyclicGraphRoot_multiple(t *testing.T) { 40 var g AcyclicGraph 41 g.Add(1) 42 g.Add(2) 43 g.Add(3) 44 g.Connect(BasicEdge(3, 2)) 45 46 if _, err := g.Root(); err == nil { 47 t.Fatal("should error") 48 } 49 } 50 51 func TestAcyclicGraphValidate(t *testing.T) { 52 var g AcyclicGraph 53 g.Add(1) 54 g.Add(2) 55 g.Add(3) 56 g.Connect(BasicEdge(3, 2)) 57 g.Connect(BasicEdge(3, 1)) 58 59 if err := g.Validate(); err != nil { 60 t.Fatalf("err: %s", err) 61 } 62 } 63 64 func TestAcyclicGraphValidate_cycle(t *testing.T) { 65 var g AcyclicGraph 66 g.Add(1) 67 g.Add(2) 68 g.Add(3) 69 g.Connect(BasicEdge(3, 2)) 70 g.Connect(BasicEdge(3, 1)) 71 g.Connect(BasicEdge(1, 2)) 72 g.Connect(BasicEdge(2, 1)) 73 74 if err := g.Validate(); err == nil { 75 t.Fatal("should error") 76 } 77 } 78 79 func TestAcyclicGraphValidate_cycleSelf(t *testing.T) { 80 var g AcyclicGraph 81 g.Add(1) 82 g.Add(2) 83 g.Connect(BasicEdge(1, 1)) 84 85 if err := g.Validate(); err == nil { 86 t.Fatal("should error") 87 } 88 } 89 90 func TestAcyclicGraphWalk(t *testing.T) { 91 var g AcyclicGraph 92 g.Add(1) 93 g.Add(2) 94 g.Add(3) 95 g.Connect(BasicEdge(3, 2)) 96 g.Connect(BasicEdge(3, 1)) 97 98 var visits []Vertex 99 var lock sync.Mutex 100 err := g.Walk(func(v Vertex) error { 101 lock.Lock() 102 defer lock.Unlock() 103 visits = append(visits, v) 104 return nil 105 }) 106 if err != nil { 107 t.Fatalf("err: %s", err) 108 } 109 110 expected := [][]Vertex{ 111 {1, 2, 3}, 112 {2, 1, 3}, 113 } 114 for _, e := range expected { 115 if reflect.DeepEqual(visits, e) { 116 return 117 } 118 } 119 120 t.Fatalf("bad: %#v", visits) 121 } 122 123 func TestAcyclicGraphWalk_error(t *testing.T) { 124 var g AcyclicGraph 125 g.Add(1) 126 g.Add(2) 127 g.Add(3) 128 g.Connect(BasicEdge(3, 2)) 129 g.Connect(BasicEdge(3, 1)) 130 131 var visits []Vertex 132 var lock sync.Mutex 133 err := g.Walk(func(v Vertex) error { 134 lock.Lock() 135 defer lock.Unlock() 136 137 if v == 2 { 138 return fmt.Errorf("error") 139 } 140 141 visits = append(visits, v) 142 return nil 143 }) 144 if err == nil { 145 t.Fatal("should error") 146 } 147 148 expected := [][]Vertex{ 149 {1}, 150 } 151 for _, e := range expected { 152 if reflect.DeepEqual(visits, e) { 153 return 154 } 155 } 156 157 t.Fatalf("bad: %#v", visits) 158 }