tpl/strings: Improve type checking

This commit is contained in:
Joe Mooring 2024-04-04 08:22:33 -07:00 committed by Bjørn Erik Pedersen
parent 2fedca6c8a
commit 7bf1abfc55
2 changed files with 54 additions and 22 deletions

View file

@ -162,24 +162,32 @@ func (ns *Namespace) ContainsAny(s, chars any) (bool, error) {
// ContainsNonSpace reports whether s contains any non-space characters as defined // ContainsNonSpace reports whether s contains any non-space characters as defined
// by Unicode's White Space property, // by Unicode's White Space property,
// <docsmeta>{"newIn": "0.111.0" }</docsmeta> // <docsmeta>{"newIn": "0.111.0" }</docsmeta>
func (ns *Namespace) ContainsNonSpace(s any) bool { func (ns *Namespace) ContainsNonSpace(s any) (bool, error) {
ss := cast.ToString(s) ss, err := cast.ToStringE(s)
if err != nil {
return false, err
}
for _, r := range ss { for _, r := range ss {
if !unicode.IsSpace(r) { if !unicode.IsSpace(r) {
return true return true, nil
} }
} }
return false return false, nil
} }
// Diff returns an anchored diff of the two texts old and new in the “unified // Diff returns an anchored diff of the two texts old and new in the “unified
// diff” format. If old and new are identical, Diff returns an empty string. // diff” format. If old and new are identical, Diff returns an empty string.
func (ns *Namespace) Diff(oldname string, old any, newname string, new any) string { func (ns *Namespace) Diff(oldname string, old any, newname string, new any) (string, error) {
oldb := []byte(cast.ToString(old)) olds, err := cast.ToStringE(old)
newb := []byte(cast.ToString(new)) if err != nil {
return "", err
return string(diff.Diff(oldname, oldb, newname, newb)) }
news, err := cast.ToStringE(new)
if err != nil {
return "", err
}
return string(diff.Diff(oldname, []byte(olds), newname, []byte(news))), nil
} }
// HasPrefix tests whether the input s begins with prefix. // HasPrefix tests whether the input s begins with prefix.

View file

@ -153,17 +153,30 @@ func TestContainsNonSpace(t *testing.T) {
for _, test := range []struct { for _, test := range []struct {
s any s any
expect bool expect bool
isErr bool
}{ }{
{"", false}, {"", false, false},
{" ", false}, {" ", false, false},
{" ", false}, {" ", false, false},
{"\t", false}, {"\t", false, false},
{"\r", false}, {"\r", false, false},
{"a", true}, {"a", true, false},
{" a", true}, {" a", true, false},
{"a\n", true}, {"a\n", true, false},
// error
{tstNoStringer{}, false, true},
} { } {
c.Assert(ns.ContainsNonSpace(test.s), qt.Equals, test.expect)
result, err := ns.ContainsNonSpace(test.s)
if test.isErr {
c.Assert(err, qt.IsNotNil)
continue
}
c.Assert(err, qt.IsNil)
c.Assert(result, qt.Equals, test.expect)
} }
} }
@ -812,21 +825,32 @@ func TestDiff(t *testing.T) {
t.Parallel() t.Parallel()
c := qt.New(t) c := qt.New(t)
for _, tt := range []struct { for _, test := range []struct {
oldname string oldname string
old any old any
newname string newname string
new any new any
expect string expect any
}{ }{
{"old", "foo\n", "new", "bar\n", "diff old new\n--- old\n+++ new\n@@ -1,1 +1,1 @@\n-foo\n+bar\n"}, {"old", "foo\n", "new", "bar\n", "diff old new\n--- old\n+++ new\n@@ -1,1 +1,1 @@\n-foo\n+bar\n"},
{"old", "foo\n", "new", "foo\n", ""}, {"old", "foo\n", "new", "foo\n", ""},
{"old", "foo\n", "new", "", "diff old new\n--- old\n+++ new\n@@ -1,1 +0,0 @@\n-foo\n"}, {"old", "foo\n", "new", "", "diff old new\n--- old\n+++ new\n@@ -1,1 +0,0 @@\n-foo\n"},
{"old", "foo\n", "new", nil, "diff old new\n--- old\n+++ new\n@@ -1,1 +0,0 @@\n-foo\n"}, {"old", "foo\n", "new", nil, "diff old new\n--- old\n+++ new\n@@ -1,1 +0,0 @@\n-foo\n"},
{"old", "", "new", "", ""}, {"old", "", "new", "", ""},
// errors
{"old", tstNoStringer{}, "new", "foo", false},
{"old", "foo", "new", tstNoStringer{}, false},
} { } {
result := ns.Diff(tt.oldname, tt.old, tt.newname, tt.new) result, err := ns.Diff(test.oldname, test.old, test.newname, test.new)
c.Assert(result, qt.Equals, tt.expect)
if b, ok := test.expect.(bool); ok && !b {
c.Assert(err, qt.Not(qt.IsNil))
continue
}
c.Assert(err, qt.IsNil)
c.Assert(result, qt.Equals, test.expect)
} }
} }