diff --git a/container/absolute.go b/container/absolute.go index 8f1fa23..637b035 100644 --- a/container/absolute.go +++ b/container/absolute.go @@ -39,6 +39,15 @@ func (a *Absolute) String() string { return a.pathname } +func (a *Absolute) Is(v *Absolute) bool { + if a == nil && v == nil { + return true + } + return a != nil && v != nil && + a.pathname != zeroString && v.pathname != zeroString && + a.pathname == v.pathname +} + // NewAbs checks pathname and returns a new [Absolute] if pathname is absolute. func NewAbs(pathname string) (*Absolute, error) { if !isAbs(pathname) { diff --git a/container/absolute_test.go b/container/absolute_test.go index b368251..e04ad5c 100644 --- a/container/absolute_test.go +++ b/container/absolute_test.go @@ -69,7 +69,7 @@ func TestNewAbs(t *testing.T) { wantPanic := `path "etc" is not absolute` if r := recover(); r != wantPanic { - t.Errorf("MustAbsolute: panic = %v; want %v", r, wantPanic) + t.Errorf("MustAbs: panic = %v; want %v", r, wantPanic) } }() @@ -98,6 +98,29 @@ func TestAbsoluteString(t *testing.T) { }) } +func TestAbsoluteIs(t *testing.T) { + testCases := []struct { + name string + a, v *Absolute + want bool + }{ + {"nil", (*Absolute)(nil), (*Absolute)(nil), true}, + {"nil a", (*Absolute)(nil), MustAbs("/"), false}, + {"nil v", MustAbs("/"), (*Absolute)(nil), false}, + {"zero", new(Absolute), new(Absolute), false}, + {"zero a", new(Absolute), MustAbs("/"), false}, + {"zero v", MustAbs("/"), new(Absolute), false}, + {"equals", MustAbs("/"), MustAbs("/"), true}, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + if got := tc.a.Is(tc.v); got != tc.want { + t.Errorf("Is: %v, want %v", got, tc.want) + } + }) + } +} + type sCheck struct { Pathname *Absolute `json:"val"` Magic int `json:"magic"`