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  }