package stringx import ( "testing" "github.com/stretchr/testify/assert" ) func TestReplacer_Replace(t *testing.T) { mapping := map[string]string{ "一二三四": "1234", "二三": "23", "二": "2", } assert.Equal(t, "零1234五", NewReplacer(mapping).Replace("零一二三四五")) } func TestReplacer_ReplaceJumpMatch(t *testing.T) { mapping := map[string]string{ "abcdeg": "ABCDEG", "cdef": "CDEF", "cde": "CDE", } assert.Equal(t, "abCDEF", NewReplacer(mapping).Replace("abcdef")) } func TestReplacer_ReplaceOverlap(t *testing.T) { mapping := map[string]string{ "3d": "34", "bc": "23", } assert.Equal(t, "a234e", NewReplacer(mapping).Replace("abcde")) } func TestReplacer_ReplaceSingleChar(t *testing.T) { mapping := map[string]string{ "二": "2", } assert.Equal(t, "零一2三四五", NewReplacer(mapping).Replace("零一二三四五")) } func TestReplacer_ReplaceExceedRange(t *testing.T) { mapping := map[string]string{ "二三四五六": "23456", } assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五")) } func TestReplacer_ReplacePartialMatch(t *testing.T) { mapping := map[string]string{ "二三四七": "2347", } assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五")) } func TestReplacer_ReplacePartialMatchEnds(t *testing.T) { mapping := map[string]string{ "二三四七": "2347", "三四": "34", } assert.Equal(t, "零一二34", NewReplacer(mapping).Replace("零一二三四")) } func TestReplacer_ReplaceMultiMatches(t *testing.T) { mapping := map[string]string{ "二三": "23", } assert.Equal(t, "零一23四五一23四五", NewReplacer(mapping).Replace("零一二三四五一二三四五")) } func TestReplacer_ReplaceLongestMatching(t *testing.T) { keywords := map[string]string{ "日本": "japan", "日本的首都": "东京", } replacer := NewReplacer(keywords) assert.Equal(t, "东京在japan", replacer.Replace("日本的首都在日本")) } func TestReplacer_ReplaceSuffixMatch(t *testing.T) { // case1 { keywords := map[string]string{ "abcde": "ABCDE", "bcde": "BCDE", "bcd": "BCD", } assert.Equal(t, "aBCDf", NewReplacer(keywords).Replace("abcdf")) } // case2 { keywords := map[string]string{ "abcde": "ABCDE", "bcde": "BCDE", "cde": "CDE", "c": "C", "cd": "CD", } assert.Equal(t, "abCDf", NewReplacer(keywords).Replace("abcdf")) } } func TestReplacer_ReplaceLongestOverlap(t *testing.T) { keywords := map[string]string{ "456": "def", "abcd": "1234", } replacer := NewReplacer(keywords) assert.Equal(t, "123def7", replacer.Replace("abcd567")) } func TestReplacer_ReplaceLongestLonger(t *testing.T) { mapping := map[string]string{ "c": "3", } assert.Equal(t, "3d", NewReplacer(mapping).Replace("cd")) } func TestReplacer_ReplaceJumpToFail(t *testing.T) { mapping := map[string]string{ "bcdf": "1235", "cde": "234", } assert.Equal(t, "ab234fg", NewReplacer(mapping).Replace("abcdefg")) } func TestReplacer_ReplaceJumpToFailDup(t *testing.T) { mapping := map[string]string{ "bcdf": "1235", "ccde": "2234", } assert.Equal(t, "ab2234fg", NewReplacer(mapping).Replace("abccdefg")) } func TestReplacer_ReplaceJumpToFailEnding(t *testing.T) { mapping := map[string]string{ "bcdf": "1235", "cdef": "2345", } assert.Equal(t, "ab2345", NewReplacer(mapping).Replace("abcdef")) } func TestReplacer_ReplaceEmpty(t *testing.T) { mapping := map[string]string{ "bcdf": "1235", "cdef": "2345", } assert.Equal(t, "", NewReplacer(mapping).Replace("")) } func TestFuzzReplacerCase1(t *testing.T) { keywords := map[string]string{ "yQyJykiqoh": "xw", "tgN70z": "Q2P", "tXKhEn": "w1G8", "5nfOW1XZO": "GN", "f4Ov9i9nHD": "cT", "1ov9Q": "Y", "7IrC9n": "400i", "JQLxonpHkOjv": "XI", "DyHQ3c7": "Ygxux", "ffyqJi": "u", "UHuvXrbD8pni": "dN", "LIDzNbUlTX": "g", "yN9WZh2rkc8Q": "3U", "Vhk11rz8CObceC": "jf", "R0Rt4H2qChUQf": "7U5M", "MGQzzPCVKjV9": "yYz", "B5jUUl0u1XOY": "l4PZ", "pdvp2qfLgG8X": "BM562", "ZKl9qdApXJ2": "T", "37jnugkSevU66": "aOHFX", } rep := NewReplacer(keywords) text := "yjF8fyqJiiqrczOCVyoYbLvrMpnkj" val := rep.Replace(text) keys := rep.(*replacer).node.find([]rune(val)) if len(keys) > 0 { t.Errorf("result: %s, match: %v", val, keys) } } func TestFuzzReplacerCase2(t *testing.T) { keywords := map[string]string{ "dmv2SGZvq9Yz": "TE", "rCL5DRI9uFP8": "hvsc8", "7pSA2jaomgg": "v", "kWSQvjVOIAxR": "Oje", "hgU5bYYkD3r6": "qCXu", "0eh6uI": "MMlt", "3USZSl85EKeMzw": "Pc", "JONmQSuXa": "dX", "EO1WIF": "G", "uUmFJGVmacjF": "1N", "DHpw7": "M", "NYB2bm": "CPya", "9FiNvBAHHNku5": "7FlDE", "tJi3I4WxcY": "q5", "sNJ8Z1ToBV0O": "tl", "0iOg72QcPo": "RP", "pSEqeL": "5KZ", "GOyYqTgmvQ": "9", "Qv4qCsj": "nl52E", "wNQ5tOutYu5s8": "6iGa", } rep := NewReplacer(keywords) text := "AoRxrdKWsGhFpXwVqMLWRL74OukwjBuBh0g7pSrk" val := rep.Replace(text) keys := rep.(*replacer).node.find([]rune(val)) if len(keys) > 0 { t.Errorf("result: %s, match: %v", val, keys) } } func TestReplacer_ReplaceLongestMatch(t *testing.T) { replacer := NewReplacer(map[string]string{ "日本的首都": "东京", "日本": "本日", }) assert.Equal(t, "东京是东京", replacer.Replace("日本的首都是东京")) } func TestReplacer_ReplaceIndefinitely(t *testing.T) { mapping := map[string]string{ "日本的首都": "东京", "东京": "日本的首都", } assert.NotPanics(t, func() { NewReplacer(mapping).Replace("日本的首都是东京") }) }