Files
yay/pkg/dep/topo/dep_test.go
Jo d52526284e dep/topo: clarify graph API, rename methods, add tests (#2744)
* ci(yay): update packages on builder before building release

* update go-aur

* dep/topo: clarify graph API, rename methods, add tests

- Rename topo methods for clarity (TopoSortedLayers, AddProvides, HasProvides, GetProviderInfo)
- Add GoDoc describing edge direction and semantics
- Make ForEach safe when node info is missing
- Add unit tests for Dependencies/Dependents behavior
- Update call sites

* Revert "ci(yay): update packages on builder before building release"

This reverts commit bb64208c64.
2025-12-21 14:27:55 +01:00

80 lines
2.3 KiB
Go

package topo
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestGraph_DependenciesAndDependents_Direct(t *testing.T) {
g := New[string, struct{}]()
// yay depends on go
require.NoError(t, g.DependOn("yay", "go"))
// Dependencies("yay") => {"go"}
depsYay := g.Dependencies("yay")
require.NotNil(t, depsYay)
require.Len(t, depsYay, 1)
require.True(t, depsYay["go"])
// Dependencies("go") => {} (empty set, because "go" is in the graph but has no deps)
depsGo := g.Dependencies("go")
require.NotNil(t, depsGo)
require.Len(t, depsGo, 0)
// Dependents("go") => {"yay"}
dependentsGo := g.Dependents("go")
require.NotNil(t, dependentsGo)
require.Len(t, dependentsGo, 1)
require.True(t, dependentsGo["yay"])
// Dependents("yay") => {} (empty set, because nothing depends on yay)
dependentsYay := g.Dependents("yay")
require.NotNil(t, dependentsYay)
require.Len(t, dependentsYay, 0)
}
func TestGraph_DependenciesAndDependents_Transitive(t *testing.T) {
g := New[string, struct{}]()
// yay depends on go; foo depends on yay
require.NoError(t, g.DependOn("yay", "go"))
require.NoError(t, g.DependOn("foo", "yay"))
// Dependencies("foo") => {"yay", "go"}
depsFoo := g.Dependencies("foo")
require.NotNil(t, depsFoo)
require.Len(t, depsFoo, 2)
require.True(t, depsFoo["yay"])
require.True(t, depsFoo["go"])
// Dependents("go") => {"yay", "foo"} (transitive)
dependentsGo := g.Dependents("go")
require.NotNil(t, dependentsGo)
require.Len(t, dependentsGo, 2)
require.True(t, dependentsGo["yay"])
require.True(t, dependentsGo["foo"])
// Dependents("yay") => {"foo"}
dependentsYay := g.Dependents("yay")
require.NotNil(t, dependentsYay)
require.Len(t, dependentsYay, 1)
require.True(t, dependentsYay["foo"])
}
func TestGraph_DependenciesAndDependents_MissingNodeReturnsNil(t *testing.T) {
g := New[string, struct{}]()
// For nodes not present in the graph, transitive queries return nil.
require.Nil(t, g.Dependencies("missing"))
require.Nil(t, g.Dependents("missing"))
// Adding edges adds nodes; existing nodes with no deps/dependents return an empty set (non-nil).
require.NoError(t, g.DependOn("yay", "go"))
require.NotNil(t, g.Dependencies("go"))
require.Len(t, g.Dependencies("go"), 0)
require.NotNil(t, g.Dependents("yay"))
require.Len(t, g.Dependents("yay"), 0)
}