1
0

replacer_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package stringx
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestReplacer_Replace(t *testing.T) {
  7. mapping := map[string]string{
  8. "一二三四": "1234",
  9. "二三": "23",
  10. "二": "2",
  11. }
  12. assert.Equal(t, "零1234五", NewReplacer(mapping).Replace("零一二三四五"))
  13. }
  14. func TestReplacer_ReplaceJumpMatch(t *testing.T) {
  15. mapping := map[string]string{
  16. "abcdeg": "ABCDEG",
  17. "cdef": "CDEF",
  18. "cde": "CDE",
  19. }
  20. assert.Equal(t, "abCDEF", NewReplacer(mapping).Replace("abcdef"))
  21. }
  22. func TestReplacer_ReplaceOverlap(t *testing.T) {
  23. mapping := map[string]string{
  24. "3d": "34",
  25. "bc": "23",
  26. }
  27. assert.Equal(t, "a234e", NewReplacer(mapping).Replace("abcde"))
  28. }
  29. func TestReplacer_ReplaceSingleChar(t *testing.T) {
  30. mapping := map[string]string{
  31. "二": "2",
  32. }
  33. assert.Equal(t, "零一2三四五", NewReplacer(mapping).Replace("零一二三四五"))
  34. }
  35. func TestReplacer_ReplaceExceedRange(t *testing.T) {
  36. mapping := map[string]string{
  37. "二三四五六": "23456",
  38. }
  39. assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
  40. }
  41. func TestReplacer_ReplacePartialMatch(t *testing.T) {
  42. mapping := map[string]string{
  43. "二三四七": "2347",
  44. }
  45. assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
  46. }
  47. func TestReplacer_ReplacePartialMatchEnds(t *testing.T) {
  48. mapping := map[string]string{
  49. "二三四七": "2347",
  50. "三四": "34",
  51. }
  52. assert.Equal(t, "零一二34", NewReplacer(mapping).Replace("零一二三四"))
  53. }
  54. func TestReplacer_ReplaceMultiMatches(t *testing.T) {
  55. mapping := map[string]string{
  56. "二三": "23",
  57. }
  58. assert.Equal(t, "零一23四五一23四五", NewReplacer(mapping).Replace("零一二三四五一二三四五"))
  59. }
  60. func TestReplacer_ReplaceLongestMatching(t *testing.T) {
  61. keywords := map[string]string{
  62. "日本": "japan",
  63. "日本的首都": "东京",
  64. }
  65. replacer := NewReplacer(keywords)
  66. assert.Equal(t, "东京在japan", replacer.Replace("日本的首都在日本"))
  67. }
  68. func TestReplacer_ReplaceSuffixMatch(t *testing.T) {
  69. // case1
  70. {
  71. keywords := map[string]string{
  72. "abcde": "ABCDE",
  73. "bcde": "BCDE",
  74. "bcd": "BCD",
  75. }
  76. assert.Equal(t, "aBCDf", NewReplacer(keywords).Replace("abcdf"))
  77. }
  78. // case2
  79. {
  80. keywords := map[string]string{
  81. "abcde": "ABCDE",
  82. "bcde": "BCDE",
  83. "cde": "CDE",
  84. "c": "C",
  85. "cd": "CD",
  86. }
  87. assert.Equal(t, "abCDf", NewReplacer(keywords).Replace("abcdf"))
  88. }
  89. }
  90. func TestReplacer_ReplaceLongestOverlap(t *testing.T) {
  91. keywords := map[string]string{
  92. "456": "def",
  93. "abcd": "1234",
  94. }
  95. replacer := NewReplacer(keywords)
  96. assert.Equal(t, "123def7", replacer.Replace("abcd567"))
  97. }
  98. func TestReplacer_ReplaceLongestLonger(t *testing.T) {
  99. mapping := map[string]string{
  100. "c": "3",
  101. }
  102. assert.Equal(t, "3d", NewReplacer(mapping).Replace("cd"))
  103. }
  104. func TestReplacer_ReplaceJumpToFail(t *testing.T) {
  105. mapping := map[string]string{
  106. "bcdf": "1235",
  107. "cde": "234",
  108. }
  109. assert.Equal(t, "ab234fg", NewReplacer(mapping).Replace("abcdefg"))
  110. }
  111. func TestReplacer_ReplaceJumpToFailDup(t *testing.T) {
  112. mapping := map[string]string{
  113. "bcdf": "1235",
  114. "ccde": "2234",
  115. }
  116. assert.Equal(t, "ab2234fg", NewReplacer(mapping).Replace("abccdefg"))
  117. }
  118. func TestReplacer_ReplaceJumpToFailEnding(t *testing.T) {
  119. mapping := map[string]string{
  120. "bcdf": "1235",
  121. "cdef": "2345",
  122. }
  123. assert.Equal(t, "ab2345", NewReplacer(mapping).Replace("abcdef"))
  124. }
  125. func TestReplacer_ReplaceEmpty(t *testing.T) {
  126. mapping := map[string]string{
  127. "bcdf": "1235",
  128. "cdef": "2345",
  129. }
  130. assert.Equal(t, "", NewReplacer(mapping).Replace(""))
  131. }
  132. func TestFuzzReplacerCase1(t *testing.T) {
  133. keywords := map[string]string{
  134. "yQyJykiqoh": "xw",
  135. "tgN70z": "Q2P",
  136. "tXKhEn": "w1G8",
  137. "5nfOW1XZO": "GN",
  138. "f4Ov9i9nHD": "cT",
  139. "1ov9Q": "Y",
  140. "7IrC9n": "400i",
  141. "JQLxonpHkOjv": "XI",
  142. "DyHQ3c7": "Ygxux",
  143. "ffyqJi": "u",
  144. "UHuvXrbD8pni": "dN",
  145. "LIDzNbUlTX": "g",
  146. "yN9WZh2rkc8Q": "3U",
  147. "Vhk11rz8CObceC": "jf",
  148. "R0Rt4H2qChUQf": "7U5M",
  149. "MGQzzPCVKjV9": "yYz",
  150. "B5jUUl0u1XOY": "l4PZ",
  151. "pdvp2qfLgG8X": "BM562",
  152. "ZKl9qdApXJ2": "T",
  153. "37jnugkSevU66": "aOHFX",
  154. }
  155. rep := NewReplacer(keywords)
  156. text := "yjF8fyqJiiqrczOCVyoYbLvrMpnkj"
  157. val := rep.Replace(text)
  158. keys := rep.(*replacer).node.find([]rune(val))
  159. if len(keys) > 0 {
  160. t.Errorf("result: %s, match: %v", val, keys)
  161. }
  162. }
  163. func TestFuzzReplacerCase2(t *testing.T) {
  164. keywords := map[string]string{
  165. "dmv2SGZvq9Yz": "TE",
  166. "rCL5DRI9uFP8": "hvsc8",
  167. "7pSA2jaomgg": "v",
  168. "kWSQvjVOIAxR": "Oje",
  169. "hgU5bYYkD3r6": "qCXu",
  170. "0eh6uI": "MMlt",
  171. "3USZSl85EKeMzw": "Pc",
  172. "JONmQSuXa": "dX",
  173. "EO1WIF": "G",
  174. "uUmFJGVmacjF": "1N",
  175. "DHpw7": "M",
  176. "NYB2bm": "CPya",
  177. "9FiNvBAHHNku5": "7FlDE",
  178. "tJi3I4WxcY": "q5",
  179. "sNJ8Z1ToBV0O": "tl",
  180. "0iOg72QcPo": "RP",
  181. "pSEqeL": "5KZ",
  182. "GOyYqTgmvQ": "9",
  183. "Qv4qCsj": "nl52E",
  184. "wNQ5tOutYu5s8": "6iGa",
  185. }
  186. rep := NewReplacer(keywords)
  187. text := "AoRxrdKWsGhFpXwVqMLWRL74OukwjBuBh0g7pSrk"
  188. val := rep.Replace(text)
  189. keys := rep.(*replacer).node.find([]rune(val))
  190. if len(keys) > 0 {
  191. t.Errorf("result: %s, match: %v", val, keys)
  192. }
  193. }
  194. func TestReplacer_ReplaceLongestMatch(t *testing.T) {
  195. replacer := NewReplacer(map[string]string{
  196. "日本的首都": "东京",
  197. "日本": "本日",
  198. })
  199. assert.Equal(t, "东京是东京", replacer.Replace("日本的首都是东京"))
  200. }
  201. func TestReplacer_ReplaceIndefinitely(t *testing.T) {
  202. mapping := map[string]string{
  203. "日本的首都": "东京",
  204. "东京": "日本的首都",
  205. }
  206. assert.NotPanics(t, func() {
  207. NewReplacer(mapping).Replace("日本的首都是东京")
  208. })
  209. }