replacer_test.go 3.9 KB

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