node_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package stringx
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestLongestMatchGuardedCondition(t *testing.T) {
  7. n := new(node)
  8. n.end = true
  9. used, jump, matched := n.longestMatch([]rune(""), 0)
  10. assert.Equal(t, 0, used)
  11. assert.Nil(t, jump)
  12. assert.True(t, matched)
  13. }
  14. func TestFuzzNodeCase1(t *testing.T) {
  15. keywords := []string{
  16. "cs8Zh",
  17. "G1OihlVuBz",
  18. "K6azS2FBHjI",
  19. "DQKvghI4",
  20. "l7bA86Sze",
  21. "tjBLZhCao",
  22. "nEsXmVzP",
  23. "cbRh8UE1nO3s",
  24. "Wta3R2WcbGP",
  25. "jpOIcA",
  26. "TtkRr4k9hI",
  27. "OKbSo0clAYTtk",
  28. "uJs1WToEanlKV",
  29. "05Y02iFD2",
  30. "x2uJs1WToEanlK",
  31. "ieaSWe",
  32. "Kg",
  33. "FD2bCKFazH",
  34. }
  35. scopes := []scope{
  36. {62, 72},
  37. {52, 65},
  38. {21, 34},
  39. {1, 10},
  40. {19, 33},
  41. {36, 42},
  42. {42, 44},
  43. {7, 17},
  44. }
  45. n := new(node)
  46. for _, key := range keywords {
  47. n.add(key)
  48. }
  49. n.build()
  50. assert.ElementsMatch(t, scopes, n.find([]rune("Z05Y02iFD2bCKFazHtrx2uJs1WToEanlKVWKieaSWeKgmnUXV0ZjOKbSo0clAYTtkRr4k9hI")))
  51. }
  52. func TestFuzzNodeCase2(t *testing.T) {
  53. keywords := []string{
  54. "IP1NPsJKIvt",
  55. "Iw7hQARwSTw",
  56. "SmZIcA",
  57. "OyxHPYkoQzFO",
  58. "3suCnuSAS5d",
  59. "HUMpbi",
  60. "HPdvbGGpY",
  61. "49qjMtR8bEt",
  62. "a0zrrGKVTJ2",
  63. "WbOBcszeo1FfZ",
  64. "8tHUi5PJI",
  65. "Oa2Di",
  66. "6ZWa5nr1tU",
  67. "o0LJRfmeXB9bF9",
  68. "veF0ehKxH",
  69. "Qp73r",
  70. "B6Rmds4ELY8",
  71. "uNpGybQZG",
  72. "Ogm3JqicRZlA4n",
  73. "FL6LVErKomc84H",
  74. "qv2Pi0xJj3cR1",
  75. "bPWLBg4",
  76. "hYN8Q4M1sw",
  77. "ExkTgNklmlIx",
  78. "eVgHHDOxOUEj",
  79. "5WPEVv0tR",
  80. "CPjnOAqUZgV",
  81. "oR3Ogtz",
  82. "jwk1Zbg",
  83. "DYqguyk8h",
  84. "rieroDmpvYFK",
  85. "MQ9hZnMjDqrNQe",
  86. "EhM4KqkCBd",
  87. "m9xalj6q",
  88. "d5CTL5mzK",
  89. "XJOoTvFtI8U",
  90. "iFAwspJ",
  91. "iGv8ErnRZIuSWX",
  92. "i8C1BqsYX",
  93. "vXN1KOaOgU",
  94. "GHJFB",
  95. "Y6OlAqbZxYG8",
  96. "dzd4QscSih4u",
  97. "SsLYMkKvB9APx",
  98. "gi0huB3",
  99. "CMICHDCSvSrgiACXVkN",
  100. "MwOvyHbaxdaqpZpU",
  101. "wOvyHbaxdaqpZpUbI",
  102. "2TT5WEy",
  103. "eoCq0T2MC",
  104. "ZpUbI7",
  105. "oCq0T2MCp",
  106. "CpLFgLg0g",
  107. "FgLg0gh",
  108. "w5awC5HeoCq",
  109. "1c",
  110. }
  111. scopes := []scope{
  112. {0, 19},
  113. {57, 73},
  114. {58, 75},
  115. {47, 54},
  116. {29, 38},
  117. {70, 76},
  118. {30, 39},
  119. {37, 46},
  120. {40, 47},
  121. {22, 33},
  122. {92, 94},
  123. }
  124. n := new(node)
  125. for _, key := range keywords {
  126. n.add(key)
  127. }
  128. n.build()
  129. assert.ElementsMatch(t, scopes, n.find([]rune("CMICHDCSvSrgiACXVkNF9lw5awC5HeoCq0T2MCpLFgLg0gh2TT5WEyINrMwOvyHbaxdaqpZpUbI7SpIY5yVWf33MuX7K1c")))
  130. }
  131. func TestFuzzNodeCase3(t *testing.T) {
  132. keywords := []string{
  133. "QAraACKOftI4",
  134. "unRmd2EO0",
  135. "s25OtuoU",
  136. "aGlmn7KnbE4HCX",
  137. "kuK6Uh",
  138. "ckuK6Uh",
  139. "uK6Uh",
  140. "Iy",
  141. "h",
  142. "PMSSUNvyi",
  143. "ahz0i",
  144. "Lhs4XZ1e",
  145. "shPp1Va7aQNVme",
  146. "yIUckuK6Uh",
  147. "pKjIyI",
  148. "jIyIUckuK6Uh",
  149. "UckuK6Uh",
  150. "Uh",
  151. "JPAULjQgHJ",
  152. "Wp",
  153. "sbkZxXurrI",
  154. "pKjIyIUckuK6Uh",
  155. }
  156. scopes := []scope{
  157. {9, 15},
  158. {8, 15},
  159. {5, 15},
  160. {1, 7},
  161. {10, 15},
  162. {3, 15},
  163. {0, 2},
  164. {1, 15},
  165. {7, 15},
  166. {13, 15},
  167. {4, 6},
  168. {14, 15},
  169. }
  170. n := new(node)
  171. for _, key := range keywords {
  172. n.add(key)
  173. }
  174. n.build()
  175. assert.ElementsMatch(t, scopes, n.find([]rune("WpKjIyIUckuK6Uh")))
  176. }
  177. func BenchmarkNodeFind(b *testing.B) {
  178. b.ReportAllocs()
  179. keywords := []string{
  180. "A",
  181. "AV",
  182. "AV演员",
  183. "无名氏",
  184. "AV演员色情",
  185. "日本AV女优",
  186. }
  187. trie := new(node)
  188. for _, keyword := range keywords {
  189. trie.add(keyword)
  190. }
  191. trie.build()
  192. for i := 0; i < b.N; i++ {
  193. trie.find([]rune("日本AV演员兼电视、电影演员。无名氏AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演"))
  194. }
  195. }