github.phpd.cn/thought-machine/please@v12.2.0+incompatible/src/core/graph_test.go (about) 1 package core 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 func TestAddTarget(t *testing.T) { 10 graph := NewGraph() 11 target := makeTarget("//src/core:target1") 12 graph.AddTarget(target) 13 assert.Equal(t, target, graph.TargetOrDie(target.Label)) 14 } 15 16 func TestAddPackage(t *testing.T) { 17 graph := NewGraph() 18 pkg := NewPackage("src/core") 19 graph.AddPackage(pkg) 20 assert.Equal(t, pkg, graph.PackageOrDie("src/core")) 21 } 22 23 func TestTarget(t *testing.T) { 24 graph := NewGraph() 25 target := graph.Target(ParseBuildLabel("//src/core:target1", "")) 26 assert.Nil(t, target) 27 assert.Equal(t, 0, graph.Len()) 28 } 29 30 func TestRevDeps(t *testing.T) { 31 graph := NewGraph() 32 target1 := makeTarget("//src/core:target1") 33 target2 := makeTarget("//src/core:target2", target1) 34 target3 := makeTarget("//src/core:target3", target2) 35 graph.AddTarget(target1) 36 graph.AddTarget(target2) 37 graph.AddTarget(target3) 38 // No revdeps until we call AddDependency 39 assert.Equal(t, 0, len(graph.ReverseDependencies(target1))) 40 assert.Equal(t, 0, len(graph.ReverseDependencies(target2))) 41 assert.Equal(t, 0, len(graph.ReverseDependencies(target3))) 42 graph.AddDependency(target2.Label, target1.Label) 43 graph.AddDependency(target3.Label, target2.Label) 44 assert.Equal(t, []*BuildTarget{target2}, graph.ReverseDependencies(target1)) 45 assert.Equal(t, []*BuildTarget{target3}, graph.ReverseDependencies(target2)) 46 assert.Equal(t, 0, len(graph.ReverseDependencies(target3))) 47 } 48 49 func TestAllDepsBuilt(t *testing.T) { 50 graph := NewGraph() 51 target1 := makeTarget("//src/core:target1") 52 target2 := makeTarget("//src/core:target2", target1) 53 graph.AddTarget(target1) 54 graph.AddTarget(target2) 55 graph.AddDependency(target2.Label, target1.Label) 56 assert.True(t, graph.AllDepsBuilt(target1), "Should be true because it has no dependencies") 57 assert.False(t, graph.AllDepsBuilt(target2), "Should be false because target1 isn't built yet") 58 target1.SyncUpdateState(Inactive, Building) 59 assert.False(t, graph.AllDepsBuilt(target2), "Should be false because target1 is building now") 60 target1.SyncUpdateState(Building, Built) 61 assert.True(t, graph.AllDepsBuilt(target2), "Should be true now target1 is built.") 62 } 63 64 func TestAllDepsResolved(t *testing.T) { 65 graph := NewGraph() 66 target1 := makeTarget("//src/core:target1") 67 target2 := makeTarget("//src/core:target2") 68 target2.AddDependency(target1.Label) 69 graph.AddTarget(target2) 70 assert.False(t, graph.AllDependenciesResolved(target2), "Haven't added a proper dep for target2 yet.") 71 graph.AddTarget(target1) 72 assert.True(t, graph.AllDependenciesResolved(target1), "Has no dependencies so they're all resolved") 73 assert.True(t, graph.AllDependenciesResolved(target1), "Should be resolved now we've added target1.") 74 } 75 76 func TestDependentTargets(t *testing.T) { 77 graph := NewGraph() 78 target1 := makeTarget("//src/core:target1") 79 target2 := makeTarget("//src/core:target2") 80 target3 := makeTarget("//src/core:target3") 81 target2.AddDependency(target1.Label) 82 target1.AddDependency(target3.Label) 83 target1.AddProvide("go", ParseBuildLabel(":target3", "src/core")) 84 target2.Requires = append(target2.Requires, "go") 85 graph.AddTarget(target1) 86 graph.AddTarget(target2) 87 graph.AddTarget(target3) 88 assert.Equal(t, []BuildLabel{target3.Label}, graph.DependentTargets(target2.Label, target1.Label)) 89 } 90 91 func TestSubrepo(t *testing.T) { 92 graph := NewGraph() 93 graph.AddSubrepo(&Subrepo{Name: "test", Root: "plz-out/gen/test"}) 94 subrepo := graph.Subrepo("test") 95 assert.NotNil(t, subrepo) 96 assert.Equal(t, "plz-out/gen/test", subrepo.Root) 97 subrepo = graph.SubrepoFor("test/some/package") 98 assert.NotNil(t, subrepo) 99 assert.Equal(t, "plz-out/gen/test", subrepo.Root) 100 subrepo = graph.SubrepoFor("test") 101 assert.NotNil(t, subrepo) 102 assert.Equal(t, "plz-out/gen/test", subrepo.Root) 103 } 104 105 // makeTarget creates a new build target for us. 106 func makeTarget(label string, deps ...*BuildTarget) *BuildTarget { 107 target := NewBuildTarget(ParseBuildLabel(label, "")) 108 for _, dep := range deps { 109 target.AddDependency(dep.Label) 110 } 111 return target 112 }