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 }