github.com/gsquire/gb@v0.4.4-0.20161112235727-3982dc872064/action_test.go (about)

     1  package gb
     2  
     3  import (
     4  	"reflect"
     5  	"sort"
     6  	"testing"
     7  )
     8  
     9  func TestBuildAction(t *testing.T) {
    10  	var tests = []struct {
    11  		pkg    string
    12  		action *Action
    13  		err    error
    14  	}{{
    15  		pkg: "a",
    16  		action: &Action{
    17  			Name: "build: a",
    18  			Deps: []*Action{&Action{Name: "compile: a"}},
    19  		},
    20  	}, {
    21  		pkg: "b",
    22  		action: &Action{
    23  			Name: "build: b",
    24  			Deps: []*Action{
    25  				&Action{
    26  					Name: "link: b",
    27  					Deps: []*Action{
    28  						&Action{
    29  							Name: "compile: b",
    30  							Deps: []*Action{
    31  								&Action{
    32  									Name: "compile: a",
    33  								}},
    34  						},
    35  					}},
    36  			},
    37  		},
    38  	}, {
    39  		pkg: "c",
    40  		action: &Action{
    41  			Name: "build: c",
    42  			Deps: []*Action{
    43  				&Action{
    44  					Name: "compile: c",
    45  					Deps: []*Action{
    46  						&Action{
    47  							Name: "compile: a",
    48  						}, &Action{
    49  							Name: "compile: d.v1",
    50  						}},
    51  				}},
    52  		},
    53  	}}
    54  	for _, tt := range tests {
    55  		ctx := testContext(t)
    56  		defer ctx.Destroy()
    57  		pkg, err := ctx.ResolvePackage(tt.pkg)
    58  		if !reflect.DeepEqual(err, tt.err) {
    59  			t.Errorf("ctx.ResolvePackage(%v): want %v, got %v", tt.pkg, tt.err, err)
    60  			continue
    61  		}
    62  		if err != nil {
    63  			continue
    64  		}
    65  		got, err := BuildPackages(pkg)
    66  		if !reflect.DeepEqual(err, tt.err) {
    67  			t.Errorf("BuildAction(%v): want %v, got %v", tt.pkg, tt.err, err)
    68  			continue
    69  		}
    70  		deleteTasks(got)
    71  
    72  		if !reflect.DeepEqual(tt.action, got) {
    73  			t.Errorf("BuildAction(%v): want %#+v, got %#+v", tt.pkg, tt.action, got)
    74  		}
    75  
    76  		// double underpants
    77  		sameAction(t, got, tt.action)
    78  	}
    79  }
    80  
    81  func sameAction(t *testing.T, want, got *Action) {
    82  	if want.Name != got.Name {
    83  		t.Errorf("sameAction: names do not match, want: %v, got %v", want.Name, got.Name)
    84  		return
    85  	}
    86  	if len(want.Deps) != len(got.Deps) {
    87  		t.Errorf("sameAction(%v, %v): deps: len(want): %v, len(got): %v", want.Name, got.Name, len(want.Deps), len(got.Deps))
    88  		return
    89  	}
    90  	w, g := make(map[string]*Action), make(map[string]*Action)
    91  	for _, a := range want.Deps {
    92  		w[a.Name] = a
    93  	}
    94  	for _, a := range got.Deps {
    95  		g[a.Name] = a
    96  	}
    97  	var wk []string
    98  	for k := range w {
    99  		wk = append(wk, k)
   100  	}
   101  	sort.Strings(wk)
   102  	for _, a := range wk {
   103  		g, ok := g[a]
   104  		if !ok {
   105  			t.Errorf("sameAction(%v, %v): deps: want %v, got nil", want.Name, got.Name, a)
   106  			continue
   107  		}
   108  		sameAction(t, w[a], g)
   109  	}
   110  }
   111  
   112  func deleteTasks(a *Action) {
   113  	for _, d := range a.Deps {
   114  		deleteTasks(d)
   115  	}
   116  	a.Run = nil
   117  }