github.com/lingyao2333/mo-zero@v1.4.1/core/stringx/trie_test.go (about) 1 package stringx 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 func TestTrieSimple(t *testing.T) { 10 trie := NewTrie([]string{ 11 "bc", 12 "cd", 13 }) 14 output, keywords, found := trie.Filter("abcd") 15 assert.True(t, found) 16 assert.Equal(t, "a***", output) 17 assert.ElementsMatch(t, []string{"bc", "cd"}, keywords) 18 } 19 20 func TestTrie(t *testing.T) { 21 tests := []struct { 22 input string 23 output string 24 keywords []string 25 found bool 26 }{ 27 { 28 input: "日本AV演员兼电视、电影演员。无名氏AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演", 29 output: "日本****兼电视、电影演员。*****女优是xx出道, ******们最精彩的表演是******表演", 30 keywords: []string{ 31 "AV演员", 32 "无名氏", 33 "AV", 34 "日本AV女优", 35 "AV演员色情", 36 }, 37 found: true, 38 }, 39 { 40 input: "完全和谐的文本完全和谐的文本", 41 output: "完全和谐的文本完全和谐的文本", 42 keywords: nil, 43 found: false, 44 }, 45 { 46 input: "就一个字不对", 47 output: "就*个字不对", 48 keywords: []string{ 49 "一", 50 }, 51 found: true, 52 }, 53 { 54 input: "就一对, AV", 55 output: "就*对, **", 56 keywords: []string{ 57 "一", 58 "AV", 59 }, 60 found: true, 61 }, 62 { 63 input: "就一不对, AV", 64 output: "就**对, **", 65 keywords: []string{ 66 "一", 67 "一不", 68 "AV", 69 }, 70 found: true, 71 }, 72 { 73 input: "就对, AV", 74 output: "就对, **", 75 keywords: []string{ 76 "AV", 77 }, 78 found: true, 79 }, 80 { 81 input: "就对, 一不", 82 output: "就对, **", 83 keywords: []string{ 84 "一", 85 "一不", 86 }, 87 found: true, 88 }, 89 { 90 input: "", 91 output: "", 92 keywords: nil, 93 found: false, 94 }, 95 } 96 97 trie := NewTrie([]string{ 98 "", // no hurts for empty keywords 99 "一", 100 "一不", 101 "AV", 102 "AV演员", 103 "无名氏", 104 "AV演员色情", 105 "日本AV女优", 106 }) 107 108 for _, test := range tests { 109 t.Run(test.input, func(t *testing.T) { 110 output, keywords, ok := trie.Filter(test.input) 111 assert.Equal(t, test.found, ok) 112 assert.Equal(t, test.output, output) 113 assert.ElementsMatch(t, test.keywords, keywords) 114 keywords = trie.FindKeywords(test.input) 115 assert.ElementsMatch(t, test.keywords, keywords) 116 }) 117 } 118 } 119 120 func TestTrieSingleWord(t *testing.T) { 121 trie := NewTrie([]string{ 122 "闹", 123 }, WithMask('#')) 124 output, keywords, ok := trie.Filter("今晚真热闹") 125 assert.ElementsMatch(t, []string{"闹"}, keywords) 126 assert.True(t, ok) 127 assert.Equal(t, "今晚真热#", output) 128 } 129 130 func TestTrieOverlap(t *testing.T) { 131 trie := NewTrie([]string{ 132 "一二三四五", 133 "二三四五六七八", 134 }, WithMask('#')) 135 output, keywords, ok := trie.Filter("零一二三四五六七八九十") 136 assert.ElementsMatch(t, []string{ 137 "一二三四五", 138 "二三四五六七八", 139 }, keywords) 140 assert.True(t, ok) 141 assert.Equal(t, "零########九十", output) 142 } 143 144 func TestTrieNested(t *testing.T) { 145 trie := NewTrie([]string{ 146 "一二三", 147 "一二三四五", 148 "一二三四五六七八", 149 }, WithMask('#')) 150 output, keywords, ok := trie.Filter("零一二三四五六七八九十") 151 assert.ElementsMatch(t, []string{ 152 "一二三", 153 "一二三四五", 154 "一二三四五六七八", 155 }, keywords) 156 assert.True(t, ok) 157 assert.Equal(t, "零########九十", output) 158 }