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 }