feat(depmap): Arch→Zeta dependency name mapping + base-system drop list
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
package depmap
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMapDep(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
spec string
|
||||
want string
|
||||
wantOK bool
|
||||
warns int
|
||||
warnMsg string // exact expected warn message ("" = only check count)
|
||||
}{
|
||||
{
|
||||
name: "zlib renames to libz",
|
||||
spec: "zlib",
|
||||
want: "libz",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "glibc dropped as base system",
|
||||
spec: "glibc",
|
||||
want: "",
|
||||
wantOK: false,
|
||||
warns: 1,
|
||||
warnMsg: `dropping base-system dependency "glibc"`,
|
||||
},
|
||||
{
|
||||
name: "verbatim index name keeps constraint",
|
||||
spec: "pcre2>=10.42",
|
||||
want: "pcre2>=10.42",
|
||||
wantOK: true,
|
||||
warns: 0,
|
||||
},
|
||||
{
|
||||
name: "optdepend description stripped",
|
||||
spec: "python: for scripting",
|
||||
want: "python",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "unknown dep passes through with warn",
|
||||
spec: "someunknownpkg123",
|
||||
want: "someunknownpkg123",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
warnMsg: `unmapped dependency "someunknownpkg123" (passed through)`,
|
||||
},
|
||||
{
|
||||
name: "rename preserves constraint",
|
||||
spec: "zlib>=1.3.1",
|
||||
want: "libz>=1.3.1",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "x11 case fix libx11",
|
||||
spec: "libx11",
|
||||
want: "libX11",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "xz renames to xz-utils",
|
||||
spec: "xz",
|
||||
want: "xz-utils",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "x11 case fix libice",
|
||||
spec: "libice",
|
||||
want: "libICE",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "freetype2 renames to freetype",
|
||||
spec: "freetype2",
|
||||
want: "freetype",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "libxkbcommon renames to xkbcommon",
|
||||
spec: "libxkbcommon",
|
||||
want: "xkbcommon",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "libxcb already correct not renamed",
|
||||
spec: "libxcb",
|
||||
want: "libxcb",
|
||||
wantOK: true,
|
||||
warns: 0,
|
||||
},
|
||||
{
|
||||
name: "zeta casing input passes through verbatim",
|
||||
spec: "libX11",
|
||||
want: "libX11",
|
||||
wantOK: true,
|
||||
warns: 0,
|
||||
},
|
||||
{
|
||||
name: "bare = normalized to ==",
|
||||
spec: "foo=1.0",
|
||||
want: "foo==1.0",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "description plus constraint plus rename",
|
||||
spec: "zlib>=1.2: for compression",
|
||||
want: "libz>=1.2",
|
||||
wantOK: true,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "drop applies regardless of constraint",
|
||||
spec: "glibc>=2.38",
|
||||
want: "",
|
||||
wantOK: false,
|
||||
warns: 1,
|
||||
},
|
||||
{
|
||||
name: "gcc-libs dropped",
|
||||
spec: "gcc-libs",
|
||||
want: "",
|
||||
wantOK: false,
|
||||
warns: 1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
var warns []string
|
||||
got, ok := MapDep(tt.spec, func(msg string) {
|
||||
warns = append(warns, msg)
|
||||
})
|
||||
|
||||
if got != tt.want {
|
||||
t.Errorf("MapDep(%q) = %q, want %q", tt.spec, got, tt.want)
|
||||
}
|
||||
if ok != tt.wantOK {
|
||||
t.Errorf("MapDep(%q) ok = %v, want %v", tt.spec, ok, tt.wantOK)
|
||||
}
|
||||
if len(warns) != tt.warns {
|
||||
t.Errorf("MapDep(%q) fired %d warns (%v), want %d",
|
||||
tt.spec, len(warns), warns, tt.warns)
|
||||
}
|
||||
if tt.warnMsg != "" && len(warns) == 1 && warns[0] != tt.warnMsg {
|
||||
t.Errorf("MapDep(%q) warn = %q, want %q", tt.spec, warns[0], tt.warnMsg)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestMapDepNilWarn ensures MapDep tolerates a nil warn callback.
|
||||
func TestMapDepNilWarn(t *testing.T) {
|
||||
got, ok := MapDep("zlib", nil)
|
||||
if got != "libz" || !ok {
|
||||
t.Fatalf("MapDep(zlib, nil) = %q, %v; want %q, true", got, ok, "libz")
|
||||
}
|
||||
}
|
||||
|
||||
// TestRenameTargetsExistInIndex guards the checked-in tables against typos:
|
||||
// every rename target must be a real Zeta package, and every dropped name must
|
||||
// NOT be one.
|
||||
func TestRenameTargetsExistInIndex(t *testing.T) {
|
||||
for from, to := range renames {
|
||||
if _, ok := zetapkgs[to]; !ok {
|
||||
t.Errorf("rename %q -> %q: target not in zetapkgs index", from, to)
|
||||
}
|
||||
if _, ok := zetapkgs[from]; ok {
|
||||
t.Errorf("rename %q -> %q: source already in zetapkgs (rename is dead code)", from, to)
|
||||
}
|
||||
if _, ok := dropped[to]; ok {
|
||||
t.Errorf("rename %q -> %q: target also in drop list", from, to)
|
||||
}
|
||||
}
|
||||
for name := range dropped {
|
||||
if _, ok := zetapkgs[name]; ok {
|
||||
t.Errorf("drop %q: present in zetapkgs index (drop is wrong)", name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestRenamesSortedLint is a cheap self-check that rename sources are
|
||||
// lowercase (Arch convention) so case fixes are keyed from the Arch spelling.
|
||||
func TestRenamesLowercaseKeys(t *testing.T) {
|
||||
for from := range renames {
|
||||
if strings.ToLower(from) != from {
|
||||
t.Errorf("rename key %q is not lowercase", from)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user