]> Cypherpunks repositories - gostls13.git/commitdiff
strings: add FuzzReplace test
authorJorropo <jorropo.pgm@gmail.com>
Fri, 14 Mar 2025 20:29:08 +0000 (21:29 +0100)
committerGopher Robot <gobot@golang.org>
Sat, 15 Mar 2025 20:13:56 +0000 (13:13 -0700)
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>
src/strings/strings_test.go

index 806738066470198326f0c4ce2e805eb628f68e1a..aa3458c5c9287e3a2eea5d4dff0b818f3c4d47be 100644 (file)
@@ -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
 }{