node_fuzz_test.go 1.6 KB

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