diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-13 19:01:22 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-13 19:01:22 -0600 |
commit | a0fc940be0ea888c7b380cd95723da65bbd32bcb (patch) | |
tree | c332cd95de9c882d23728e9fe040e63c97ff007f /lib/kmp/kmp_test.go | |
parent | ae84737c1bc0a5e137e1a25d7344f2ab8e420489 (diff) |
Implement KMP string search
Diffstat (limited to 'lib/kmp/kmp_test.go')
-rw-r--r-- | lib/kmp/kmp_test.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/kmp/kmp_test.go b/lib/kmp/kmp_test.go new file mode 100644 index 0000000..6a11b50 --- /dev/null +++ b/lib/kmp/kmp_test.go @@ -0,0 +1,62 @@ +// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com> +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package kmp + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBuildTable(t *testing.T) { + substr := []byte("ababaa") + table := buildTable(substr) + assert.Equal(t, + []int{0, 0, 1, 2, 3, 1}, + table) + for j, val := range table { + matchLen := j + 1 + assert.Equalf(t, substr[:val], substr[matchLen-val:matchLen], + "for table[%d]=%d", j, val) + } +} + +func FuzzBuildTable(f *testing.F) { + f.Add([]byte("ababaa")) + f.Fuzz(func(t *testing.T, substr []byte) { + table := buildTable(substr) + assert.Equal(t, len(substr), len(table), "length") + for j, val := range table { + matchLen := j + 1 + assert.Equalf(t, substr[:val], substr[matchLen-val:matchLen], + "for table[%d]=%d", j, val) + } + }) +} + +func NaiveFindAll(str, substr []byte) []int64 { + var matches []int64 + for i := range str { + if bytes.HasPrefix(str[i:], substr) { + matches = append(matches, int64(i)) + } + } + return matches +} + +func FuzzFindAll(f *testing.F) { + f.Fuzz(func(t *testing.T, str, substr []byte) { + if len(substr) == 0 { + t.Skip() + } + t.Logf("str =%q", str) + t.Logf("substr=%q", substr) + exp := NaiveFindAll(str, substr) + act, err := FindAll(bytes.NewReader(str), substr) + assert.NoError(t, err) + assert.Equal(t, exp, act) + }) +} |