node_fuzz_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //go:build go1.18
  2. // +build go1.18
  3. package stringx
  4. import (
  5. "fmt"
  6. "math/rand"
  7. "strings"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func FuzzNodeFind(f *testing.F) {
  13. rand.Seed(time.Now().UnixNano())
  14. f.Add(10)
  15. f.Fuzz(func(t *testing.T, keys int) {
  16. str := Randn(rand.Intn(100) + 50)
  17. keywords := make(map[string]struct{})
  18. for i := 0; i < keys; i++ {
  19. keyword := Randn(rand.Intn(10) + 5)
  20. if !strings.Contains(str, keyword) {
  21. keywords[keyword] = struct{}{}
  22. }
  23. }
  24. size := len(str)
  25. var scopes []scope
  26. var n node
  27. for i := 0; i < size%20; i++ {
  28. start := rand.Intn(size)
  29. stop := start + rand.Intn(20) + 1
  30. if stop > size {
  31. stop = size
  32. }
  33. if start == stop {
  34. continue
  35. }
  36. keyword := str[start:stop]
  37. if _, ok := keywords[keyword]; ok {
  38. continue
  39. }
  40. keywords[keyword] = struct{}{}
  41. var pos int
  42. for pos <= len(str)-len(keyword) {
  43. val := str[pos:]
  44. p := strings.Index(val, keyword)
  45. if p < 0 {
  46. break
  47. }
  48. scopes = append(scopes, scope{
  49. start: pos + p,
  50. stop: pos + p + len(keyword),
  51. })
  52. pos += p + 1
  53. }
  54. }
  55. for keyword := range keywords {
  56. n.add(keyword)
  57. }
  58. n.build()
  59. var buf strings.Builder
  60. buf.WriteString("keywords:\n")
  61. for key := range keywords {
  62. fmt.Fprintf(&buf, "\t%q,\n", key)
  63. }
  64. buf.WriteString("scopes:\n")
  65. for _, scp := range scopes {
  66. fmt.Fprintf(&buf, "\t{%d, %d},\n", scp.start, scp.stop)
  67. }
  68. fmt.Fprintf(&buf, "text:\n\t%s\n", str)
  69. defer func() {
  70. if r := recover(); r != nil {
  71. t.Errorf(buf.String())
  72. }
  73. }()
  74. assert.ElementsMatchf(t, scopes, n.find([]rune(str)), buf.String())
  75. })
  76. }