replacer_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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_ReplaceJumpToFail(t *testing.T) {
  46. mapping := map[string]string{
  47. "bcdf": "1235",
  48. "cde": "234",
  49. }
  50. assert.Equal(t, "ab234fg", NewReplacer(mapping).Replace("abcdefg"))
  51. }
  52. func TestReplacer_ReplaceJumpToFailDup(t *testing.T) {
  53. mapping := map[string]string{
  54. "bcdf": "1235",
  55. "ccde": "2234",
  56. }
  57. assert.Equal(t, "ab2234fg", NewReplacer(mapping).Replace("abccdefg"))
  58. }
  59. func TestReplacer_ReplaceJumpToFailEnding(t *testing.T) {
  60. mapping := map[string]string{
  61. "bcdf": "1235",
  62. "cdef": "2345",
  63. }
  64. assert.Equal(t, "ab2345", NewReplacer(mapping).Replace("abcdef"))
  65. }
  66. func TestReplacer_ReplaceEmpty(t *testing.T) {
  67. mapping := map[string]string{
  68. "bcdf": "1235",
  69. "cdef": "2345",
  70. }
  71. assert.Equal(t, "", NewReplacer(mapping).Replace(""))
  72. }
  73. func TestFuzzReplacerCase1(t *testing.T) {
  74. keywords := map[string]string{
  75. "yQyJykiqoh": "xw",
  76. "tgN70z": "Q2P",
  77. "tXKhEn": "w1G8",
  78. "5nfOW1XZO": "GN",
  79. "f4Ov9i9nHD": "cT",
  80. "1ov9Q": "Y",
  81. "7IrC9n": "400i",
  82. "JQLxonpHkOjv": "XI",
  83. "DyHQ3c7": "Ygxux",
  84. "ffyqJi": "u",
  85. "UHuvXrbD8pni": "dN",
  86. "LIDzNbUlTX": "g",
  87. "yN9WZh2rkc8Q": "3U",
  88. "Vhk11rz8CObceC": "jf",
  89. "R0Rt4H2qChUQf": "7U5M",
  90. "MGQzzPCVKjV9": "yYz",
  91. "B5jUUl0u1XOY": "l4PZ",
  92. "pdvp2qfLgG8X": "BM562",
  93. "ZKl9qdApXJ2": "T",
  94. "37jnugkSevU66": "aOHFX",
  95. }
  96. rep := NewReplacer(keywords)
  97. text := "yjF8fyqJiiqrczOCVyoYbLvrMpnkj"
  98. val := rep.Replace(text)
  99. keys := rep.(*replacer).node.find([]rune(val))
  100. if len(keys) > 0 {
  101. t.Errorf("result: %s, match: %v", val, keys)
  102. }
  103. }
  104. func TestFuzzReplacerCase2(t *testing.T) {
  105. keywords := map[string]string{
  106. "dmv2SGZvq9Yz": "TE",
  107. "rCL5DRI9uFP8": "hvsc8",
  108. "7pSA2jaomgg": "v",
  109. "kWSQvjVOIAxR": "Oje",
  110. "hgU5bYYkD3r6": "qCXu",
  111. "0eh6uI": "MMlt",
  112. "3USZSl85EKeMzw": "Pc",
  113. "JONmQSuXa": "dX",
  114. "EO1WIF": "G",
  115. "uUmFJGVmacjF": "1N",
  116. "DHpw7": "M",
  117. "NYB2bm": "CPya",
  118. "9FiNvBAHHNku5": "7FlDE",
  119. "tJi3I4WxcY": "q5",
  120. "sNJ8Z1ToBV0O": "tl",
  121. "0iOg72QcPo": "RP",
  122. "pSEqeL": "5KZ",
  123. "GOyYqTgmvQ": "9",
  124. "Qv4qCsj": "nl52E",
  125. "wNQ5tOutYu5s8": "6iGa",
  126. }
  127. rep := NewReplacer(keywords)
  128. text := "AoRxrdKWsGhFpXwVqMLWRL74OukwjBuBh0g7pSrk"
  129. val := rep.Replace(text)
  130. keys := rep.(*replacer).node.find([]rune(val))
  131. if len(keys) > 0 {
  132. t.Errorf("result: %s, match: %v", val, keys)
  133. }
  134. }