github.com/tiagovtristao/plz@v13.4.0+incompatible/src/core/state_test.go (about)

     1  package core
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestExpandOriginalTargets(t *testing.T) {
    11  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    12  	state.OriginalTargets = []BuildLabel{{PackageName: "src/core", Name: "all"}, {PackageName: "src/parse", Name: "parse"}}
    13  	state.Include = []string{"go"}
    14  	state.Exclude = []string{"py"}
    15  
    16  	addTarget(state, "//src/core:target1", "go")
    17  	addTarget(state, "//src/core:target2", "py")
    18  	addTarget(state, "//src/core:target3", "go", "py")
    19  	addTarget(state, "//src/core:target4")
    20  	addTarget(state, "//src/core:target5", "go", "manual")
    21  	addTarget(state, "//src/parse:parse")
    22  	addTarget(state, "//src/parse:parse2", "go")
    23  
    24  	// Only two targets come out here; target2 has 'py' so is excluded, target3 has
    25  	// both 'py' and 'go' but excludes take priority, target4 doesn't have 'go',
    26  	// and target5 has 'go' but 'manual' should also take priority.
    27  	// //src/parse:parse doesn't have 'go' but was explicitly requested so will be
    28  	// added anyway.
    29  	assert.Equal(t, state.ExpandOriginalTargets(), BuildLabels{
    30  		{PackageName: "src/core", Name: "target1"},
    31  		{PackageName: "src/parse", Name: "parse"},
    32  	})
    33  }
    34  
    35  func TestExpandOriginalTestTargets(t *testing.T) {
    36  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    37  	state.OriginalTargets = []BuildLabel{{PackageName: "src/core", Name: "all"}}
    38  	state.NeedTests = true
    39  	state.Include = []string{"go"}
    40  	state.Exclude = []string{"py"}
    41  	addTarget(state, "//src/core:target1", "go")
    42  	addTarget(state, "//src/core:target2", "py")
    43  	addTarget(state, "//src/core:target1_test", "go")
    44  	addTarget(state, "//src/core:target2_test", "py")
    45  	addTarget(state, "//src/core:target3_test")
    46  	addTarget(state, "//src/core:target4_test", "go", "manual")
    47  	// Only the one target comes out here; it must be a test and otherwise follows
    48  	// the same include / exclude logic as the previous test.
    49  	assert.Equal(t, state.ExpandOriginalTargets(), BuildLabels{{PackageName: "src/core", Name: "target1_test"}})
    50  }
    51  
    52  func TestExpandVisibleOriginalTargets(t *testing.T) {
    53  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    54  	state.OriginalTargets = []BuildLabel{{PackageName: "src/core", Name: "all"}}
    55  
    56  	addTarget(state, "//src/core:target1", "py")
    57  	addTarget(state, "//src/core:_target1#zip", "py")
    58  	assert.Equal(t, state.ExpandVisibleOriginalTargets(), BuildLabels{{PackageName: "src/core", Name: "target1"}})
    59  }
    60  
    61  func TestExpandOriginalSubTargets(t *testing.T) {
    62  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    63  	state.OriginalTargets = []BuildLabel{{PackageName: "src/core", Name: "..."}}
    64  	state.Include = []string{"go"}
    65  	state.Exclude = []string{"py"}
    66  	addTarget(state, "//src/core:target1", "go")
    67  	addTarget(state, "//src/core:target2", "py")
    68  	addTarget(state, "//src/core/tests:target3", "go")
    69  	// Only the one target comes out here; it must be a test and otherwise follows
    70  	// the same include / exclude logic as the previous test.
    71  	assert.Equal(t, state.ExpandOriginalTargets(), BuildLabels{
    72  		{PackageName: "src/core", Name: "target1"},
    73  		{PackageName: "src/core/tests", Name: "target3"},
    74  	})
    75  }
    76  
    77  func TestExpandOriginalTargetsOrdering(t *testing.T) {
    78  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    79  	state.OriginalTargets = []BuildLabel{
    80  		{PackageName: "src/parse", Name: "parse"},
    81  		{PackageName: "src/core", Name: "..."},
    82  		{PackageName: "src/build", Name: "build"},
    83  	}
    84  	addTarget(state, "//src/core:target1", "go")
    85  	addTarget(state, "//src/core:target2", "py")
    86  	addTarget(state, "//src/core/tests:target3", "go")
    87  	expected := BuildLabels{
    88  		{PackageName: "src/parse", Name: "parse"},
    89  		{PackageName: "src/core", Name: "target1"},
    90  		{PackageName: "src/core", Name: "target2"},
    91  		{PackageName: "src/core/tests", Name: "target3"},
    92  		{PackageName: "src/build", Name: "build"},
    93  	}
    94  	assert.Equal(t, expected, state.ExpandOriginalTargets())
    95  }
    96  
    97  func TestComparePendingTasks(t *testing.T) {
    98  	p := func(taskType TaskType) pendingTask { return pendingTask{Type: taskType} }
    99  	// NB. "Higher priority" means the task comes first, does not refer to numeric values.
   100  	assertHigherPriority := func(a, b TaskType) {
   101  		// relationship should be commutative
   102  		assert.True(t, p(a).Compare(p(b)) < 0)
   103  		assert.True(t, p(b).Compare(p(a)) > 0)
   104  	}
   105  	assertEqualPriority := func(a, b TaskType) {
   106  		assert.True(t, p(a).Compare(p(b)) == 0)
   107  		assert.True(t, p(b).Compare(p(a)) == 0)
   108  	}
   109  
   110  	assertHigherPriority(SubincludeBuild, SubincludeParse)
   111  	assertHigherPriority(SubincludeParse, Build)
   112  	assertHigherPriority(SubincludeBuild, Build)
   113  	assertEqualPriority(Build, Parse)
   114  	assertEqualPriority(Build, Test)
   115  	assertEqualPriority(Parse, Test)
   116  	assertHigherPriority(Build, Stop)
   117  	assertHigherPriority(Test, Stop)
   118  	assertHigherPriority(Parse, Stop)
   119  
   120  	// sanity check
   121  	assertEqualPriority(SubincludeBuild, SubincludeBuild)
   122  	assertEqualPriority(SubincludeParse, SubincludeParse)
   123  	assertEqualPriority(Build, Build)
   124  	assertEqualPriority(Parse, Parse)
   125  	assertEqualPriority(Test, Test)
   126  	assertEqualPriority(Stop, Stop)
   127  }
   128  
   129  func addTarget(state *BuildState, name string, labels ...string) {
   130  	target := NewBuildTarget(ParseBuildLabel(name, ""))
   131  	target.Labels = labels
   132  	target.IsTest = strings.HasSuffix(name, "_test")
   133  	pkg := state.Graph.PackageByLabel(target.Label)
   134  	if pkg == nil {
   135  		pkg = NewPackage(target.Label.PackageName)
   136  		state.Graph.AddPackage(pkg)
   137  	}
   138  	pkg.AddTarget(target)
   139  	state.Graph.AddTarget(target)
   140  }