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  }