mirror of
https://github.com/golang/go.git
synced 2025-10-19 11:03:18 +00:00
strings: add FuzzReplace test
While reviewing CL 657935 I've notied there a couple tricky reslices that depends on multiple things being correct. Might as well fuzz it. Change-Id: Id78921bcb252e73a8a06e6deb4c920445a87d525 Reviewed-on: https://go-review.googlesource.com/c/go/+/658075 Reviewed-by: David Chase <drchase@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
e0edd3e155
commit
e6ffe764cf
1 changed files with 46 additions and 0 deletions
|
@ -1485,6 +1485,52 @@ func TestReplace(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func FuzzReplace(f *testing.F) {
|
||||
for _, tt := range ReplaceTests {
|
||||
f.Add(tt.in, tt.old, tt.new, tt.n)
|
||||
}
|
||||
f.Fuzz(func(t *testing.T, in, old, new string, n int) {
|
||||
differentImpl := func(in, old, new string, n int) string {
|
||||
var out Builder
|
||||
if n < 0 {
|
||||
n = math.MaxInt
|
||||
}
|
||||
for i := 0; i < len(in); {
|
||||
if n == 0 {
|
||||
out.WriteString(in[i:])
|
||||
break
|
||||
}
|
||||
if HasPrefix(in[i:], old) {
|
||||
out.WriteString(new)
|
||||
i += len(old)
|
||||
n--
|
||||
if len(old) != 0 {
|
||||
continue
|
||||
}
|
||||
if i == len(in) {
|
||||
break
|
||||
}
|
||||
}
|
||||
if len(old) == 0 {
|
||||
_, length := utf8.DecodeRuneInString(in[i:])
|
||||
out.WriteString(in[i : i+length])
|
||||
i += length
|
||||
} else {
|
||||
out.WriteByte(in[i])
|
||||
i++
|
||||
}
|
||||
}
|
||||
if len(old) == 0 && n != 0 {
|
||||
out.WriteString(new)
|
||||
}
|
||||
return out.String()
|
||||
}
|
||||
if simple, replace := differentImpl(in, old, new, n), Replace(in, old, new, n); simple != replace {
|
||||
t.Errorf("The two implementations do not match %q != %q for Replace(%q, %q, %q, %d)", simple, replace, in, old, new, n)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
var TitleTests = []struct {
|
||||
in, out string
|
||||
}{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue