replacer_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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_ReplaceOverlap(t *testing.T) {
  15. mapping := map[string]string{
  16. "3d": "34",
  17. "bc": "23",
  18. }
  19. assert.Equal(t, "a234e", NewReplacer(mapping).Replace("abcde"))
  20. }
  21. func TestReplacer_ReplaceSingleChar(t *testing.T) {
  22. mapping := map[string]string{
  23. "二": "2",
  24. }
  25. assert.Equal(t, "零一2三四五", NewReplacer(mapping).Replace("零一二三四五"))
  26. }
  27. func TestReplacer_ReplaceExceedRange(t *testing.T) {
  28. mapping := map[string]string{
  29. "二三四五六": "23456",
  30. }
  31. assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
  32. }
  33. func TestReplacer_ReplacePartialMatch(t *testing.T) {
  34. mapping := map[string]string{
  35. "二三四七": "2347",
  36. }
  37. assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
  38. }
  39. func TestReplacer_ReplaceMultiMatches(t *testing.T) {
  40. mapping := map[string]string{
  41. "二三": "23",
  42. }
  43. assert.Equal(t, "零一23四五一23四五", NewReplacer(mapping).Replace("零一二三四五一二三四五"))
  44. }
  45. func TestReplacer_ReplaceLongestMatching(t *testing.T) {
  46. keywords := map[string]string{
  47. "日本": "japan",
  48. "日本的首都": "东京",
  49. }
  50. replacer := NewReplacer(keywords)
  51. assert.Equal(t, "东京在japan", replacer.Replace("日本的首都在日本"))
  52. }
  53. func TestReplacer_ReplaceLongestOverlap(t *testing.T) {
  54. keywords := map[string]string{
  55. "456": "def",
  56. "abcd": "1234",
  57. }
  58. replacer := NewReplacer(keywords)
  59. assert.Equal(t, "123def7", replacer.Replace("abcd567"))
  60. }
  61. func TestReplacer_ReplaceLongestLonger(t *testing.T) {
  62. mapping := map[string]string{
  63. "c": "3",
  64. }
  65. assert.Equal(t, "3d", NewReplacer(mapping).Replace("cd"))
  66. }
  67. func TestReplacer_ReplaceJumpToFail(t *testing.T) {
  68. mapping := map[string]string{
  69. "bcdf": "1235",
  70. "cde": "234",
  71. }
  72. assert.Equal(t, "ab234fg", NewReplacer(mapping).Replace("abcdefg"))
  73. }
  74. func TestReplacer_ReplaceJumpToFailDup(t *testing.T) {
  75. mapping := map[string]string{
  76. "bcdf": "1235",
  77. "ccde": "2234",
  78. }
  79. assert.Equal(t, "ab2234fg", NewReplacer(mapping).Replace("abccdefg"))
  80. }
  81. func TestReplacer_ReplaceJumpToFailEnding(t *testing.T) {
  82. mapping := map[string]string{
  83. "bcdf": "1235",
  84. "cdef": "2345",
  85. }
  86. assert.Equal(t, "ab2345", NewReplacer(mapping).Replace("abcdef"))
  87. }
  88. func TestReplacer_ReplaceEmpty(t *testing.T) {
  89. mapping := map[string]string{
  90. "bcdf": "1235",
  91. "cdef": "2345",
  92. }
  93. assert.Equal(t, "", NewReplacer(mapping).Replace(""))
  94. }
  95. func TestFuzzReplacerCase1(t *testing.T) {
  96. keywords := map[string]string{
  97. "yQyJykiqoh": "xw",
  98. "tgN70z": "Q2P",
  99. "tXKhEn": "w1G8",
  100. "5nfOW1XZO": "GN",
  101. "f4Ov9i9nHD": "cT",
  102. "1ov9Q": "Y",
  103. "7IrC9n": "400i",
  104. "JQLxonpHkOjv": "XI",
  105. "DyHQ3c7": "Ygxux",
  106. "ffyqJi": "u",
  107. "UHuvXrbD8pni": "dN",
  108. "LIDzNbUlTX": "g",
  109. "yN9WZh2rkc8Q": "3U",
  110. "Vhk11rz8CObceC": "jf",
  111. "R0Rt4H2qChUQf": "7U5M",
  112. "MGQzzPCVKjV9": "yYz",
  113. "B5jUUl0u1XOY": "l4PZ",
  114. "pdvp2qfLgG8X": "BM562",
  115. "ZKl9qdApXJ2": "T",
  116. "37jnugkSevU66": "aOHFX",
  117. }
  118. rep := NewReplacer(keywords)
  119. text := "yjF8fyqJiiqrczOCVyoYbLvrMpnkj"
  120. val := rep.Replace(text)
  121. keys := rep.(*replacer).node.find([]rune(val))
  122. if len(keys) > 0 {
  123. t.Errorf("result: %s, match: %v", val, keys)
  124. }
  125. }
  126. func TestFuzzReplacerCase2(t *testing.T) {
  127. keywords := map[string]string{
  128. "dmv2SGZvq9Yz": "TE",
  129. "rCL5DRI9uFP8": "hvsc8",
  130. "7pSA2jaomgg": "v",
  131. "kWSQvjVOIAxR": "Oje",
  132. "hgU5bYYkD3r6": "qCXu",
  133. "0eh6uI": "MMlt",
  134. "3USZSl85EKeMzw": "Pc",
  135. "JONmQSuXa": "dX",
  136. "EO1WIF": "G",
  137. "uUmFJGVmacjF": "1N",
  138. "DHpw7": "M",
  139. "NYB2bm": "CPya",
  140. "9FiNvBAHHNku5": "7FlDE",
  141. "tJi3I4WxcY": "q5",
  142. "sNJ8Z1ToBV0O": "tl",
  143. "0iOg72QcPo": "RP",
  144. "pSEqeL": "5KZ",
  145. "GOyYqTgmvQ": "9",
  146. "Qv4qCsj": "nl52E",
  147. "wNQ5tOutYu5s8": "6iGa",
  148. }
  149. rep := NewReplacer(keywords)
  150. text := "AoRxrdKWsGhFpXwVqMLWRL74OukwjBuBh0g7pSrk"
  151. val := rep.Replace(text)
  152. keys := rep.(*replacer).node.find([]rune(val))
  153. if len(keys) > 0 {
  154. t.Errorf("result: %s, match: %v", val, keys)
  155. }
  156. }