github.phpd.cn/thought-machine/please@v12.2.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{{"src/core", "all"}, {"src/parse", "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  		{"src/core", "target1"},
    31  		{"src/parse", "parse"},
    32  	})
    33  }
    34  
    35  func TestExpandOriginalTestTargets(t *testing.T) {
    36  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    37  	state.OriginalTargets = []BuildLabel{{"src/core", "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{{"src/core", "target1_test"}})
    50  }
    51  
    52  func TestExpandVisibleOriginalTargets(t *testing.T) {
    53  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    54  	state.OriginalTargets = []BuildLabel{{"src/core", "all"}}
    55  
    56  	addTarget(state, "//src/core:target1", "py")
    57  	addTarget(state, "//src/core:_target1#zip", "py")
    58  	assert.Equal(t, state.ExpandVisibleOriginalTargets(), BuildLabels{{"src/core", "target1"}})
    59  }
    60  
    61  func TestExpandOriginalSubTargets(t *testing.T) {
    62  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    63  	state.OriginalTargets = []BuildLabel{{"src/core", "..."}}
    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{{"src/core", "target1"}, {"src/core/tests", "target3"}})
    72  }
    73  
    74  func TestExpandOriginalTargetsOrdering(t *testing.T) {
    75  	state := NewBuildState(1, nil, 4, DefaultConfiguration())
    76  	state.OriginalTargets = []BuildLabel{{"src/parse", "parse"}, {"src/core", "..."}, {"src/build", "build"}}
    77  	addTarget(state, "//src/core:target1", "go")
    78  	addTarget(state, "//src/core:target2", "py")
    79  	addTarget(state, "//src/core/tests:target3", "go")
    80  	expected := BuildLabels{
    81  		{"src/parse", "parse"},
    82  		{"src/core", "target1"},
    83  		{"src/core", "target2"},
    84  		{"src/core/tests", "target3"},
    85  		{"src/build", "build"},
    86  	}
    87  	assert.Equal(t, expected, state.ExpandOriginalTargets())
    88  }
    89  
    90  func TestComparePendingTasks(t *testing.T) {
    91  	p := func(taskType TaskType) pendingTask { return pendingTask{Type: taskType} }
    92  	// NB. "Higher priority" means the task comes first, does not refer to numeric values.
    93  	assertHigherPriority := func(a, b TaskType) {
    94  		// relationship should be commutative
    95  		assert.True(t, p(a).Compare(p(b)) < 0)
    96  		assert.True(t, p(b).Compare(p(a)) > 0)
    97  	}
    98  	assertEqualPriority := func(a, b TaskType) {
    99  		assert.True(t, p(a).Compare(p(b)) == 0)
   100  		assert.True(t, p(b).Compare(p(a)) == 0)
   101  	}
   102  
   103  	assertHigherPriority(SubincludeBuild, SubincludeParse)
   104  	assertHigherPriority(SubincludeParse, Build)
   105  	assertHigherPriority(SubincludeBuild, Build)
   106  	assertEqualPriority(Build, Parse)
   107  	assertEqualPriority(Build, Test)
   108  	assertEqualPriority(Parse, Test)
   109  	assertHigherPriority(Build, Stop)
   110  	assertHigherPriority(Test, Stop)
   111  	assertHigherPriority(Parse, Stop)
   112  
   113  	// sanity check
   114  	assertEqualPriority(SubincludeBuild, SubincludeBuild)
   115  	assertEqualPriority(SubincludeParse, SubincludeParse)
   116  	assertEqualPriority(Build, Build)
   117  	assertEqualPriority(Parse, Parse)
   118  	assertEqualPriority(Test, Test)
   119  	assertEqualPriority(Stop, Stop)
   120  }
   121  
   122  func addTarget(state *BuildState, name string, labels ...string) {
   123  	target := NewBuildTarget(ParseBuildLabel(name, ""))
   124  	target.Labels = labels
   125  	target.IsTest = strings.HasSuffix(name, "_test")
   126  	pkg := state.Graph.Package(target.Label.PackageName)
   127  	if pkg == nil {
   128  		pkg = NewPackage(target.Label.PackageName)
   129  		state.Graph.AddPackage(pkg)
   130  	}
   131  	pkg.AddTarget(target)
   132  	state.Graph.AddTarget(target)
   133  }